Golang Go语言中 & 和 * 的区别,以及适用场景

发布于 1周前 作者 htzhanglong 来自 Go语言

Golang Go语言中 & 和 * 的区别,以及适用场景

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

}


更多关于Golang Go语言中 & 和 * 的区别,以及适用场景的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

9 回复

&是“取地址运算符”,是从一个变量获取地址
是“解引用运算符”,可以简单理解为“从地址取值”, 是&的逆运算
你 testd 是一个 Test
类型,也就是指向 Test 的指针
然后&testd 就是 testd 变量本身的地址,类型应该是 Test 的指针的指针

更多关于Golang Go语言中 & 和 * 的区别,以及适用场景的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


比如说你完全可以这么干
go<br> testc := &amp;Test{"test"}<br> fmt.Println(&amp;*&amp;*&amp;*&amp;*testc)<br> //结果 &amp;{test}<br>

fmt.Println(xxx) 等同于 fmt.Print("%v\n", xxx),然后进一步看文档 https://golang.org/pkg/fmt/ 中关于 %v 的解释就能弄明白了

testb 是存储了指向{test}的指针,其地址为&testb

谢谢诸位了

我明白了

这个没在意过,就用学 c 的时候里理解了感觉没啥问题

testb 存的是地址,所以怎么打印出来这个地址呢?

这是在知乎看到的,清晰了不少

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

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

在Go语言中,&* 是两个非常基础且重要的操作符,它们分别用于获取变量的地址和通过指针访问变量。

  1. & 操作符

    • 功能:获取变量的内存地址。
    • 适用场景:当你需要将变量的地址传递给函数,或者需要创建一个指向变量的指针时,就需要使用 & 操作符。例如,当你需要修改一个函数外部变量的值时,可以通过传递该变量的指针来实现。
  2. * 操作符

    • 功能:解引用指针,获取指针指向的变量的值。同时,在声明指针类型的变量时,* 也用于指定变量是一个指针。
    • 适用场景:当你需要访问或修改指针指向的变量的值时,就需要使用 * 操作符。此外,在声明指针变量时,也需要使用 * 来指明该变量的类型是指向某种类型的指针。

总结来说,&* 在Go语言中分别用于获取变量的地址和通过指针访问变量。它们在处理需要修改外部变量、动态内存管理、数据结构(如链表、树等)的场合中非常有用。需要注意的是,使用指针时需要小心内存泄漏和野指针等问题,确保在使用完指针后正确地释放内存,并避免指针指向无效的内存地址。

在编写Go程序时,合理利用 &* 可以提高程序的灵活性和效率,但同时也需要谨慎处理相关的内存管理问题。

回到顶部