大白话!go语言中的指针、指针类型的方法接收器

go语言中的指针使用起来的比较简单。应用如下:

1.普通的对象取地址,获取对象值
  • 符号&,取地址符,可以取变量的地址,或结构体对象的地址等。
  • 符号* ,是从地址中取值(根据栈中存储地址,从堆中获取映射的值
Go 复制代码
var a int
p := &a
v := *p
2.方法中的指针类型的接收器

举个例子先:

Go 复制代码
func (p *Point) ScaleBy(factor float64) {
    p.X *= factor
    p.Y *= factor
}

注意: go中的只有值传递,传递指针也是传递的指针的具体内容,比如0X5d544d

上面例子中方法的接收者是指针类型,不管是指针类似还是非指针类型的接收者 ,都是可以通过指针/非指针类型进行调用的,编译器会帮你做类型转换。

在声明一个method的receiver该是指针还是非指针类型时,需要考虑两个方面的因素:

(1)这个对象本身是不是特别大,如果声明为非指针变量时,调用会产生一次拷贝;

(2)如果你用指针类型作为receiver,那么你一定要注意,这种指针类型指向的始终是一块内存地址,就算你对其进行了拷贝。

非指针类型每一次的传递是值拷贝,如果对象过大,开销会变大。

那什么时候用指针对象作为接收器,什么时候用非指针对象作为接收器呢?

当涉及到对原对象内容修改对象,使用同一个对象的值的时候,使用指针接收者。对于指针,go会帮我们隐式的解引用。不需要取地址等等。

Go 复制代码
type Stu struct {
	Name string
	Age int
}

func TestDefer(t *testing.T) {
	s := &Stu{
		Name: "zhangsan",
		Age: 18,
	}	
	// go语言中自动解引用。
	fmt.Println("name:",s.Name)
	fmt.Println("age:",s.Age)
	
}
相关推荐
顺心而行...13 小时前
安装 ubuntu 24.04 LTS 单系统教程
开发语言
yaoxin52112313 小时前
295. Java Stream API - 选择适用于并行计算的 BinaryOperator
java·开发语言
CHHC188013 小时前
golang 项目依赖备份
开发语言·后端·golang
冬至喵喵13 小时前
RoaringBitmap与传统Bitmap
java·开发语言
Front思13 小时前
Vue3仿美团实现骑手路线规划
开发语言·前端·javascript
Swift社区13 小时前
Spring Boot 配置文件未生效
java·spring boot·后端
Ulyanov13 小时前
PyVista与Tkinter桌面级3D可视化应用实战
开发语言·前端·python·3d·信息可视化·tkinter·gui开发
计算机程序设计小李同学13 小时前
基于Web和Android的漫画阅读平台
java·前端·vue.js·spring boot·后端·uniapp
和你一起去月球13 小时前
动手学Agent应用开发(TS/JS 最简实践指南)
开发语言·javascript·ecmascript·agent·mcp
短剑重铸之日13 小时前
7天读懂MySQL|特别篇:MVCC详解
数据库·后端·mysql·mvcc