The Go Programming Language
› http://golang.org/
› Go Playground
Go Projects
› Revel Web Framework
awanganddong

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

  •  
  •   awanganddong · Feb 20, 2021 · 6972 views
    This topic created in 2092 days ago, the information mentioned may be changed or developed.

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

    我明白了
    darksword21
    darksword21
    Feb 20, 2021 via iPhone
    6
    这个没在意过,就用学 c 的时候里理解了感觉没啥问题
    fighterhit
    fighterhit
    Feb 21, 2021
    7
    testb 存的是地址,所以怎么打印出来这个地址呢?
    awanganddong
    awanganddong
    OP
    Apr 18, 2023
    8
    这是在知乎看到的,清晰了不少

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

    作者:xmqv
    链接: https://www.zhihu.com/question/37608201/answer/72766337
    来源:知乎
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2084 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 99ms · UTC 01:37 · PVG 09:37 · LAX 17:37 · JFK 20:37
    ♥ Do have faith in what you're doing.