-
1.gitignore
-
8.idea/.gitignore
-
672025年6月11日学习记录.md
-
666-12_李慧学习记录.md
-
2446-13_李慧学习报告.md
-
1316-15_李慧学习记录.md
-
1316-16股票学习.md
-
BINGO学习/assets/day1/image-20250613150030868.png
-
BINGO学习/assets/day1/image-20250613150121048.png
-
BINGO学习/assets/day1/image-20250613150428962.png
-
338GO学习/day1.md
-
170GO学习/day2.md
-
14GO学习/day3.md
-
193GO学习/day4.md
-
39GO学习/day5.md
-
85GO学习/day6.md
-
BINassets/6-16股票学习/image-20250616114324156.png
-
BINassets/bug整合/image-20250616151136378.png
-
BINassets/bug整合/image-20250616151655365.png
-
BINassets/bug整合/image-20250616151742936.png
-
BINassets/bug整合/image-20250616152258295.png
-
BINassets/bug整合/image-20250616152400758.png
-
BINassets/bug整合/image-20250616152807365.png
-
BINassets/bug整合/image-20250616155429118.png
-
BINassets/bug整合/image-20250616160256738.png
-
BINassets/bug整合/image-20250616160619946.png
-
BINassets/bug整合/image-20250616160719841.png
-
BINassets/bug整合/image-20250616160810089.png
-
BINassets/bug整合/image-20250616160835142.png
-
BINassets/bug整合/image-20250616160917949.png
-
BINassets/bug整合/image-20250616162052420.png
-
162bug整合.md
@ -0,0 +1 @@ |
|||
*.pdf |
@ -0,0 +1,8 @@ |
|||
# 默认忽略的文件 |
|||
/shelf/ |
|||
/workspace.xml |
|||
# 基于编辑器的 HTTP 客户端请求 |
|||
/httpRequests/ |
|||
# Datasource local storage ignored files |
|||
/dataSources/ |
|||
/dataSources.local.xml |
@ -0,0 +1,67 @@ |
|||
# 学习总结 |
|||
|
|||
## 证券的定义 |
|||
证券是多种经济权益凭证的统称,用来证明证券持有人有权按其券面所载内容取得应有的权益的凭证。 |
|||
|
|||
分为证据证券、凭证证券、有价证券 |
|||
|
|||
我们通常所说的证券是指有价证券。 |
|||
|
|||
证券市场指的是所有证券发行和交易的场所 |
|||
|
|||
## 什么是股票 |
|||
是一种凭证,股票是一种有价证券,它是上市公司为了筹集资金向其出资人发行的一种证明其股东所持有股份的凭证。 |
|||
|
|||
## 股票市场有何作用 |
|||
筹资,定价和资本配置三个作用。 |
|||
|
|||
## 证券公司是干什么的 |
|||
为股民买卖股票提供交易通道的地方,但是并非所有的证券公司都可以买卖股票 |
|||
|
|||
## 股票的五大特性 |
|||
风险性、收益性、流通性、波动性、永久性 |
|||
|
|||
收益性是股票最基本的特征 |
|||
|
|||
股票的收益来源分为两类,股份公司和股票流通 |
|||
|
|||
判断流动性强弱主要分析三个方面:一是市场深度;二是报价紧密度;三是股票的价格弹性或者恢复能力 |
|||
|
|||
一旦上市公司发行股票进入二级市场,发行出的股票是不可能再退还给上市公司的,只能在二级市场卖给下家 |
|||
|
|||
## 股票的交易原则和规则 |
|||
交易原则:时间优先,价格优先 |
|||
|
|||
交易规则:交易时间,交易单位,价位和涨跌幅限制 |
|||
|
|||
了解了A 股、B 股、H 股、N 股、S 股、T 股的概念。 |
|||
|
|||
了解了什么是主板、中小板、创业板、新三板。 |
|||
|
|||
知道了融资融券,和如何开户。 |
|||
|
|||
|
|||
|
|||
## 学习git |
|||
|
|||
git的分支操作:创建(brach 分支)、切换(checkout 分支)、合并(merge 分支) |
|||
|
|||
git 拉去指定分分支 git clone -b 分支 地址 |
|||
|
|||
## 启动金币项目 |
|||
|
|||
启动项目的前后端,熟悉数据库 |
|||
|
|||
## 找金币系统财务审核的bug |
|||
|
|||
|
|||
|
|||
# 明日计划 |
|||
|
|||
1. 继续找金币项目的bug |
|||
2. 学习道氏理论 |
|||
|
|||
|
|||
|
|||
|
|||
|
@ -0,0 +1,66 @@ |
|||
# 学习记录 |
|||
|
|||
## 股票知识(道氏理论) |
|||
|
|||
### 定义 |
|||
|
|||
道氏理论是**以股票市场的基本趋势作为研究及分析对象的投资理论**。是所有市场技术研究的鼻祖 |
|||
|
|||
### 六条基本观点 |
|||
|
|||
1. 平均价格包容消化一切 |
|||
1. 平均价格是股价指数 |
|||
2. 市场同时存在三种价格 |
|||
1. 基本运动、次级运动、日常运动 |
|||
3. 大趋势的三个阶段 |
|||
1. 对投资者的分类 |
|||
2. 基本牛市的三个阶段 |
|||
1. 积累阶段 |
|||
2. 稳定上涨阶段 |
|||
3. 反转的过度阶段 |
|||
3. 趋势形成的心理模型 |
|||
4. 平均价格之间相互验证 |
|||
1. 市场由不同行业的不同股票组成 |
|||
2. 基本牛市的形成是龙头股引领的 |
|||
3. 从平均价格相互验证中可引申出技术分析方法之间的相互验证 |
|||
5. 成交量验证趋势 |
|||
1. 对成交量只能定性分析而不能定量分析 |
|||
2. 成交量通常会顺着趋势的方向递增,但不是必然 |
|||
6. 唯有确切的反转信号,才能判定原有趋势的终结 |
|||
1. 需要各种条件相互验证 |
|||
|
|||
## 工作内容 |
|||
|
|||
| 找bug内容 | |
|||
| ------------------------------------------------------------ | |
|||
| 财务审核-充值审核:接口recharge/recharge问题,原测试服务器redis服务可能挂了 | |
|||
| 财务审核-充值审核:支付凭证不显示,不显示图片,报502 原因:怀疑是代理问题 尝试:尝试ping 地址 ping [54.251.137.151](http://54.251.137.151) 可以 但是无法访问,是之前在服务器上的地址 | |
|||
| 财务审核-充值审核:通过 接口 /audit/audit/goldedit java.lang.Exception: Failed to insert recharge data 数据插入异常 原因 审核状态为空时,进行通过或者驳回会出现(根本是有数据库的脏数据,recharge表和audit表数据不一致) | |
|||
| 财务审核-充值审核:驳回 接口 /audit/audit/edit无法使用 SQLSyntaxErrorException错误 | |
|||
| 财务审核-充值审核:前后端数据不统一(调用了两个接口导致) | |
|||
| 财务审核-退款审核:驳回不显示驳回理由remark | |
|||
| 财务审核-退款审核:前端计算问题 | |
|||
| 财务审核-充值审核:多个万圣节活动 接口为 recharge/activity/select 原因,数据库异常,activity表数据问题 | |
|||
|
|||
## 学习内容 |
|||
|
|||
学习go基础,下载go的环境编译器 |
|||
|
|||
第一个Hello world |
|||
|
|||
go代码规范({ 不能在单独的行上) |
|||
|
|||
字符串连接(直接用+) |
|||
|
|||
变量声明使用 var |
|||
|
|||
字符串格式化 |
|||
|
|||
使用 := 符号可以自动推导出变量类型并进行赋值操作 |
|||
|
|||
# 明日计划 |
|||
|
|||
1. 找金币项目的代码问题,尤其是代码逻辑 |
|||
2. 学习股票基本专业名词 |
|||
3. 继续学习go |
|||
|
@ -0,0 +1,244 @@ |
|||
# 学习记录 |
|||
|
|||
## 股票知识(基本名词) |
|||
|
|||
### K线 |
|||
|
|||
起源于200多年前日本,是日本的一个米商发明的 |
|||
|
|||
#### 阴阳 |
|||
|
|||
红色为阳,代表当日股价上涨,绿色为阴,代表下跌 |
|||
|
|||
#### 实体 |
|||
|
|||
矩形称为实体 |
|||
|
|||
#### 影线 |
|||
|
|||
矩形上面的细线叫上影线,下面的叫下影线 |
|||
|
|||
#### 最高价 |
|||
|
|||
上影线的最上端 |
|||
|
|||
#### 最低价 |
|||
|
|||
下影线的对下端 |
|||
|
|||
#### 开盘价、收盘价 |
|||
|
|||
红色阳线实体的下边是开盘价,上边是收盘 |
|||
|
|||
绿色阴线实体上边是开盘价,下边是收盘价 |
|||
|
|||
#### 按时间周期分类 |
|||
|
|||
分钟线、日线、周线、月线、季线、年线 |
|||
|
|||
#### 三要素 |
|||
|
|||
阴阳代表涨跌 |
|||
|
|||
实体代表内在动力强弱 |
|||
|
|||
影线长短反映转折意愿 |
|||
|
|||
### 开盘价 |
|||
|
|||
第一笔成交价,若开市半小时没有成交,以第二天收盘为开盘价 |
|||
|
|||
### 最高价 |
|||
|
|||
某种证券当日交易中最高成交价格 |
|||
|
|||
## 最低价 |
|||
|
|||
某种证券当日交易中的最低成交价格 |
|||
|
|||
## 工作内容 |
|||
|
|||
| 代码问题(基本) | |
|||
| -------------------------------------- | |
|||
| 金币退款-代码问题:重复更新 | |
|||
| 金币退款-代码问题:逻辑问题,try catch | |
|||
| 金币退款-代码问题:规范问题 | |
|||
| 变量重复定义 | |
|||
| 多个变量未使用 | |
|||
|
|||
## 学习内容(GO) |
|||
|
|||
### 包管理 |
|||
|
|||
1. 一个文件夹可以称为一个包 |
|||
2. 在文件夹(包)中可以创建多个文件 |
|||
3. 在同一个包下的文件中,必须指定包名称,且包名称要相同 |
|||
|
|||
**重点**:关于包的分类 |
|||
|
|||
- main包 |
|||
- 非main包 |
|||
|
|||
如果是main包,必须写一个main函数,此函数就是项目的入口(main主函数),编译生成的就是一个可执行文件 |
|||
|
|||
非main包,用来将代码分类,分别放在不同的包和文件中 |
|||
|
|||
文件夹中编写功能是,功能(方法)的名字要大写 = >这样才能让外部调用 |
|||
|
|||
小写的只能内部调用 |
|||
|
|||
注意: |
|||
|
|||
- 调用其他包的功能,需要先 import 导入,然后再使用;调用自己包中的功能时,直接调用即可(无需导入) |
|||
- 文件中的函数首字母是小写,表示此函数只能被当前包内部文件调用。首字母是大写,则意味着任何包都可以调用。 |
|||
|
|||
### 输出 |
|||
|
|||
在终端将想要展示的数据显示出来,例如:欢迎登录、请输入用户名等 |
|||
|
|||
- 内置函数 |
|||
- print |
|||
- println |
|||
- fmt包(推荐) |
|||
- fmt.Print |
|||
- fmt.Println |
|||
|
|||
扩展:进程里有 stdin/stdout/stderr |
|||
|
|||
### 注释 |
|||
|
|||
单行,多行 |
|||
|
|||
### 数据类型 |
|||
|
|||
- 整型,整数 |
|||
- 字符串,文本 |
|||
- 布尔型,真假 |
|||
|
|||
```go |
|||
package main |
|||
|
|||
import "fmt" |
|||
|
|||
func main() { |
|||
// 整型 |
|||
fmt.Println(666) |
|||
fmt.Println(6 + 9) |
|||
fmt.Println(6 - 9) |
|||
fmt.Println(6 * 9) |
|||
fmt.Println(16 / 9) // 商 |
|||
fmt.Println(16 % 9) // 余数 |
|||
|
|||
// 字符串类型,特点:通过双引号 |
|||
fmt.Println("lihui") |
|||
fmt.Println("钓鱼要掉刀鱼,刀鱼到岛上钓") |
|||
fmt.Println("lihui" + "444") |
|||
//fmt.Println("lihui" + 666) |
|||
fmt.Println("lihui" + "666") |
|||
// 对比 |
|||
fmt.Println("1" + "2") // 结果:"12" |
|||
fmt.Println(1 + 2) // 结果:3 |
|||
|
|||
// 布尔类型,真假 |
|||
fmt.Println(1 > 2) // false 假 |
|||
fmt.Println(1 < 2) // true 真 |
|||
fmt.Println(1 == 2) |
|||
fmt.Println(1 >= 2) |
|||
fmt.Println("lihui" == "qq") |
|||
|
|||
// 超前 |
|||
if 2 > 1 { |
|||
fmt.Println("哈哈") |
|||
} else { |
|||
fmt.Println("呵呵") |
|||
} |
|||
|
|||
} |
|||
``` |
|||
|
|||
### 变量&常量 |
|||
|
|||
可以理解为昵称。 |
|||
|
|||
- 声明 + 赋值 |
|||
|
|||
``` |
|||
var sd string = "老男孩lihui" |
|||
fmt.Println(sd) |
|||
|
|||
var age int = 73 |
|||
fmt.Println(age) |
|||
|
|||
var flag bool = true |
|||
fmt.Println(flag) |
|||
``` |
|||
|
|||
|
|||
|
|||
- 先声明后赋值 |
|||
|
|||
``` |
|||
// 声明了一个字符类型变量 sd |
|||
var sd string |
|||
// 给sd变量赋值 |
|||
sd = "老男孩lihui" |
|||
fmt.Println(sd) |
|||
``` |
|||
|
|||
#### 变量名要求 |
|||
|
|||
1. 只包含字母、数字、下划线 |
|||
2. 不能数字开头 |
|||
3. 不能使用关键字 |
|||
|
|||
```go |
|||
break、default、func、interface、select、case、defer、go、map、struct、chan、else、goto、package、switch、const、fallthrough、if、range、type、continue、for、import、return、var |
|||
``` |
|||
|
|||
#### 建议 |
|||
|
|||
1. 见名知意 |
|||
2. 驼峰命名 |
|||
|
|||
#### 变量简写 |
|||
|
|||
`name:= "lihui"` |
|||
|
|||
go编译器会认为声明变量不使用 就是耍流氓,声明必须使用,否则报错 |
|||
|
|||
#### 作用域 |
|||
|
|||
如果我们定义了大括号,那么在大括号中定义的变量。 |
|||
|
|||
- 不能被上级使用。 |
|||
- 可以在同级使用。 |
|||
- 可以再子级使用。 |
|||
|
|||
全局变量,未写在函数中的变量称为全局变量;不可以使用`v1:=xx`方式进行简化;可以基于因式分解方式声明多个变量;项目中寻找变量时最后一环。 |
|||
|
|||
局部变量,编写在函数{}里面的变量;可以使用任意方式简化;可以基于因式分解方式声明多个变量; |
|||
|
|||
### 输入 |
|||
|
|||
- fmt.Scan |
|||
- fmt.Scanln |
|||
- fmt.Scanf |
|||
|
|||
### 条件语句 |
|||
|
|||
### switch语句 |
|||
|
|||
### for |
|||
|
|||
### goto语句 |
|||
|
|||
### 字符串格式化 |
|||
|
|||
### 运算符 |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
@ -0,0 +1,131 @@ |
|||
# 股票知识 |
|||
|
|||
## 成交,成交量和成交金额 |
|||
|
|||
成交,就是成交价 |
|||
|
|||
成交量,指股票成交的数量 |
|||
|
|||
成交金额,指已成交证券(股票)的价值 |
|||
|
|||
## 涨跌 |
|||
|
|||
当日股票最新价与前一日收盘价格(或前一日收盘指数)相比的百分比幅度, |
|||
|
|||
正值为涨,负值为跌,否则为持平 |
|||
|
|||
## 涨幅 |
|||
|
|||
股票最新价相对前一交易日收盘价的升降幅度。 |
|||
|
|||
## 涨跌幅限制 |
|||
|
|||
制定股票价格涨跌幅的目的,是防止股价剧烈波动,维护证券市场的稳定,保护中小投资者的利益 |
|||
|
|||
## 涨停板 |
|||
|
|||
交易所规定的股价在一天中相对前一日收盘价的最大涨幅,不能超过此限,我国现规定涨停升幅(ST 类股票除外)为 10%。 |
|||
|
|||
## **跌停板** |
|||
|
|||
交易所规定的股价在一天中相对前一日收盘价的最大跌幅,不能超过此限。我国现规定跌停降幅(ST 类股票除外)为 10%。 |
|||
|
|||
# 工作内容 |
|||
|
|||
学习go |
|||
|
|||
# 学习内容 |
|||
|
|||
### 进制和编码 |
|||
|
|||
1. 计算机上所有的东西最终都会转换成为二进制再去运行。 |
|||
2. ascii编码、unicode字符集、utf-8编码本质上都是字符与二进制的关系。 |
|||
- ascii,字符和二进制的对照表。 |
|||
- unicode,字符和二进制(码位)的对照表。 |
|||
- utf-8,对unicode字符集的码位进行压缩处理,间接也维护了字符和二进制的对照表。 |
|||
3. ucs2和ucs4指的是使用多少个字节来表示unicode字符集的码位。 |
|||
4. 目前最广泛的编码为:utf-8,他可以表示所有的字符且存储或网络传输也不会浪费资源(对码位进行压缩了)。 |
|||
5. 二进制、八进制、十进制、十六进制其实就是进位的时机不同。 |
|||
6. 一个字节8位 |
|||
7. b/B/KB/M/G的关系。 |
|||
8. utf-8用3个字节表示中文。 |
|||
|
|||
### 数据类型 |
|||
|
|||
Go语言中常见的数据类型有很多,例如: |
|||
|
|||
- 整型,用于表示整数。 |
|||
- 浮点型,用于表示小数。 |
|||
- 布尔型,用于表示真/假。 |
|||
- 字符串,用于表示文本信息。 |
|||
- 数组,用于表示多个数据(数据集合) |
|||
- 指针,用于表示内存地址的类型。 |
|||
- 切片,用于表示多个数据(数据集合) |
|||
- 字典,用于表示键值对结合。 |
|||
- 结构体,用于自定义一些数据集合。 |
|||
- 接口,用于约束和泛指数据类型。 |
|||
|
|||
### 整型 |
|||
|
|||
Go中的整型分为有符号和无符号两大类,有符号的包含负值,无符号不包含负值。 |
|||
|
|||
有符号整型: |
|||
|
|||
- int8(-128 -> 127) |
|||
- int16(-32768 -> 32767) |
|||
- int32(-2,147,483,648 -> 2,147,483,647) |
|||
- int64(-9,223,372,036,854,775,808 -> 9,223,372,036,854,775,807) |
|||
- int |
|||
- 在 32 位操作系统上使用 32 位(-2,147,483,648 -> 2,147,483,647) 2**32 |
|||
- 在 64 位操作系统上使用 64 位(-9,223,372,036,854,775,808 -> 9,223,372,036,854,775,80)2**64 |
|||
|
|||
无符号整数: |
|||
|
|||
- uint8(0 -> 255) |
|||
- uint16(0 -> 65,535) |
|||
- uint32(0 -> 4,294,967,295) |
|||
- uint64(0 -> 18,446,744,073,709,551,615) |
|||
- uint |
|||
- 在 32 位操作系统上使用32 位(0 -> 4,294,967,295) 2**32 |
|||
- 64 位操作系统上使用 64 位(0 -> 18,446,744,073,709,551,615) 2**64 |
|||
|
|||
不同整型可表示的数据范围不同,我们需要根据自己的需求来选择适合的类型。 |
|||
|
|||
#### 整型转换 |
|||
|
|||
```go |
|||
data := intxxx(其他整型) |
|||
|
|||
var v1 int8 = 10 |
|||
var v2 int16 = 18 |
|||
v3 := int16(v1) + v2 |
|||
fmt.Println(v3, reflect.TypeOf(v3)) |
|||
``` |
|||
|
|||
注意: |
|||
|
|||
- 地位转向高位,没问题。 |
|||
- 高位转向低位,可能有问题 |
|||
|
|||
现象:轮回=>不会报错 |
|||
|
|||
```go |
|||
var v1 int16 = 130 |
|||
v2 := int8(v1) |
|||
fmt.Println(v2) |
|||
输出结果为 -126 |
|||
``` |
|||
|
|||
### 切片 |
|||
|
|||
### 字典 |
|||
|
|||
### 指针 |
|||
|
|||
### 结构体 |
|||
|
|||
# 明日计划 |
|||
|
|||
1. 学习go |
|||
2. 学习股票知识 |
|||
3. 了解金币需求 |
@ -0,0 +1,131 @@ |
|||
# 技术分析理论基础 |
|||
|
|||
三大公理就是其内容 |
|||
|
|||
## 公理一 |
|||
|
|||
在市场经济中,市场行为包容消化一切,价格变化一定是有原因的 |
|||
|
|||
### 两种分析方法 |
|||
|
|||
#### 基本分析方法 |
|||
|
|||
先将价格变为动作结果,再去研究价格变化背后的原因,再从这些原因中找到规律,然后来分析这个股 |
|||
|
|||
> 找到这个价格变动背后的原因是十分困难的 |
|||
|
|||
#### 技术分析法 |
|||
|
|||
将价格变动作为原因,从价格变化中找到规律,然后推断出市场或者某个股的下一个阶段的走势 |
|||
|
|||
股价下跌的因素会作用于市场,市场会做出反应 |
|||
|
|||
## 公理二 |
|||
|
|||
价格沿趋势的方向演进,趋势是技术分析最基本的概念(技术分析的核心) |
|||
|
|||
市场趋势一旦形成,很难改变,只会出现较小的波动 |
|||
|
|||
## 公理三 |
|||
|
|||
历史会不断重演(投资大众的心理) |
|||
|
|||
在满足相同的条件下,会产生相同的结果 |
|||
|
|||
虽然会重演,但是不是简单的重演,不是简答的重复,没有任何两次的行情走势是一模一样的,只是性质和结果相同 |
|||
|
|||
## 四大要素 |
|||
|
|||
价、量、时、空 |
|||
|
|||
## 技术分析的种类 |
|||
|
|||
1. 股市趋势的分析 = > 顺着趋势 |
|||
2. 技术分析是 K 线组合分析 |
|||
3. 技术分析是图形的分析 |
|||
1. 反转形态 (将要有逆转的趋势,但是下一步趋势不定) |
|||
2. 持续形态 |
|||
4. 技术分析是波浪理论 |
|||
5. 技术分析是循环周期理论,简单表现为时间之窗 |
|||
6. 技术分析是移动平均线理论 |
|||
7. 技术分析系统是摆动曲线系统 |
|||
8. 技术分析方法是四度空间理论(何价、何时、何人、何事) |
|||
|
|||
## 波浪理论 |
|||
|
|||
### 基本特点 |
|||
|
|||
股价指数的上升和下跌将会交替进行; |
|||
|
|||
推动浪和调整浪是价格波动两个最基本形态,推动浪五个小浪,调整浪三个小浪 |
|||
|
|||
八个波浪是一个循环,一个循环完成,走势将进人下一个八波浪循环; |
|||
|
|||
时间的长短不会改变波浪的形态,因为市场仍会依照其基本形态发展。波浪可以拉长,也可以缩细,但其基本形态永恒不变。 |
|||
|
|||
### 波浪的形态 |
|||
|
|||
 |
|||
|
|||
### 波浪之间的比例 |
|||
|
|||
//todo |
|||
|
|||
### 基本要点 |
|||
|
|||
1. 上升五浪,下跌三浪 |
|||
2. 波浪可以合并为高一级的浪也能分割为第一级的浪 |
|||
3. 跟随主流(大市方向)可分为五个小浪 |
|||
4. 135 中,第三浪不能是最短的 |
|||
5. 三个推动浪,任何一个成为延伸浪,另外两个浪,运行时间和幅度会趋于一致 |
|||
6. 调整浪通常三个 |
|||
7. 黄金分割率奇异数字结合,是理论的基础 |
|||
8. 常见吞吐比率为 0.382 、0.5、 0.618 |
|||
9. 第四浪的底不低于第一浪的顶 |
|||
10. 理论包括三部分:形态,比率,时间(重要性排序) |
|||
11. 反映的是群众的心理,人越多,越准确 |
|||
|
|||
### 缺陷 |
|||
|
|||
对现象看法不统一,不能准确判断波 |
|||
|
|||
怎么算一个完整的浪 |
|||
|
|||
如何判断波浪伸展 |
|||
|
|||
浪中有浪 |
|||
|
|||
是主观分析,无客观准则 |
|||
|
|||
不能用于个股选择 |
|||
|
|||
## 行业周期循环 |
|||
|
|||
开创期 -> 扩张期->停滞期->开创期->扩张期 |
|||
|
|||
## 移动平均线理论 |
|||
|
|||
移动平均线理论是将出现在图纸上的移动平均数依照先后次序联结起来,成为起伏不定的弯曲线。它是将道氏理论具体地加以数字化,从数字的变化中去预测未来股价短期、中长期、长期的变动方向,同时从移动平均线图中也可窥出成本变动情形 |
|||
|
|||
## 四度空间理论 |
|||
|
|||
1. **何价**:指单位时间内产生的价格,考虑高低价格的区间,不考虑开盘价及收盘价。 |
|||
2. **何时**:指时间,每个单位时间以30分钟或日为一段,寻找价格低于价值的时间非常重要。 |
|||
3. **何人**:指长线买卖者与短线买卖者。长线买卖者通常与机构投资者有关,不在乎短期涨跌,注重长期投资;短线买卖者频繁进出,追涨杀跌。 |
|||
4. **何事**:指主动性买卖盘和被动性买卖盘。主动性买卖盘是长线买卖者所为,是价值变化的根本动力;被动性买卖盘是短线买卖者的具体体现。 |
|||
|
|||
**价值公式**:价格 + 时间 = 价值,强调时间和价格的关系,认为时间是常数,价格是变数,价值是两者的结合 |
|||
|
|||
**市场轮廓图**:完整反映市场价格运动的变化过程,分析市场价格运动的原因、动力及方式 |
|||
|
|||
**投资与投机**:提倡用投资理念选择股票,而在投机理念的价值出现时抛掉股票,实现高抛低吸 |
|||
|
|||
## 技术分析应该注意的问题 |
|||
|
|||
1. 用多个,而不是一个分析问题 |
|||
2. 前人和别人的结论要验证 |
|||
3. 每一个结论要不断修改 |
|||
4. 大多数人看法一致,往往错误 |
|||
5. 技术分析永远灵验,不灵的是使用的人 |
|||
6. 技术分析要和基本分析结合使用 |
|||
7. 人才是决定因素 |
After Width: 365 | Height: 233 | Size: 3.9 KiB |
After Width: 319 | Height: 294 | Size: 6.3 KiB |
After Width: 350 | Height: 296 | Size: 7.1 KiB |
@ -0,0 +1,338 @@ |
|||
# 包管理 |
|||
|
|||
1. 一个文件夹可以称为一个包 |
|||
2. 在文件夹(包)中可以创建多个文件 |
|||
3. 在同一个包下的文件中,必须指定包名称,且包名称要相同 |
|||
|
|||
**重点**:关于包的分类 |
|||
|
|||
- main包 |
|||
- 非main包 |
|||
|
|||
如果是main包,必须写一个main函数,此函数就是项目的入口(main主函数),编译生成的就是一个可执行文件 |
|||
|
|||
非main包,用来将代码分类,分别放在不同的包和文件中 |
|||
|
|||
文件夹中编写功能是,功能(方法)的名字要大写 = >这样才能让外部调用 |
|||
|
|||
小写的只能内部调用 |
|||
|
|||
注意: |
|||
|
|||
- 调用其他包的功能,需要先 import 导入,然后再使用;调用自己包中的功能时,直接调用即可(无需导入) |
|||
- 文件中的函数首字母是小写,表示此函数只能被当前包内部文件调用。首字母是大写,则意味着任何包都可以调用。 |
|||
|
|||
# 输出 |
|||
|
|||
在终端将想要展示的数据显示出来,例如:欢迎登录、请输入用户名等 |
|||
|
|||
- 内置函数 |
|||
- print |
|||
- println |
|||
- fmt包(推荐) |
|||
- fmt.Print |
|||
- fmt.Println |
|||
|
|||
扩展:进程里有 stdin/stdout/stderr |
|||
|
|||
## 注释 |
|||
|
|||
单行,多行 |
|||
|
|||
|
|||
|
|||
# 数据类型 |
|||
|
|||
- 整型,整数 |
|||
- 字符串,文本 |
|||
- 布尔型,真假 |
|||
|
|||
```go |
|||
package main |
|||
|
|||
import "fmt" |
|||
|
|||
func main() { |
|||
// 整型 |
|||
fmt.Println(666) |
|||
fmt.Println(6 + 9) |
|||
fmt.Println(6 - 9) |
|||
fmt.Println(6 * 9) |
|||
fmt.Println(16 / 9) // 商 |
|||
fmt.Println(16 % 9) // 余数 |
|||
|
|||
// 字符串类型,特点:通过双引号 |
|||
fmt.Println("lihui") |
|||
fmt.Println("钓鱼要掉刀鱼,刀鱼到岛上钓") |
|||
fmt.Println("lihui" + "SB") |
|||
//fmt.Println("lihui" + 666) |
|||
fmt.Println("lihui" + "666") |
|||
// 对比 |
|||
fmt.Println("1" + "2") // 结果:"12" |
|||
fmt.Println(1 + 2) // 结果:3 |
|||
|
|||
// 布尔类型,真假 |
|||
fmt.Println(1 > 2) // false 假 |
|||
fmt.Println(1 < 2) // true 真 |
|||
fmt.Println(1 == 2) |
|||
fmt.Println(1 >= 2) |
|||
fmt.Println("lihui" == "sb") |
|||
|
|||
// 超前 |
|||
if 2 > 1 { |
|||
fmt.Println("叫爸爸") |
|||
} else { |
|||
fmt.Println("孙子") |
|||
} |
|||
|
|||
} |
|||
``` |
|||
|
|||
# 变量 |
|||
|
|||
可以理解为昵称。 |
|||
|
|||
- 声明 + 赋值 |
|||
|
|||
``` |
|||
var sd string = "老男孩lihui" |
|||
fmt.Println(sd) |
|||
|
|||
var age int = 73 |
|||
fmt.Println(age) |
|||
|
|||
var flag bool = true |
|||
fmt.Println(flag) |
|||
``` |
|||
|
|||
|
|||
|
|||
- 先声明后赋值 |
|||
|
|||
``` |
|||
// 声明了一个字符类型变量 sd |
|||
var sd string |
|||
// 给sd变量赋值 |
|||
sd = "老男孩lihui" |
|||
fmt.Println(sd) |
|||
``` |
|||
|
|||
## 变量名要求 |
|||
|
|||
1. 只包含字母、数字、下划线 |
|||
2. 不能数字开头 |
|||
3. 不能使用关键字 |
|||
|
|||
```go |
|||
break、default、func、interface、select、case、defer、go、map、struct、chan、else、goto、package、switch、const、fallthrough、if、range、type、continue、for、import、return、var |
|||
``` |
|||
|
|||
## 建议 |
|||
|
|||
1. 见名知意 |
|||
2. 驼峰命名 |
|||
|
|||
## 变量简写 |
|||
|
|||
`name:= "lihui"` |
|||
|
|||
go编译器会认为声明变量不使用 就是耍流氓,声明必须使用,否则报错 |
|||
|
|||
## 作用域 |
|||
|
|||
如果我们定义了大括号,那么在大括号中定义的变量。 |
|||
|
|||
- 不能被上级使用。 |
|||
- 可以在同级使用。 |
|||
- 可以再子级使用。 |
|||
|
|||
全局变量,未写在函数中的变量称为全局变量;不可以使用`v1:=xx`方式进行简化;可以基于因式分解方式声明多个变量;项目中寻找变量时最后一环。 |
|||
|
|||
局部变量,编写在函数{}里面的变量;可以使用任意方式简化;可以基于因式分解方式声明多个变量; |
|||
|
|||
## 赋值及内存相关 |
|||
|
|||
```go |
|||
name := "lihui" |
|||
``` |
|||
|
|||
 |
|||
|
|||
```go |
|||
name := "lihui" |
|||
nickname := name |
|||
``` |
|||
|
|||
 |
|||
|
|||
```go |
|||
name := "lihui" |
|||
nickname := name |
|||
|
|||
name = "lihuibear" |
|||
``` |
|||
|
|||
 |
|||
|
|||
|
|||
|
|||
#### 注意事项 |
|||
|
|||
使用int、string、bool这三种数据类型时,如果遇到变量的赋值则会拷贝一份。【值类型】 |
|||
|
|||
# 常量 |
|||
|
|||
## const |
|||
|
|||
可以定义局部,可以定义全局 |
|||
|
|||
## iota |
|||
|
|||
计数 |
|||
|
|||
```go |
|||
package main |
|||
|
|||
import "fmt" |
|||
|
|||
func main() { |
|||
|
|||
// iota |
|||
// 示例1 |
|||
|
|||
const ( |
|||
v1 = 1 |
|||
v2 = 2 |
|||
v3 = 3 |
|||
v4 = 4 |
|||
v5 = 5 |
|||
) |
|||
fmt.Println(v1, v2, v3, v4, v5) |
|||
|
|||
|
|||
// 示例2 |
|||
/* |
|||
const ( |
|||
v1 = iota |
|||
v2 |
|||
v3 |
|||
v4 |
|||
v5 |
|||
) |
|||
fmt.Println(v1, v2, v3, v4, v5) |
|||
*/ |
|||
|
|||
// 示例3 |
|||
/* |
|||
const ( |
|||
v1 = iota + 2 |
|||
v2 |
|||
v3 |
|||
v4 |
|||
v5 |
|||
) |
|||
fmt.Println(v1, v2, v3, v4, v5) |
|||
*/ |
|||
|
|||
// 示例4: |
|||
/* |
|||
const ( |
|||
v1 = iota + 2 |
|||
_ |
|||
v2 |
|||
v3 |
|||
v4 |
|||
v5 |
|||
) |
|||
fmt.Println(v1, v2, v3, v4, v5) |
|||
*/ |
|||
|
|||
} |
|||
``` |
|||
|
|||
# 输入 |
|||
|
|||
让用户输入数据,完成项目交互。 |
|||
|
|||
- fmt.Scan |
|||
- fmt.Scanln |
|||
- fmt.Scanf |
|||
|
|||
# 条件语句 |
|||
|
|||
## 最基本 |
|||
|
|||
```go |
|||
if 条件 { |
|||
成立后,此代码块执行 |
|||
}else{ |
|||
不成立,此代码块执行 |
|||
} |
|||
``` |
|||
|
|||
## 多条件 |
|||
|
|||
```go |
|||
package main |
|||
|
|||
import "fmt" |
|||
|
|||
func main() { |
|||
var length int |
|||
fmt.Print("请输入你的长度:") |
|||
fmt.Scanln(&length) |
|||
|
|||
if length < 1 { |
|||
fmt.Println("没用的东西,还特么是坑") |
|||
} else if length < 6 { |
|||
fmt.Println("刚刚能用") |
|||
} else if length < 18 { |
|||
fmt.Println("生活和谐") |
|||
} else { |
|||
fmt.Println("太特么大了") |
|||
} |
|||
} |
|||
``` |
|||
|
|||
## 嵌套 |
|||
|
|||
``` go |
|||
package main |
|||
|
|||
import "fmt" |
|||
|
|||
func main() { |
|||
fmt.Println("欢迎致电10086,1.话费相关;2.业务办理;3.人工服务。") |
|||
|
|||
var number int |
|||
fmt.Scanln(&number) |
|||
|
|||
if number == 1 { |
|||
fmt.Println("话费服务,1.交话费;2.查询。") |
|||
var n1 int |
|||
fmt.Scanln(&n1) |
|||
if n1 == 1 { |
|||
fmt.Println("缴话费啦") |
|||
} else if n1 == 2 { |
|||
fmt.Println("查话费了") |
|||
} else { |
|||
fmt.Println("输入错误") |
|||
} |
|||
} else if number == 2 { |
|||
fmt.Println("业务办理") |
|||
} else if number == 3 { |
|||
fmt.Println("人工服务") |
|||
} else { |
|||
fmt.Println("输入错误") |
|||
} |
|||
|
|||
// 建议:条件的嵌套不要太多 |
|||
} |
|||
``` |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
@ -0,0 +1,170 @@ |
|||
# switch语句 |
|||
|
|||
```go |
|||
package main |
|||
|
|||
func main() { |
|||
|
|||
// 表达式 |
|||
/* |
|||
switch 1 + 1 { |
|||
case 1: |
|||
fmt.Println("等于1") |
|||
case 2: |
|||
fmt.Println("等于2") |
|||
case 3: |
|||
fmt.Println("等于3") |
|||
fmt.Println("等于3") |
|||
default: |
|||
fmt.Println("都不满足") |
|||
} |
|||
*/ |
|||
// 变量 |
|||
/* |
|||
var age int |
|||
fmt.Scanln(&age) |
|||
switch age { |
|||
case "1": |
|||
fmt.Println("等于1") |
|||
case 2: |
|||
fmt.Println("等于2") |
|||
case 3: |
|||
fmt.Println("等于3") |
|||
fmt.Println("等于3") |
|||
default: |
|||
fmt.Println("都不满足") |
|||
} |
|||
*/ |
|||
// 注意事项: 数据类型一致的情况。 正确:1>2 3+4 错误: 1>"3" 5+"6" |
|||
} |
|||
``` |
|||
|
|||
|
|||
|
|||
# for |
|||
|
|||
```go |
|||
package main |
|||
|
|||
func main() { |
|||
|
|||
// 示例1:死循环 |
|||
/* |
|||
fmt.Println("开始") |
|||
for { |
|||
fmt.Println("红鲤鱼与绿鲤鱼与驴") |
|||
time.Sleep(time.Second * 1) // 等一秒再继续执行 |
|||
} |
|||
fmt.Println("结束") |
|||
*/ |
|||
|
|||
// 示例2: |
|||
/* |
|||
fmt.Println("开始") |
|||
for 2 > 1 { |
|||
fmt.Println("红鲤鱼与绿鲤鱼与驴") |
|||
time.Sleep(time.Second * 1) // 等一秒再继续执行 |
|||
} |
|||
fmt.Println("结束") |
|||
*/ |
|||
|
|||
// 示例3: |
|||
/* |
|||
|
|||
fmt.Println("开始") |
|||
number := 1 |
|||
for number < 5 { |
|||
fmt.Println("钓鱼要掉刀鱼,刀鱼要到岛上钓") |
|||
number = 10 |
|||
} |
|||
fmt.Println("结束") |
|||
*/ |
|||
|
|||
// 示例4: |
|||
/* |
|||
fmt.Println("开始") |
|||
number := 1 |
|||
for number < 5 { |
|||
fmt.Println("钓鱼要掉刀鱼,刀鱼要到岛上钓") |
|||
number = number + 1 |
|||
} |
|||
fmt.Println("结束") |
|||
|
|||
*/ |
|||
|
|||
// 示例5:布尔类型的变量 |
|||
/* |
|||
fmt.Println("开始") |
|||
flag := true |
|||
for flag { |
|||
fmt.Println("钓鱼要掉刀鱼,刀鱼要到岛上钓") |
|||
flag = false |
|||
} |
|||
fmt.Println("结束") |
|||
|
|||
*/ |
|||
|
|||
} |
|||
``` |
|||
|
|||
# goto |
|||
|
|||
跳跃到指定的行,然后向下执行代码。 |
|||
|
|||
```go |
|||
package main |
|||
|
|||
import "fmt" |
|||
|
|||
func main() { |
|||
var name string |
|||
fmt.Print("请输入姓名:") |
|||
fmt.Scanln(&name) |
|||
|
|||
if name == "wupeiqi" { |
|||
// svip |
|||
goto SVIP |
|||
} else if name == "yuanhao" { |
|||
// vip |
|||
goto VIP |
|||
} |
|||
fmt.Println("预约...") |
|||
VIP: |
|||
fmt.Println("等号...") |
|||
SVIP: |
|||
fmt.Println("进入...") |
|||
} |
|||
``` |
|||
|
|||
|
|||
|
|||
# 字符串格式化 |
|||
|
|||
``` |
|||
package main |
|||
|
|||
import "fmt" |
|||
|
|||
func main() { |
|||
var name, address, action string |
|||
|
|||
fmt.Print("请输入姓名:") |
|||
fmt.Scanln(&name) |
|||
|
|||
fmt.Print("请输入位置:") |
|||
fmt.Scanln(&address) |
|||
|
|||
fmt.Print("请输入行为:") |
|||
fmt.Scanln(&action) |
|||
|
|||
result := fmt.Sprintf("我叫%s,在%s正在干%s", name, address, action) |
|||
//result := "我叫" + name + "在" + address + "干" + action |
|||
fmt.Println(result) |
|||
} |
|||
``` |
|||
|
|||
|
|||
|
|||
# 运算符 |
|||
|
|||
和其他语言没区别 |
@ -0,0 +1,14 @@ |
|||
# 进制和编码 |
|||
|
|||
1. 计算机上所有的东西最终都会转换成为二进制再去运行。 |
|||
2. ascii编码、unicode字符集、utf-8编码本质上都是字符与二进制的关系。 |
|||
- ascii,字符和二进制的对照表。 |
|||
- unicode,字符和二进制(码位)的对照表。 |
|||
- utf-8,对unicode字符集的码位进行压缩处理,间接也维护了字符和二进制的对照表。 |
|||
3. ucs2和ucs4指的是使用多少个字节来表示unicode字符集的码位。 |
|||
4. 目前最广泛的编码为:utf-8,他可以表示所有的字符且存储或网络传输也不会浪费资源(对码位进行压缩了)。 |
|||
5. 二进制、八进制、十进制、十六进制其实就是进位的时机不同。 |
|||
6. 一个字节8位 |
|||
7. b/B/KB/M/G的关系。 |
|||
8. utf-8用3个字节表示中文。 |
|||
|
@ -0,0 +1,193 @@ |
|||
# 数据类型 |
|||
|
|||
Go语言中常见的数据类型有很多,例如: |
|||
|
|||
- 整型,用于表示整数。 |
|||
- 浮点型,用于表示小数。 |
|||
- 布尔型,用于表示真/假。 |
|||
- 字符串,用于表示文本信息。 |
|||
- 数组,用于表示多个数据(数据集合) |
|||
- 指针,用于表示内存地址的类型。 |
|||
- 切片,用于表示多个数据(数据集合) |
|||
- 字典,用于表示键值对结合。 |
|||
- 结构体,用于自定义一些数据集合。 |
|||
- 接口,用于约束和泛指数据类型。 |
|||
|
|||
## 整型 |
|||
|
|||
Go中的整型分为有符号和无符号两大类,有符号的包含负值,无符号不包含负值。 |
|||
|
|||
有符号整型: |
|||
|
|||
- int8(-128 -> 127) |
|||
- int16(-32768 -> 32767) |
|||
- int32(-2,147,483,648 -> 2,147,483,647) |
|||
- int64(-9,223,372,036,854,775,808 -> 9,223,372,036,854,775,807) |
|||
- int |
|||
- 在 32 位操作系统上使用 32 位(-2,147,483,648 -> 2,147,483,647) 2**32 |
|||
- 在 64 位操作系统上使用 64 位(-9,223,372,036,854,775,808 -> 9,223,372,036,854,775,80)2**64 |
|||
|
|||
无符号整数: |
|||
|
|||
- uint8(0 -> 255) |
|||
- uint16(0 -> 65,535) |
|||
- uint32(0 -> 4,294,967,295) |
|||
- uint64(0 -> 18,446,744,073,709,551,615) |
|||
- uint |
|||
- 在 32 位操作系统上使用32 位(0 -> 4,294,967,295) 2**32 |
|||
- 64 位操作系统上使用 64 位(0 -> 18,446,744,073,709,551,615) 2**64 |
|||
|
|||
不同整型可表示的数据范围不同,我们需要根据自己的需求来选择适合的类型。 |
|||
|
|||
### 整型转换 |
|||
|
|||
```go |
|||
data := intxxx(其他整型) |
|||
|
|||
var v1 int8 = 10 |
|||
var v2 int16 = 18 |
|||
v3 := int16(v1) + v2 |
|||
fmt.Println(v3, reflect.TypeOf(v3)) |
|||
``` |
|||
|
|||
注意: |
|||
|
|||
- 地位转向高位,没问题。 |
|||
- 高位转向低位,可能有问题 |
|||
|
|||
现象:轮回=>不会报错 |
|||
|
|||
```go |
|||
var v1 int16 = 130 |
|||
v2 := int8(v1) |
|||
fmt.Println(v2) |
|||
输出结果为 -126 |
|||
``` |
|||
|
|||
### 其他进制转换 |
|||
|
|||
### math下的数学运算模块 |
|||
|
|||
### 指针/nil/声明变量/new |
|||
|
|||
- 声明变量 |
|||
- 指针 |
|||
- new 关键字 |
|||
- nil 空值 |
|||
|
|||
为什么要有指针? |
|||
|
|||
> 为了节省内存,不重复开辟空间区存储 |
|||
|
|||
int和*int是两种不同的数据类型 |
|||
|
|||
### 超大整型 |
|||
|
|||
使用指针的方式,即:使用new来进行创建和初始化。 |
|||
|
|||
```go |
|||
// 第一步:创建一个超大整型的一个对象 |
|||
var v1 big.Int |
|||
var v2 big.Int |
|||
|
|||
// 第二步:在超大整型对象中写入值 |
|||
v1.SetInt64(9223372036854775807) |
|||
fmt.Println(v1) |
|||
|
|||
v2.SetString("92233720368547758089223372036854775808", 10) |
|||
fmt.Println(v2) |
|||
``` |
|||
|
|||
|
|||
|
|||
```go |
|||
// 第一步:创建一个超大整型的一个对象 |
|||
v3 := new(big.Int) |
|||
v4 := new(big.Int) |
|||
|
|||
// 第二步:在超大整型对象中写入值 |
|||
v3.SetInt64(9223372036854775807) |
|||
fmt.Println(v3) |
|||
|
|||
v4.SetString("92233720368547758089223372036854775808", 10) |
|||
fmt.Println(v4) |
|||
``` |
|||
|
|||
#### 超大整形的运算 |
|||
|
|||
也是建议使用new的方式 |
|||
|
|||
## 浮点型 |
|||
|
|||
float类型,计算机中小数的非精确的表示方式,如:`3.14` |
|||
|
|||
### float底层存储原理 |
|||
|
|||
1. 浮点型转换为二进制 |
|||
2. 科学计数法表示 |
|||
3. 存储 |
|||
|
|||
### decimal |
|||
|
|||
第三方的包 |
|||
|
|||
```go |
|||
package main |
|||
|
|||
import ( |
|||
"fmt" |
|||
"github.com/shopspring/decimal" |
|||
) |
|||
|
|||
func main() { |
|||
|
|||
var v1 = decimal.NewFromFloat(0.0000000000019) |
|||
var v2 = decimal.NewFromFloat(0.29) |
|||
|
|||
var v3 = v1.Add(v2) |
|||
|
|||
var v4 = v1.Sub(v2) |
|||
|
|||
var v5 = v1.Mul(v2) |
|||
|
|||
var v6 = v1.Div(v2) |
|||
|
|||
fmt.Println(v3, v4, v5, v6) // 输出:0.2900000000019(也可以调用String方法) |
|||
|
|||
|
|||
var price = decimal.NewFromFloat(3.4626) |
|||
var data1 = price.Round(1) // 保留小数点后1位(四舍五入) |
|||
var data2 = price.Truncate(1) // 保留小数点后1位 |
|||
fmt.Println(data1, data2) // 输出:3.5 3.4 |
|||
} |
|||
``` |
|||
|
|||
## 布尔类型 |
|||
|
|||
阿巴阿巴 |
|||
|
|||
## 字符串 |
|||
|
|||
阿巴阿巴 |
|||
|
|||
### 底层存储逻辑 |
|||
|
|||
计算机中所有的操作和数据最终都是二进制,即:1000100001011... |
|||
|
|||
Go语言中的字符串是utf-8编码的序列。 |
|||
|
|||
## 数组 |
|||
|
|||
数组,定长且元素类型一致的数据集合。 |
|||
|
|||
- 数组的内存是连续的。 |
|||
- 数组的内存地址实际上就是数组第一个元素的内存地址。 |
|||
- 每个字符串的内部存储:`len` + `str` |
|||
|
|||
### 可变和拷贝 |
|||
|
|||
可变,数组的元素可以被更改(长度和类型都不可以修改)。 |
|||
|
|||
注意:字符串不可以被修改。 |
|||
|
|||
拷贝,变量赋值时重新拷贝一份。 |
@ -0,0 +1,39 @@ |
|||
1. 指针,用于表示内存地址的类型。 |
|||
2. 切片,用于表示多个数据(数据集合) |
|||
3. 字典,用于表示键值对结合 |
|||
|
|||
# 切片 |
|||
|
|||
切片,动态数组。 |
|||
|
|||
切片是Go中重要的数据类型,每个切片对象内部都维护着:数组指针、切片长度、切片容量 三个数据。 |
|||
|
|||
# 字典 |
|||
|
|||
Map的特点: |
|||
|
|||
- 键不能重复 |
|||
- 键必须可哈希(目前我们已学的数据类型中,可哈希的有:int/bool/float/string/array) |
|||
- 无序 |
|||
|
|||
## Map底层原理剖析 |
|||
|
|||
Golang中的Map有自己的一套实现原理,其核心是由`hmap`和`bmap`两个结构体实现。 |
|||
|
|||
# 指针 |
|||
|
|||
指针,是一种数据类型,用于表示数据的内存地址。 |
|||
|
|||
```go |
|||
// 声明一个 字符串类型 的变量(默认初始化值为空字符串)。 |
|||
var v1 string |
|||
|
|||
// 声明一个 字符串的指针类型 的变量(默认初始化值为nil)。 |
|||
var v2 *string |
|||
|
|||
var v3 int |
|||
|
|||
var v4 *int |
|||
``` |
|||
|
|||
数组的地址 == 数组的第一个元素的地址。 |
@ -0,0 +1,85 @@ |
|||
# 结构体 |
|||
|
|||
结构体是一个复合类型,用于表示一组数据。 |
|||
|
|||
结构体由一系列属性组成,每个属性都有自己的类型和值。 |
|||
|
|||
## 初始化 |
|||
|
|||
```go |
|||
// 定义一个结构体(类型),每个结构体包含 name、age、hobby 三个元素 |
|||
type Person struct { |
|||
name string |
|||
age int |
|||
hobby []string |
|||
} |
|||
|
|||
//方式1:先后顺序 |
|||
var p1 = Person{"lihui", 22, []string{"唱跳", "rap"}} |
|||
fmt.Println(p1.name, p1.age, p1.hobby) |
|||
|
|||
//方式2:关键字 |
|||
var p2 = Person{name: "lihui", age: 22, hobby: []string{"饺子", "馒头"}} |
|||
fmt.Println(p2.name, p2.age, p2.hobby) |
|||
|
|||
//方式3:先声明再赋值 |
|||
var p3 Person |
|||
p3.name = "lihui" |
|||
p3.age = 18 |
|||
p3.hobby = []string{"唱跳", "篮球"} |
|||
fmt.Println(p3.name, p3.age, p3.hobby) |
|||
|
|||
``` |
|||
|
|||
## 结构体指针 |
|||
|
|||
```go |
|||
type Person struct { |
|||
name string |
|||
age int |
|||
} |
|||
|
|||
// 初始化结构体(创建一个结构体对象) |
|||
p1 := Person{"lihui", 18} |
|||
fmt.Println(p1.name, p1.age) |
|||
|
|||
// 初始化结构体指针 |
|||
// var p2 *Person = &Person{"lihui", 18} |
|||
p2 := &Person{"lihui", 18} |
|||
fmt.Println(p2.name, p2.age) |
|||
|
|||
var p3 *Person = new(Person) |
|||
p3.name = "lihui" |
|||
p3.age = 18 |
|||
|
|||
fmt.Println(p3.name, p3.age) |
|||
``` |
|||
|
|||
## 赋值拷贝 |
|||
|
|||
其实本质上都拷贝了,只不过由于数据存储方式的不同,导致拷贝的有些是数据,有些是内存地址(指针)。 |
|||
|
|||
但是: |
|||
|
|||
- 感觉拷贝:字符串、数组、整型等。 |
|||
- 感觉不拷贝:map、切片。 |
|||
|
|||
## 标签 |
|||
|
|||
没啥用,给结构体的元素一个注释 |
|||
|
|||
# 函数 |
|||
|
|||
可以把函数当做一个代码块,用于实现某个功能。并且提高代码的重用性和可读性。 |
|||
|
|||
```go |
|||
func 函数名(参数) 返回值 { |
|||
函数体 |
|||
} |
|||
``` |
|||
|
|||
关于函数名需要注意:函数名只能是字母数字下划线组合且数字不能开头,即驼峰式命名 |
|||
|
|||
|
|||
|
|||
# 接口 |
After Width: 638 | Height: 343 | Size: 74 KiB |
After Width: 475 | Height: 176 | Size: 9.7 KiB |
After Width: 891 | Height: 98 | Size: 4.5 KiB |
After Width: 869 | Height: 193 | Size: 35 KiB |
After Width: 755 | Height: 272 | Size: 49 KiB |
After Width: 1221 | Height: 515 | Size: 146 KiB |
After Width: 175 | Height: 45 | Size: 1.6 KiB |
After Width: 1029 | Height: 671 | Size: 100 KiB |
After Width: 718 | Height: 197 | Size: 34 KiB |
After Width: 191 | Height: 290 | Size: 15 KiB |
After Width: 581 | Height: 184 | Size: 28 KiB |
After Width: 572 | Height: 160 | Size: 27 KiB |
After Width: 572 | Height: 160 | Size: 27 KiB |
After Width: 527 | Height: 198 | Size: 43 KiB |
After Width: 990 | Height: 817 | Size: 112 KiB |
@ -0,0 +1,162 @@ |
|||
# BUG整合(财务审核部分) |
|||
|
|||
## Redis服务问题 |
|||
|
|||
接口recharge/recharge问题,原测试服务器redis服务可能没有开启,本地开启Redis解决 |
|||
|
|||
2025年6月16日下午再次测试,服务器Redis服务已经恢复 |
|||
|
|||
### 解决方案 |
|||
|
|||
开启Redis |
|||
|
|||
## 支付凭证不显示 |
|||
|
|||
|
|||
|
|||
之前是502 代理错误,可以ping到54.251.137.151。 |
|||
|
|||
 |
|||
|
|||
现在均为404,根据标头何返回相应判断,上传的图片存到了原服务器 |
|||
|
|||
 |
|||
|
|||
## 审核通过接口异常 |
|||
|
|||
 |
|||
|
|||
Failed to insert recharge data 数据插入异常 |
|||
|
|||
 |
|||
|
|||
### 原因 |
|||
|
|||
审核状态为空时,进行通过或者驳回会出现(**根本是有数据库的脏数据,recharge表和audit表数据不一致**) |
|||
|
|||
### 解决方案 |
|||
|
|||
去除脏数据 |
|||
|
|||
## 审核驳回接口异常 |
|||
|
|||
接口 /audit/audit/edit |
|||
|
|||
### 原因 |
|||
|
|||
SQLSyntaxErrorException错误 |
|||
|
|||
 |
|||
|
|||
### 解决方案 |
|||
|
|||
加上逗号 |
|||
|
|||
|
|||
|
|||
## 数据显示不统一 |
|||
|
|||
|
|||
|
|||
 |
|||
|
|||
### 原因 |
|||
|
|||
调用了recharge和RechargeA分别来获取数据 |
|||
|
|||
 |
|||
|
|||
### 解决方案 |
|||
|
|||
使用同一个接口逻辑计算 |
|||
|
|||
## 退款不显示驳回理由 |
|||
|
|||
 |
|||
|
|||
### 原因 |
|||
|
|||
前后端字段不统一,前段为reson,后端为auditReson,返回前端没有解析 |
|||
|
|||
### 解决方案 |
|||
|
|||
前后端口规范,使用同一个字段,可以使用充值审核的驳回逻辑 |
|||
|
|||
## 前端计算问题 |
|||
|
|||
 |
|||
|
|||
### 原因 |
|||
|
|||
超长小数计算 |
|||
|
|||
### 解决方案 |
|||
|
|||
统计逻辑,不允许退款超长小数 |
|||
|
|||
或者使用math/big 等大数计算 |
|||
|
|||
## 多个活动问题 |
|||
|
|||
 |
|||
|
|||
### 原因 |
|||
|
|||
数据库脏数据,activity表数据问题 |
|||
|
|||
### 解决方案 |
|||
|
|||
去除脏数据 |
|||
|
|||
## 代码逻辑重复更新 |
|||
|
|||
 |
|||
|
|||
### 问题 |
|||
|
|||
重复更新,可能导致数据不一致 |
|||
|
|||
### 解决方案 |
|||
|
|||
return result |
|||
|
|||
## 代码逻辑问题,try catch |
|||
|
|||
 |
|||
|
|||
### 原因 |
|||
|
|||
try catch逻辑问题,不会执行return |
|||
|
|||
### 解决方案 |
|||
|
|||
移动位置 |
|||
|
|||
## 代码规范问题 |
|||
|
|||
 |
|||
|
|||
 |
|||
|
|||
### 原因 |
|||
|
|||
1. 多处代码,命名有问题,不能见名知意 |
|||
2. 变量重复定义 |
|||
3. 多个变量未使用 |
|||
|
|||
### 解决方案 |
|||
|
|||
规范命名,规范变量使用 |
|||
|
|||
## Redis超时问题 |
|||
|
|||
RedisCommandTimeoutException |
|||
|
|||
### 原因 |
|||
|
|||
可能是大量数据到了redis |
|||
|
|||
### 解决方案 |
|||
|
|||
配置增加超时时间 |
|||
|