首页 > 其他分享 >Golang中的参数传递

Golang中的参数传递

时间:2023-06-24 19:33:45浏览次数:27  
标签:参数传递 函数 Golang 传递 参数 引用 类型

Golang中的值传递和引用传递

引言

在编程领域中,Golang 是一种强大而受欢迎的编程语言。它提供了丰富的功能和灵活性,使得开发者能够快速构建高效的应用程序。在 Golang 中,值传递和引用传递是非常重要的概念,对于理解程序的行为和优化代码至关重要。本文将深入探讨 Golang 中的值传递和引用传递,帮助您更好地理解这些概念,并在编写代码时做出更明智的选择。

值传递和引用传递的基本概念

在 Golang 中,函数参数可以通过值传递或引用传递的方式进行传递。这两种传递方式在处理数据时有着不同的行为和效果。

值传递

值传递是指将变量的值复制一份传递给函数的参数。在函数内部对参数进行修改不会影响到原始变量的值。这意味着在函数内部对参数的修改是局部的,不会影响到函数外部的代码。

在 Golang 中,基本类型(如整数、浮点数、布尔值等)都是通过值传递的方式进行传递。例如:

func modifyValue(num int) {
    num = num + 1
}

func main() {
    value := 10
    modifyValue(value)
    fmt.Println(value) // 输出:10
}

在上述代码中,modifyValue 函数接受一个整数参数,并对其进行修改。然而,这个修改只在函数内部有效,并不会影响到 main 函数中的 value 变量的值。

引用传递

引用传递是指将变量的地址传递给函数的参数,函数可以通过这个地址访问和修改原始变量的值。这意味着在函数内部对参数的修改会影响到原始变量的值。

在 Golang 中,切片(slice)、映射(map)和通道(channel)是通过引用传递的方式进行传递。例如:

func modifySlice(slice []int) {
    slice[0] = 100
}

func main() {
    nums := []int{1, 2, 3}
    modifySlice(nums)
    fmt.Println(nums) // 输出:[100, 2, 3]
}

在上述代码中,modifySlice 函数接受一个切片参数,并将第一个元素修改为 100。由于切片是引用传递,所以这个修改会影响到 main 函数中的 nums 切片的值。

如何选择值传递或引用传递

在编写代码时,选择合适的传递方式对程序的性能和行为有着重要的影响。以下是一些选择的指导原则:

选择值传递的情况

  • 当参数是基本类型,并且不需要在函数内部修改参数的值时,可以选择值传递。
  • 当函数需要对参数进行计算或处理,但不希望影响到原始变量的值时,可以选择值传递。

选择引用传递的情况

  • 当参数是切片、映射或通道,并且希望在函数内部修改参数的值时,应选择引用传递。
  • 当函数需要对参数进行大量的读写操作,使用引用传递可以减少内存开销和复制的时间。

在 Golang 中,以下是常见类型的传递方式:

值传递(值类型):

  • 布尔值(bool)
  • 整数类型(int、int8、int16、int32、int64)
  • 无符号整数类型(uint、uint8、uint16、uint32、uint64、uintptr)
  • 浮点数类型(float32、float64)
  • 复数类型(complex64、complex128)
  • 字符串类型(string)
  • 数组类型(array)
  • 结构体类型(struct)
  • 函数类型(function)
  • 接口类型(interface)

引用传递(引用类型):

  • 切片类型(slice)
  • 映射类型(map)
  • 通道类型(channel)
  • 指针类型(pointer)
  • 接口类型(interface)

需要注意的是,虽然切片和映射是引用类型,但它们本身也包含了底层数据的引用。因此,在将切片或映射作为参数传递时,实际上是传递了底层数据的引用的副本。这意味着对切片或映射进行修改会影响到原始数据。

值类型的传递方式是通过复制变量的值传递给函数的参数,而引用类型的传递方式是通过复制变量的引用传递给函数的参数。这种区别导致了在函数内部对参数的修改行为上的差异。

总结

通过本文的介绍,我们深入了解了 Golang 中的值传递和引用传递。值传递是将变量的值复制一份传递给函数的参数,而引用传递是将变量的地址传递给函数的参数。我们还了解了何时应该选择值传递或引用传递,并举例说明了它们的应用场景。了解和掌握这些概念,将有助于我们在编写 Golang 代码时做出更明智的选择,优化程序的性能和行为。

标签:参数传递,函数,Golang,传递,参数,引用,类型
From: https://blog.51cto.com/u_15855860/6541512

相关文章

  • Golang技巧:如何为函数参数添加默认值?
    你是否是那些在Go中缺少默认参数值而感到沮丧的众多程序员之一?如果是的话,你绝对不是一个人!如何为函数参数添加默认值。你是否曾因为Go语言没有默认参数值而感到沮丧?好消息是,你并不孤单!这个令人讨厌的限制会让你的代码更加繁琐,难以阅读。每次都需要写额外的代码来检查参数是否......
  • golang 常用控制协程的三种方式
    waitGroupwaitGroup这种方式适用于一个任务可以被拆分成几个子任务,并且子任务之间的关联程度不高,全部的子任务都完成,才会进行下一阶段的任务。packagemainimport( "fmt" "sync" "time")funcmain(){ varwgsync.WaitGroup wg.Add(3) gofunc(){ deferwg.Do......
  • GoLang在不同系统打包
    配置Mac下编译Linux,Windows平台的64位可执行程序:goenv-wCGO_ENABLED=0GOOS=linuxGOARCH=amd64goenv-wCGO_ENABLED=0GOOS=windowsGOARCH=amd64Linux下编译Mac,Windows平台的64位可执行程序:goenv-wCGO_ENABLED=0GOOS=darwinGOARCH=amd64goenv-wCGO_E......
  • GoLang图形用户界面编程实战(GUI编程)—fyne框架(一)
    一、前言GUI编程:图形用户界面编程。使用fyne框架实现。ps(目的)====>>ps,美图秀秀GUI=========>>fyne框架msys2模拟linux,在msys2中安装fyne框架二、安装msys2(win模拟linux)下载地址1(阿里镜像):https://mirrors.aliyun.com/msys2/distrib/x86_64/?spm=a2c6h.25603864.0.0.4e6c1484CbwZd......
  • golang 给对象的基础数据类型的指针类型的属性赋值
    概要有时我们可能碰到定义成下面这样的结构体,结构体里某些属性是基础数据类型,更确切的说,是基础数据类型的指针类型。typeStudentstruct{ namestring`json:"name"` age*int`json:"age"`//age是整型指针}不可行的写法此时该如何对这种成员属性进行赋值呢,下面......
  • golang 的 sync.WaitGroup
    WaitGroup的用途:它能够一直等到所有的goroutine执行完成,并且阻塞主线程的执行,直到所有的goroutine执行完成。官方对它的说明如下:AWaitGroupwaitsforacollectionofgoroutinestofinish.ThemaingoroutinecallsAddtosetthenumberofgoroutinestowaitfor.Thenea......
  • Golang 做的几个跟性能有关的工具
    1、Vegetahttps://github.com/tsenart/vegetaVegeta是一个万能的HTTP负载测试工具,提供命令行工具和一个开发包。使用方法:$vegetaattack-hUsageofattack:-duration=10s:Durationofthetest-header=:Targetsrequestheader-ordering="random":Attackorderi......
  • win下 golang 跨平台编译
    本篇文章是win下的跨平台编译。安装GCC编译器(MinGW)我们需要GCC编译环境,这里我选择的是:MinGW。mac下安装了Xcode自动就带了GCC,win下没有,所以我们用MinGW这个最小化安装的GCC。MinGW官网提供了一种自动在线下载安装的gui小程序,http://sourceforge.net/projects/mingw/files/Install......
  • Golang 中文转拼音
    翻遍整个GitHub,Golang中文转拼音类库,怎么就这么难找呢?于是我造了一个轮子:中文转拼音类库.目前来说应该是最好用的了.GitHub传送门:https://github.com/Lofanmi/pinyin-golang如果说基于汉字拼音字典,逐个汉字替换,也是可以转换的,但是碰到多音字就很麻烦了.而......
  • Golang如何优雅地关闭 channel
    Golang如何优雅地关闭channel萧瑟 golang面试经典讲解 2023-05-3121:00 发表于上海一、介绍想必听说过go的,应该都知道go的最大的特性goroutine并发编程,而说到并发编程,使用channel进行数据传输是go中的必修课。go的并发哲学:不要通过共享内存来通信,而要通过通......