1、不能使用在运行时计算的值实例化这样的数组。
而是使用make初始化具有所需长度的切片。
db := ConnMysql()
rows, err := db.Query("select rules from u_check_list where status= ? and web_uri=? and server_ip=? order by rank ", 1, web, server)
helper.CheckErr(err)
columns, err := rows.Columns()
helper.CheckErr(err)
var rules = [len(columns)]string
Error Message: non-constant array bound len(columns)
这样写:
columns, err := rows.Columns()
helper.CheckErr(err)
var ruleLength = len(columns)
var rules = make([]string, ruleLength)
2、切片slice,一个可以动态改变大小的数组。
最大特点:长度可变;长度不同,两个切片就会不同
3、channel,初始化的时候如果设置了缓存容量,就要注意容量是否达到最大值,如果达到最大值又未被读取,此时再向channel里写数据是会失败的
4、变量名一定要注意不要跟关键字冲突;不要跟包名冲突,不然会导致包无法导入
5、并发与并行的区别:
并发: 单核cpu,可以做一系列的事,但是在某个时间点,做的只有一个任务,当任务阻塞时,cpu能立即唤醒其他任务顶上,让任务永远都在进行中。比如一个人手在玩手机,玩游戏玩烦躁了 改成看视频
并行:多核cpu,可以同时做一系列的事。再每一个时间点,如果存在多个任务,那么这些任务是同时在做着的。比如一个人下班后回到家,听着音乐的同时在看书
6、panic: assignment to entry in nil map错误
data 是一个map[string]interface{}
原因: 初始化时使用: data := map[string]interface{} //未分配内存,直接赋值导致
使用: data := make(map[string]interface{}) //使用make定义,自动分配内存,不会出错
7、日期初始化,一定得使用“2006-01-02 03:04:05” 或者 “2006-01-02 15:04:05” 一个数字都不能替换,不然会导致得到的数据不对。
类似php “Y-m-d H:i:s”;这里的Y对应2006。03时对应的是12小时制,15对应的显示24小时制的。
美国人喜欢写日期按照 月 日 时 分 秒 年 时区,对应就是1月2号下午3点4分5秒06年7时区
8、defer的使用。会有一个defer栈,遵循栈的先进后出的规则。
fmt.Println(1)
defer fmt.Println(2)
defer fmt.Println(3)
fmt.Println(4)
//输出
//1
//4
//3
//2
9、数据类型转换
// 1)、int转string
num := 10
str,_ :=strconv.Itoa(num)
// 2)、string转int
str :="123"
num,_ := strconv.Atoi(str)
// 3)、string转int64
num64,_ := strconv.ParseInt(str)
// 4)、int转uint
int_num := unit(int_num)
// 5)、int64转int
//a. 使用int64()
int64_num :=int64(int_num)
//b.先转string,再转int
int64_time :=time.Now().Unix()
str_time :=strconv.FormatInt(int64_time,10)
int_time :=strconv.Atoi(str_time)
// 6)、string转time.Time
str_time := "1577761285"
int64_time ,_ := strconv.ParseInt(str_time ) //先转int64
tm := time.Unix(int64_time,10,64) //转time.Time
// tm.Format("2006-01-02 15:04") //格式化时间