unsafe.Pointer 面试题,几乎没几个人答得对,有人知道答案的原因吗?

af913337456 · · 2650 次点击
不打印没用是因为,如果你不打印b,编译器优化的时候可能会把b这个变量给编译没了。 fmt.Println(&b) 这样是最有用的,因为你对b进行了取地址操作,编译器认为你会使用b的地址进行读取,赋值等操作,一定会保护堆上b的内存不被占用。 如果你只是单纯的 fmt.Println(b) 有可能也是不行的,因为如果 b := 3 fmt.Println(b) 编译器优化时一看,你这b赋了值,除了打印一下,再也不使用了,就给你优化成 fmt.Println(3) 所以实际上可能根本就不分配内存了
#35
更多评论
```go func fun1() { a := 2 c := (*string) (unsafe.Pointer(&a)) //c为a的unsafe.pointer强制转为string指针,*c指的是a的值,a的值是int型的,这里*c = "44"是强制赋了个字符串,所以赋值是失败的,只是没有提示,因为使用了unsafe *c = "44" fmt.Println(*c) //这时的c是string指针,*c指的应该是一个字符串,但是里面实际上是int数据,所以操作也是失败的 } func fun2() { a := "654" c := (*string) (unsafe.Pointer(&a)) //根据fun1的解释 a 为字符串型,那整个流程就通了,自然*c打出来的是 44,在*c="44"上面打印出来的是肯定是654 *c = "44" fmt.Println(*c) } func fun3() { a := 3 c := *(*string) (unsafe.Pointer(&a)) //这里获取的是a地址里的string值,但a的值是int型,所以操作失败,没有得到值,但c被定义里了string型变量,c = "445",给string型变量赋string值 自然是正常的 c = "445" fmt.Println(c) } ```
#1
实际工作中会用到这些吗?
#2