Go指南-结构体与指针

栏目: IT技术 · 发布时间: 5年前

内容简介:指针其实跟变量一样,只不过普通变量存放的是数值,而指针变量存放的是数值的内存地址。其中Go文档的一个栗子:

指针其实跟变量一样,只不过普通变量存放的是数值,而指针变量存放的是数值的内存地址。

其中 & 符号表示对变量取地址,得到一个指针; * 符号有 两种用法 ,如果 * 后面跟的是指针,则表示对指针取值,即得到指针指向的值;如果如果 * 后面跟的是类型,则表示一个指向该类型的 指针

Go文档的一个栗子:

func main() {
	i := 42 // 初始化一个值

	p := &i                   // &i表示对变量i取地址,并把地址赋给p,所以p是一个指针,指向i的值
	fmt.Println("pointer", p) // pointer 0xc000020078
	fmt.Println("value", *p)  // *表示对指针取值,即得到p指向的值,为42

	*p = 21        // 通过指针赋值
	fmt.Println(i) // 21

	var k *int // 这里的k是一个指针!!!
}

复制代码

注:Golang的指针不能进行计算。指针计算其实就是指针加减,在 C语言 中,是允许这样操作的,比如我们知道c语言中的数组名其实就是该数组的首地址,通过下标取值其实就是首地址的偏移,即加减。

结构体

Golang 里面的结构体(struct)可以类比面对对象语言中的类。

就像类有类方法一样,Golang也有结构体方法, 并且有带指针和不带指针的类方法。它们的区别具体如下:

type Rectangle struct {
	width int
	height int
}

func (r Rectangle) setWidth() {
	r.width = 100
}

func (r *Rectangle) setHeight() {
	r.height = 100
}

func main() {
	rec := Rectangle{width: 1, height: 1}
	rec.setWidth()
	fmt.Println(rec.width) // 仍然是1

	rec.setHeight()
	fmt.Println(rec.height)  // 变为100
}
复制代码

通过上面的例子可以看到,不带指针的方法(setWidth),传递的参数r其实是Rectangle的一份拷贝,所以即使在方法里面修改了width的值,原有的结构体并不受影响;而带指针的方法则相反。

官方文档也提到了这两者的区别:

Rectangle
Rectangle

go struct 方法使用指针与不使用指针的区别?

欢迎关注我们的微信公众号,每天学习 Go 知识

Go指南-结构体与指针

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

大数据时代

大数据时代

[英] 维克托•迈尔•舍恩伯格(Viktor Mayer-Schönberger) / 周涛 / 浙江人民出版社 / 2012-12 / 49.90元

《大数据时代》是国外大数据研究的先河之作,本书作者维克托•迈尔•舍恩伯格被誉为“大数据商业应用第一人”,拥有在哈佛大学、牛津大学、耶鲁大学和新加坡国立大学等多个互联网研究重镇任教的经历,早在2010年就在《经济学人》上发布了长达14页对大数据应用的前瞻性研究。 维克托•迈尔•舍恩伯格在书中前瞻性地指出,大数据带来的信息风暴正在变革我们的生活、工作和思维,大数据开启了一次重大的时代转型,并用三......一起来看看 《大数据时代》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

SHA 加密
SHA 加密

SHA 加密工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具