Golang 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
&是“取地址运算符”,是从一个变量获取地址
是“解引用运算符”,可以简单理解为“从地址取值”, 是&的逆运算
你 testd 是一个 Test类型,也就是指向 Test 的指针
然后&testd 就是 testd 变量本身的地址,类型应该是 Test 的指针的指针
更多关于Golang Go语言中 & 和 * 的区别,以及适用场景的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
比如说你完全可以这么干go<br> testc := &Test{"test"}<br> fmt.Println(&*&*&*&*testc)<br> //结果 &{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语言中,&
和 *
是两个非常基础且重要的操作符,它们分别用于获取变量的地址和通过指针访问变量。
-
&
操作符:- 功能:获取变量的内存地址。
- 适用场景:当你需要将变量的地址传递给函数,或者需要创建一个指向变量的指针时,就需要使用
&
操作符。例如,当你需要修改一个函数外部变量的值时,可以通过传递该变量的指针来实现。
-
*
操作符:- 功能:解引用指针,获取指针指向的变量的值。同时,在声明指针类型的变量时,
*
也用于指定变量是一个指针。 - 适用场景:当你需要访问或修改指针指向的变量的值时,就需要使用
*
操作符。此外,在声明指针变量时,也需要使用*
来指明该变量的类型是指向某种类型的指针。
- 功能:解引用指针,获取指针指向的变量的值。同时,在声明指针类型的变量时,
总结来说,&
和 *
在Go语言中分别用于获取变量的地址和通过指针访问变量。它们在处理需要修改外部变量、动态内存管理、数据结构(如链表、树等)的场合中非常有用。需要注意的是,使用指针时需要小心内存泄漏和野指针等问题,确保在使用完指针后正确地释放内存,并避免指针指向无效的内存地址。
在编写Go程序时,合理利用 &
和 *
可以提高程序的灵活性和效率,但同时也需要谨慎处理相关的内存管理问题。