V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
awanganddong
V2EX  ›  Go 编程语言

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

  •  
  •   awanganddong · 2021-02-20 18:16:26 +08:00 · 5853 次点击
    这是一个创建于 1374 天前的主题,其中的信息可能已经有所发展或是发生改变。

    初学 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
    }
    
    
    8 条回复    2023-04-18 10:36:09 +08:00
    leoleoasd
        1
    leoleoasd  
       2021-02-20 18:20:41 +08:00   ❤️ 2
    &是“取地址运算符”,是从一个变量获取地址
    *是“解引用运算符”,可以简单理解为“从地址取值”, 是&的逆运算
    你 testd 是一个 Test*类型,也就是指向 Test 的指针
    然后&testd 就是 testd 变量本身的地址,类型应该是 Test 的指针的指针
    leoleoasd
        2
    leoleoasd  
       2021-02-20 18:21:32 +08:00
    比如说你完全可以这么干
    ```go
    testc := &Test{"test"}
    fmt.Println(&*&*&*&*testc)
    //结果 &{test}
    ```
    SingeeKing
        3
    SingeeKing  
       2021-02-20 18:23:46 +08:00
    fmt.Println(xxx) 等同于 fmt.Print("%v\n", xxx),然后进一步看文档 https://golang.org/pkg/fmt/ 中关于 %v 的解释就能弄明白了
    ihipop
        4
    ihipop  
       2021-02-20 18:24:42 +08:00 via Android   ❤️ 1
    testb 是存储了指向{test}的指针,其地址为&testb
    awanganddong
        5
    awanganddong  
    OP
       2021-02-20 19:09:46 +08:00
    谢谢诸位了

    我明白了
    darksword21
        6
    darksword21  
       2021-02-20 19:46:00 +08:00 via iPhone
    这个没在意过,就用学 c 的时候里理解了感觉没啥问题
    fighterhit
        7
    fighterhit  
       2021-02-21 11:44:18 +08:00
    testb 存的是地址,所以怎么打印出来这个地址呢?
    awanganddong
        8
    awanganddong  
    OP
       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
    来源:知乎
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3039 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 14:15 · PVG 22:15 · LAX 06:15 · JFK 09:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.