首页 > 其他分享 >(转)Golang中自动“取引用”和“解引用”对原值的影响

(转)Golang中自动“取引用”和“解引用”对原值的影响

时间:2023-01-16 17:57:20浏览次数:36  
标签:原值 com fmt Golang 引用 type email user

原文:https://blog.csdn.net/u014633283/article/details/83902020

1. 写在前面
我们知道Golang在调用方法时,会自动对实参进行“取引用”或“解引用”操作。我们在前面的博客Golang对方法接收者变量的自动“取引用”和“解引用”中也已经讨论了容易引起混淆的解/取引用和接口相关的知识,这里我们将讨论另一个问题:“自动取引用”和“自动解引用”会不会对原值产生影响。
我们知道这样一个规则:

规则1: 当传递给方法的实参是一个值类型时,原值的内容不会受到影响,因为传递进来的是原值的副本;相反,当传递给方法的实参是一个指针类型时,原值的内容将可能受到影响。

但本文讨论一个比较特殊的情况是:“自动解引用”时receive会从指针类型转变为值类型,而“自动取引用”时receiver会从值类型转变为指针类型,这是否会对规则1产生影响。

2. 实验验证
我们还是用代码来说明问题。demo1.go分别演示了四种情形:

用值类型的实参调用形参为值类型的方法
用指针类型的实参调用形参为值类型的方法(会进行“自动解引用”)
用值类型的实参调用形参为指针类型的方法(会进行“自动取引用”)
用指针类型的实参调用形参为指针类型的方法
//demo1.go
package main

import "fmt"

// user defines a user in the program.
type user struct {
email string
}

// changeEmailByValue implements a method with a value receiver.
func (u user) changeEmailByValue(email string) {
u.email = email
}


// changeEmailByPointer implements a method with a pointer receiver.
func (u *user) changeEmailByPointer(email string) {
u.email = email
}

func main() {
alice := user{"[email protected]"} // value type
fmt.Printf("Alice's original email:%s\n", alice.email)
alice.changeEmailByValue("[email protected]")
fmt.Printf("ChangeEmailByValue with a value type: %s\n", alice.email)

bob := &(user{"[email protected]"}) // pointer type
fmt.Printf("Bob's original email:%s\n", bob.email)
bob.changeEmailByValue("[email protected]")
fmt.Printf("ChangeEmailByValue with a pointer type: %s\n", bob.email)

carol := user{"[email protected]"} // value type
fmt.Printf("Carol's original email:%s\n", carol.email)
carol.changeEmailByPointer("[email protected]")
fmt.Printf("ChangeEmailByPointer with a value type: %s\n", carol.email)

dave := &(user{"[email protected]"}) // pointer type
fmt.Printf("Dave's original email:%s\n", dave.email)
dave.changeEmailByPointer("[email protected]")
fmt.Printf("ChangeEmailByPointer with a pointer type: %s\n", dave.email)
}

代码运行结果如下图所示

 

 

 


3. 小结
从运行结果可以发现,“自动解引用”和“自动取引用”都不会改变规则1,方法的调用是否会对原值产生影响完全取决于该方法的形参是值类型还是参数类型。

标签:原值,com,fmt,Golang,引用,type,email,user
From: https://www.cnblogs.com/liujiacai/p/17056015.html

相关文章

  • golang map的定义与使用
    Mapmap是一堆键值对的未排序集合,比如以身份证号作为唯一键来标识一个人的信息。map是引用类型,键必须支持相等运算符(==,!=)类型,比如:int,string,float等内建类型,只含......
  • golang 的fmt 包实现了格式化I/O函数,类似于C的 printf 和 scanf。
      #定义示例类型和变量typeHumanstruct{Namestring}varpeople=Human{Name:"zhangsan"} 普通占位符占位符说明......
  • golang切片
    切片切片并不是数组或者数组指针,切片只是对数组中连续片断的引用,这个片断可以是整个数组,也可以是由起始索引和终止索引标识的数组,所以切片是一个引用类型。//切......
  • python 引用
    >>>a=256>>>id(a)139840231892864>>>b=256>>>id(b)139840231892864>>>id(a)==id(b)True>>>a=257>>>id(a)139840094039632>>>b=257>>>id(b)1398400......
  • delphi 在cxgrid表中设置下拉菜单,以及更新多表引用的数据表
    我写的博客内容,都是在实际生产中遇到的问题,针对性很强,记录下来有两个目的,一是当成笔记,二是丰富Delphi的网上资料,让遇到相同问题的朋友,少走弯路. 如下图,我希望所......
  • golang 为图片加水印
    前段时间一个需求涉及到给图片加水印,考虑图片安全性,决定放在后端加水印。记录一下代码。思路思路是先为水印文字生成一个仅包含水印文字的图片,把这个图片倾斜一定角度(......
  • (转)Golang - new和make的使用和区别(示例详解)
    原文:https://www.cnblogs.com/beatleC/p/16081832.html前言:Go语言中new和make是内置函数,主要用来创建分配类型内存(相同点:堆上),其功能相似,却有本质区别。引入:变量的声明v......
  • (转)golang 函数
    原文:https://www.cnblogs.com/duoke360/p/15663943.htmlgolang函数简介函数的go语言中的一级公民,我们把所有的功能单元都定义在函数中,可以重复使用。函数包含函数的名称......
  • golang实现的一个小游戏–猜数字
    随机生成一个数字,输入一个数字看是否匹对,匹配则结速,反之提示是大了还是小了,代码如下:packagemainimport("bufio""fmt""math/rand""os""strconv""time")var......
  • golang交叉编译
    先设置为运行平台,再设置内核类型,再编译产出常见平台有:android、darwin、linux、windows内核类型提供uname-a可以查看:amd64、arm64、386  setGOOS=linuxsetGOARC......