内容简介:指针其实跟变量一样,只不过普通变量存放的是数值,而指针变量存放的是数值的内存地址。其中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 知识
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- Golang 结构体指针解析
- C 结构体指针初始化
- 数据结构和算法面试题系列-C指针、数组和结构体
- P/Invoke以指针形式传递结构体内的数组
- MixGo XFMT 解决 Golang 结构体嵌套格式化打印指针地址
- Go语言中结构体方法副本传参与指针传参的区别介绍
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
与机器赛跑
[美]埃里克·布林约尔松(Erik Brynjolfsson)、[美]安德鲁·麦卡菲(Andrew McAfee) / 闾佳 / 2013-1-20 / 6.00
一场数字革命正在加速进行。 一些科幻小说里的场景已经在现实中发生:无人驾驶汽车开上了公路;智能设备能高效地翻译人类语言;人工智能系统在智力竞赛里击败了所有人类选手;工厂雇主开始购买更多的新机器,却不招新工人…… 这些例子都证明,数字技术正在快速地掌握原本只属于人类的技能,并深刻地影响了经济。虽然大多数影响是积极的:数字革新将提高效率、降低商品价格(甚至到免费),以及增加经济总量。 ......一起来看看 《与机器赛跑》 这本书的介绍吧!
MD5 加密
MD5 加密工具
HSV CMYK 转换工具
HSV CMYK互换工具