V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
awanganddong

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

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

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

    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   ·   Solana   ·   2542 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 49ms · UTC 09:19 · PVG 17:19 · LAX 02:19 · JFK 05:19
    ♥ Do have faith in what you're doing.