go的接收器什么时候该用指针?|Go主题月

简介: 指针的两个关键符号*:返回所引用变量内存地址上的值&:返回变量的内存地址

指针的两个关键符号


  • *:返回所引用变量内存地址上的值
  • &:返回变量的内存地址

代码示例

首先可以看看下面这段代码的两个输出分别是什么?

package main
import (
  _ "embed"
  "fmt"
)
type person struct {
  Name    string
  Alias     string
  Summary     string
}
// 值接收器
func (p person) SetSummary() {
  p.Summary = fmt.Sprintf("我的名字叫%s,大家都叫我%s",p.Name,p.Alias)
}
// 指针接收器
func (p *person) SetSummaryByPointer() {
  p.Summary = fmt.Sprintf("我的名字叫%s,大家都叫我%s",p.Name,p.Alias)
}
func (p person) SaySummary() string {
  return p.Summary
}
func main(){
  per1 := person{Name:"程序员", Alias:"码农"}
  per1.SetSummary()
  fmt.Printf("第一段:%s\n",per1.SaySummary())
  per1.SetSummaryByPointer()
  fmt.Printf("第二段:%s\n",per1.SaySummary())
}

输出:

第一段:
第二段:我的名字叫程序员,大家都叫我码农

可以看到第一次SetSummary()的方法并为成功设置Summary字段的值,所以导致输出为空。而SetSummaryByPointer()却成功设置了Summary的值。

什么是接收器

首先我们要了解一下什么是接收器,看下面这张图就明白了。每个方法只能有一个接收器。

接收器类型可以是(几乎)任何类型,不仅仅是结构体类型,任何类型都可以有方法,甚至可以是函数类型,可以是 int、bool、string 或数组的别名类型,但是接收器不能是一个接口类型,因为接口是一个抽象定义,而方法却是具体实现,如果这样做了就会引发一个编译错误invalid receiver type…

网络异常,图片无法展示
|

值传递

为什么上面的SetSummary()方法没有成功设置Summary的值呢?

我们了解到在默认情况下Go 语言使用的是值传递,在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。

所以接收器接收方(p在上面的示例中)的行为就好像它是该方法的参数一样。拥有和值传递一样的特性,方法里的修改对p来说是不可见的,因为它修改的只是p的副本数据。

而指针接收器也是接受了p的副本,但是它是p的地址副本,所以方法内修改是直接在对应的内存地址上进行了修改,所以原先p数据对应的地址发生了改变,p随之也发生改变。

总结


  1. 如果要修改接收器的值,则使用指针接收器
  2. 如果接收器很大,struct例如很大,优先考虑指针接收器
  3. 对于基本类型,切片和small之类的类型,structs值接收器效率更高
  4. 因此,除非该方法的语义要求使用指针,否则值接收器将高效且清晰。
目录
相关文章
|
23天前
|
算法 Java Go
【GoGin】(1)上手Go Gin 基于Go语言开发的Web框架,本文介绍了各种路由的配置信息;包含各场景下请求参数的基本传入接收
gin 框架中采用的路优酷是基于httprouter做的是一个高性能的 HTTP 请求路由器,适用于 Go 语言。它的设计目标是提供高效的路由匹配和低内存占用,特别适合需要高性能和简单路由的应用场景。
131 4
|
23天前
|
存储 安全 Java
【Golang】(4)Go里面的指针如何?函数与方法怎么不一样?带你了解Go不同于其他高级语言的语法
结构体可以存储一组不同类型的数据,是一种符合类型。Go抛弃了类与继承,同时也抛弃了构造方法,刻意弱化了面向对象的功能,Go并非是一个传统OOP的语言,但是Go依旧有着OOP的影子,通过结构体和方法也可以模拟出一个类。
77 1
|
6月前
|
Go C++
Go语言方法与接收者 -《Go语言实战指南》
本文介绍了 Go 语言中方法的相关概念和用法。方法是绑定到特定类型上的函数,包含值接收者和指针接收者两种形式。值接收者不会改变原始数据,而指针接收者可修改原始数据,且在处理大型结构体时性能更优。文章详细对比了方法与普通函数的区别,并说明了选择指针接收者的原因,如修改原始值、提升性能及保持一致性。此外,Go 支持为任意自定义类型定义方法,不仅限于结构体。最后通过表格总结了方法的核心概念和使用场景。
174 34
|
存储 Go
Go to Learn Go之指针
Go to Learn Go之指针
99 0
Go: struct 结构体类型和指针【学习笔记记录】
本文是Go语言中struct结构体类型和指针的学习笔记,包括结构体的定义、成员访问、使用匿名字段,以及指针变量的声明使用、指针数组定义使用和函数传参修改值的方法。
|
存储 安全 Go
深入理解 Go 语言中的指针类型
【8月更文挑战第31天】
212 0
|
存储 Go 开发者
掌握Go语言中的指针
【8月更文挑战第31天】
119 0
|
Go 计算机视觉
Go从入门到放弃之指针
Go从入门到放弃之指针
|
12月前
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
1000 13
|
存储 人工智能 C语言
C语言程序设计核心详解 第八章 指针超详细讲解_指针变量_二维数组指针_指向字符串指针
本文详细讲解了C语言中的指针,包括指针变量的定义与引用、指向数组及字符串的指针变量等。首先介绍了指针变量的基本概念和定义格式,随后通过多个示例展示了如何使用指针变量来操作普通变量、数组和字符串。文章还深入探讨了指向函数的指针变量以及指针数组的概念,并解释了空指针的意义和使用场景。通过丰富的代码示例和图形化展示,帮助读者更好地理解和掌握C语言中的指针知识。
463 4

热门文章

最新文章

下一篇
开通oss服务