学了近一学期的Go语言,期间也发现了不少坑,记录如下
内存地址会变化
package main
import "fmt"
import "unsafe"
import "runtime"
func main() {
var x int = 42
var p uintptr = uintptr(unsafe.Poiner(&x))
runtime.GC()
var px *int = (*int)(unsafe.Poiner(p))
println(*px)
}
当内存发送变化的时候, 相关的指针会同步更新, 但是非指针类型的uintptr不会做同步更新
main函数提前退出
package main
import "time"
func main() {
go println("hello")
// time.Sleep(time.Second)
}
输出
// 后台Goroutine无法保证完成任务
// 上述代码没有输出
// 如果取消time.Sleep
// 则会输出hello,但是休眠并不能保证输出完整的字符串(需要时间足够长)
for-range
package main
import "fmt"
func main() {
slice := []int{0, 1, 2, 3}
mp := make(map[int]*int)
fmt.Println("根本原因在于for range是用一个变量承接mp中的内容的")
for index, value := range slice {
mp[index] = &value
}
for key, value := range mp {
fmt.Println(key, " ", *value)
}
fmt.Println("正确示例如下")
mp3 := make(map[int]*int)
for index, value := range slice {
num := value
mp3[index] = &num
}
for key, value := range mp3 {
fmt.Println(key, " ", *value)
}
}
输出
for range 坑
0 3
1 3
2 3
3 3
正确写法
0 0
1 1
2 2
3 3
返回值被屏蔽
package main
func Foo() (err error) {
if err := Bar(); err != nil {
return
}
return
}
func main() {
Foo()
}
输出报错
undefined: Bar
err is shadowed during return
map遍历是顺序不固定
package main
func main() {
m := map[string]string{
"1": "1",
"2": "2",
"3": "3",
}
for k, v := range m {
println(k, v)
}
}
输出
2 2
3 3
1 1
或者
1 1
2 2
3 3
……
值传递
package main
import "fmt"
func main() {
x := [3]int{1, 2, 3}
func(arr [3]int) {
arr[0] = 7
fmt.Println(arr)
}(x)
fmt.Println(x)
}
输出
[7 2 3]
[1 2 3]