【Go进阶】详解方法的值类型和指针类型区别

这篇具有很好参考价值的文章主要介绍了【Go进阶】详解方法的值类型和指针类型区别。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

值类型和指针类型


值类型和指针类型

方法也有值类型的方法和指针类型的区别,也就是以下两种receiver:

func (p person) setname(name string) { p.name = name }
func (p *person) setage(age int) { p.age = age }

setname()方法中是值类型的receiver,setage()方法中是指针类型的receiver。它们是有区别的。

  • 首先,setage()方法的p是一个指针类型的person实例,所以方法体中的p.age实际上等价于(*p).age。再者,方法就是函数,Go中所有需要传值的时候,都是按值传递的,也就是拷贝一个副本

setname()中,除了参数name string需要拷贝,receiver部分(p person)也会拷贝,而且它明确了要拷贝的对象是值类型的实例,也就是拷贝完整的person数据结构。但实例有两种类型:值类型和指针类型。

  • (p person)无视它们的类型,因为receiver严格规定p是一个值类型的实例。所以无论是指针类型的p1实例还是值类型的p2实例,都会拷贝整个实例对象。对于指针类型的实例p1,前面说了,在需要的时候,Go会自动解除引用,所以p1.setname()等价于(*p1).setname()

只要receiver是值类型的,无论是使用值类型的实例还是指针类型的实例,都是拷贝整个底层数据结构的,方法内部访问的和修改的都是实例的副本。所以,如果有修改操作,不会影响外部原始实例。

  • setage()中,receiver部分(p *person)明确指定了要拷贝的对象是指针类型的实例,无论是指针类型的实例p1还是值类型的p2,都是拷贝指针。所以p2.setage()等价于(&p2).setage()

也就是说,只要receiver是指针类型的,无论是使用值类型的实例还是指针类型的实例,都是拷贝指针,方法内部访问的和修改的都是原始的实例数据结构。所以,如果有修改操作,会影响外部原始实例。

那么选择值类型的receiver还是指针类型的receiver?一般来说选择指针类型的receiver。

package main

import "fmt"

type person struct {
   name string
   age  int
}

func (p person) setname(name string) {
   p.name = name
}
func (p *person) setage(age int) {
   p.age = age
}

func (p *person) getname() string {
   return p.name
}
func (p *person) getage() int {
   return p.age
}

func main() {
   // 指针类型的实例
   p1 := new(person)
   p1.setname("longshuai1")
   p1.setage(21)
   fmt.Println(p1.getname()) // 输出""
   fmt.Println(p1.getage())  // 输出21

   // 值类型的实例
   p2 := person{}
   p2.setname("longshuai2")
   p2.setage(23)
   fmt.Println(p2.getname()) // 输出""
   fmt.Println(p2.getage())  // 输出23
}

上面分别创建了指针类型的实例p1和值类型的实例p2,但无论是p1还是p2,它们调用setname()方法设置的name值都没有影响原始实例中的name值,所以getname()都输出空字符串,而它们调用setage()方法设置的age值都影响了原始实例中的age值。

方法不过是一种特殊的函数,只需将其还原,就知道 receiver T 和 *T 的差别。文章来源地址https://www.toymoban.com/news/detail-409335.html

package main

import "fmt"

type Data struct {
   x int
}

func (self Data) ValueTest() { // func ValueTest(self Data);
   fmt.Printf("Value: %p\n", &self)
}

func (self *Data) PointerTest() { // func PointerTest(self *Data);
   fmt.Printf("Pointer: %p\n", self)
}

func main() {
   d := Data{}
   p := &d
   fmt.Printf("Data: %p\n", p)

   d.ValueTest()   // ValueTest(d)
   d.PointerTest() // PointerTest(&d)

   p.ValueTest()   // ValueTest(*p)
   p.PointerTest() // PointerTest(p)
}

到了这里,关于【Go进阶】详解方法的值类型和指针类型区别的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Go语言之流指针类型,new函数

    计算机中所有的数据都必须放在内存中,不同类型的数据占用的字节数不一样,例如 int 占用 4 个字节。为了正确地访问这些数据,必须为每个字节都编上号码,就像门牌号、身份证号一样,每个字节的编号是唯一的,根据编号可以准确地找到某个字节。 我们将内存中字节的

    2024年02月16日
    浏览(36)
  • 【30天熟悉Go语言】6 Go 复杂数据类型之指针

    Go系列文章: GO开篇:手握Java走进Golang的世界 2 Go开发环境搭建、Hello World程序运行 3 Go编程规约和API包 4 Go的变量、常量、运算符 5 Go 基本数据类型 Go专栏传送链接:https://blog.csdn.net/saintmm/category_12326997.html 和 C/C++ 中的指针不同,Go中的指针不能进行偏移和运算。它是一种类型

    2024年02月09日
    浏览(40)
  • 深入解析Go非类型安全指针:技术全解与最佳实践

    本文全面深入地探讨了Go非类型安全指针,特别是在Go语言环境下的应用。从基本概念、使用场景,到潜在风险和挑战,文章提供了一系列具体的代码示例和最佳实践。目的是帮助读者在保证代码安全和效率的同时,更加精通非类型安全指针的使用。 关注【TechLeadCloud】,分享

    2024年02月08日
    浏览(42)
  • 【C语言进阶(五)】指针进阶详解(上)

    💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:C语言学习分享⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习更多C语言知识   🔝🔝 本篇文章将讲解以下几个方面内容: 字符指针 数组指针 指针数组 数组传参和指针传参 函数指针 在这之前先温故一下指针的概念

    2024年02月12日
    浏览(56)
  • C语言——指针详解(进阶)

    前言: 学完 C语言初阶 后,应该对指针有了初步的了解,下面学习进阶的内容,让我们更快的掌握C语言指针。 指针的概念: 指针就是一个变量,用来存放地址,地址与内存空间一一对应 指针的大小是固定的4/8个字节(32位平台/64位平台) 指针是有类型的,指针的类型决定

    2024年02月16日
    浏览(35)
  • 指针进阶详解

    个人主页:点我进入主页 专栏分类:C语言初阶      C语言程序设计————KTV       C语言小游戏     C语言进阶 欢迎大家点赞,评论,收藏。 一起努力,一起奔赴大厂。 目录 1.字符指针 2.指针数组 3.数组指针 4.数组传参和指针传参 4.一维数组传参 4.2二维数组传参 4.3一

    2024年02月11日
    浏览(30)
  • 指针进阶详解(下)

    在指针进阶详解(上)中,我们已经介绍了部分指针进阶相关知识,接下来我们将继续介绍指针进阶相关知识。 我们知道数组指针,是一个指向数组的指针。同理,函数指针是一个指向函数的指针。 既然是函数指针,就需要取出函数的地址。那函数的地址如何得到呢? 首先

    2024年02月16日
    浏览(31)
  • 指针进阶(详解)

    在开始这篇之前,前面有两篇指针初阶,如果需要的话可以去看看哟!指针初阶1,指针初阶2 对于一个字符串,那么指针又该如何指向呢? 毫无疑问p里存的是地址,那它存了abcdefg的所有地址吗?当然不是,因为它根本存不下(一个指针在32为机器下只有4个字节,如果不太明

    2024年01月20日
    浏览(32)
  • 指针进阶详解(上)

    指针是检验学者对C语言掌握好与坏的重要标准之一,在指针初阶中,我们以及详细介绍了以下内容: 指针是一个变量,用来存放地址,地址唯一标识一块空间。 指针的大小固定为4/8个字节(32位平台/64位平台) 指针是有类型,指针的类型决定了指针±整数的步长,指针解引

    2024年02月15日
    浏览(28)
  • 【进阶C语言】指针的进阶(万字图文详解)

    指针的主题,我们在初级阶段的《指针》章节已经接触过了,我们知道了指针的概念: 指针就是个变量,用来存放地址,地址唯一标识一块内存空间。 指针的大小是固定的4/8个字节(32位平台/64位平台)。 指针是有类型,指针的类型决定了指针的±整数的步长,指针解引用操

    2024年02月01日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包