go & 和 * 的区别,以及适用场景

2021-02-20 18:16:26 +08:00
 awanganddong

初学 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
}

5656 次点击
所在节点    Go 编程语言
8 条回复
leoleoasd
2021-02-20 18:20:41 +08:00
&是“取地址运算符”,是从一个变量获取地址
*是“解引用运算符”,可以简单理解为“从地址取值”, 是&的逆运算
你 testd 是一个 Test*类型,也就是指向 Test 的指针
然后&testd 就是 testd 变量本身的地址,类型应该是 Test 的指针的指针
leoleoasd
2021-02-20 18:21:32 +08:00
比如说你完全可以这么干
```go
testc := &Test{"test"}
fmt.Println(&*&*&*&*testc)
//结果 &{test}
```
SingeeKing
2021-02-20 18:23:46 +08:00
fmt.Println(xxx) 等同于 fmt.Print("%v\n", xxx),然后进一步看文档 https://golang.org/pkg/fmt/ 中关于 %v 的解释就能弄明白了
ihipop
2021-02-20 18:24:42 +08:00
testb 是存储了指向{test}的指针,其地址为&testb
awanganddong
2021-02-20 19:09:46 +08:00
谢谢诸位了

我明白了
darksword21
2021-02-20 19:46:00 +08:00
这个没在意过,就用学 c 的时候里理解了感觉没啥问题
fighterhit
2021-02-21 11:44:18 +08:00
testb 存的是地址,所以怎么打印出来这个地址呢?
awanganddong
2023-04-18 10:36:09 +08:00
这是在知乎看到的,清晰了不少

C++primer 中对 对象的定义:对象是指一块能存储数据并具有某种类型的内存空间一个对象 a ,它有值和地址&a ,运行程序时,计算机会为该对象分配存储空间,来存储该对象的值,我们通过该对象的地址,来访问存储空间中的值指针 p 也是对象,它同样有地址&p 和存储的值 p ,只不过,p 存储的数据类型是数据的地址。如果我们要以 p 中存储的数据为地址,来访问对象的值,则要在 p 前加解引用操作符"*",即*p 。

作者:xmqv
链接: https://www.zhihu.com/question/37608201/answer/72766337
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/754698

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX