初学 go 语言,对 & 和 * 的适用场景不太理解
尤其在结构体中 ,如 testb 怎么打印结果为&{test} 而不是地址
package main
import "fmt"
type Test struct {
name string
}
func main() {
testa := Test{"test"}
fmt.Println(testa)
//结果{test}
testb := &Test{"test"}
fmt.Println(testb)
//结果 &{test}
testc := &Test{"test"}
fmt.Println(*testc)
//结果 {test}
testd := &Test{"test"}
fmt.Println(&testd)
//结果 0xc000006030
var a int = 1
fmt.Println(a)
//结果 1
fmt.Println(&a)
//结果 0xc00000c0d8
}
1
leoleoasd 2021-02-20 18:20:41 +08:00 2
&是“取地址运算符”,是从一个变量获取地址
*是“解引用运算符”,可以简单理解为“从地址取值”, 是&的逆运算 你 testd 是一个 Test*类型,也就是指向 Test 的指针 然后&testd 就是 testd 变量本身的地址,类型应该是 Test 的指针的指针 |
2
leoleoasd 2021-02-20 18:21:32 +08:00
比如说你完全可以这么干
```go testc := &Test{"test"} fmt.Println(&*&*&*&*testc) //结果 &{test} ``` |
3
SingeeKing 2021-02-20 18:23:46 +08:00
fmt.Println(xxx) 等同于 fmt.Print("%v\n", xxx),然后进一步看文档 https://golang.org/pkg/fmt/ 中关于 %v 的解释就能弄明白了
|
4
ihipop 2021-02-20 18:24:42 +08:00 via Android 1
testb 是存储了指向{test}的指针,其地址为&testb
|
5
awanganddong OP 谢谢诸位了
我明白了 |
6
darksword21 2021-02-20 19:46:00 +08:00 via iPhone
这个没在意过,就用学 c 的时候里理解了感觉没啥问题
|
7
fighterhit 2021-02-21 11:44:18 +08:00
testb 存的是地址,所以怎么打印出来这个地址呢?
|
8
awanganddong OP 这是在知乎看到的,清晰了不少
C++primer 中对 对象的定义:对象是指一块能存储数据并具有某种类型的内存空间一个对象 a ,它有值和地址&a ,运行程序时,计算机会为该对象分配存储空间,来存储该对象的值,我们通过该对象的地址,来访问存储空间中的值指针 p 也是对象,它同样有地址&p 和存储的值 p ,只不过,p 存储的数据类型是数据的地址。如果我们要以 p 中存储的数据为地址,来访问对象的值,则要在 p 前加解引用操作符"*",即*p 。 作者:xmqv 链接: https://www.zhihu.com/question/37608201/answer/72766337 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 |