大白话!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)
	
}
相关推荐
苏三说技术1 小时前
Claude Code从失控到起飞,只用了这些技巧
后端
长栎2 小时前
写 for 循环写了十年,你却从没用过迭代器模式最狠的那一面
后端
LiaCode2 小时前
Redis 在生产项目的使用
前端·后端
用户559822481222 小时前
Docker Compose Down 导致容器数据误删——ext4 日志恢复全记录
后端
LiaCode2 小时前
一天学完 redis 的爽翻版核心知识总结
前端·后端
大刚测试开发实战2 小时前
如何内网穿透访问本地私有化部署的TestHub
前端·后端·github
xiaodaoluanzha3 小时前
迄今為止,最簡單的編程語言 Nolang
前端·后端
Csvn3 小时前
Docker 容器管理入门 — 从镜像到容器编排
后端
用户762352425913 小时前
ShardingJDBC
后端
行者全栈架构师3 小时前
IDEA 中 Maven 项目的 15 个红色报错快速解决方法
java·后端