我只把值得记录的写一下。
1,
_ "github.com..." 的方式导入包, 不是忽略包, 也不是其他类要用这个包。我原来理解错误。
这句话的意思是让编译器接受包导入, 并执行包里面所有文件的init函数。
我测试了一下, 他把引入包的所有init 函数都执行了一遍, 顺序我测试的结果是按字母排序的
2,
在 Go 语言中,所有变量都被初始化为其零值。对于数值类型,
零值是 0;对于字符串类型, 零值是空字符串;对于布尔类型,
零值是 false;对于指针,零值是 nil。
其他都懂, 但nil, 是空指针的意思。
3,
golang中map和切片的区别:
切片时指针类型,数组是值类型
数组的长度是固定的,而切片不是(切片是动态的数组)
切片比数组多一个属性:容量(cap)
切片的底层是数组
4,
在 Go 语言中,如果 main 函数返回,整个程序也就终止了。
Go 程序终止时,还会关闭所有 之前启动且还在运行的 goroutine。
写并发程序的时候,最佳做法是,在 main 函数返回前,
清理 并终止所有之前启动的 goroutine。
编写启动和终止时的状态都很清晰的程序,有助减少 bug,防 止资源异常。
这个我恰好尝试过, 不管go func 有没有执行完, 只要main有输出,
整个进程结束, 解决方法是书中的waitGroup. 用法参考网址
https://studygolang.com/articles/12972?fr=sidebar
func main() {
wg := sync.WaitGroup{}
wg.Add(100)
for i := 0; i < 100; i++ {
go func(i int) {
fmt.Println(i)
wg.Done()
}(i)
}
wg.Wait()
}
书指不定哪年的,WaitGroup方法已改成包了。看下面例子。哦,没改,我看代码不仔细。
var waitGroup sync.WaitGroup
他这样声明了一下。
func main() {
wg := sync.WaitGroup{}
wg.Add(100)
for i := 0; i < 100; i++ {
// 输出一个数字100次 , 为使用go, 搞了匿名函数
go func(i int) {
fmt.Println(i)
wg.Done()
}(i)
}
for i := 0; i<100; i++ {
fmt.Printf("我在前面" + strconv.Itoa(i) + "\n")
}
wg.Wait()
for i := 0; i<100; i++ {
fmt.Printf("我在后面" + strconv.Itoa(i) + "\n")
}
}
wg.Wait() 前面的代码,会轮回执行, 执行完后,才会一次性执行wg.Wait后面的代码。
有疑问加站长微信联系(非本文作者)