Go语言学习过程中遇到的坑(不定期更新)

在学习Go语言的过程中,遇到了一些问题,如内存地址变化、main函数提前退出、for-range循环的行为、返回值被屏蔽以及map遍历顺序的不确定性等。这些问题揭示了Go语言在内存管理、控制流程和数据结构使用上的特性。
摘要由CSDN通过智能技术生成

学了近一学期的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 range0   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]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值