Go 快速入门指南 - 变长参数和指针参数
2022/12/28 4:24:06
本文主要是介绍Go 快速入门指南 - 变长参数和指针参数,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
变长参数
在函数的最后一个参数的数据类型之前加上省略号 ...
,表示该参数的数据类型是 变长类型
, 调用该函数时可以传递任意数量 ( 0 - N )
的该类型的参数。
一个函数只能有一个变长参数,且变长参数必须为最后一个参数。
例子
传递一个参数
package main import "fmt" func sum(numbers ...int) int { total := 0 for _, num := range numbers { total += num } return total } func main() { fmt.Printf("1 = %d\n", sum(1)) } // $ go run main.go // 输出如下 /** 1 = 1 */
传递多个参数
package main import "fmt" func sum(numbers ...int) int { total := 0 for _, num := range numbers { total += num } return total } func main() { fmt.Printf("1 + 2 + 3 = %d\n", sum(1, 2, 3)) } // $ go run main.go // 输出如下 /** 1 + 2 + 3 = 6 */
传递切片参数
如果要传递 切片类型
数据作为函数参数,只需要在参数后面加上省略号 ...
。
package main import "fmt" func sum(numbers ...int) int { total := 0 for _, num := range numbers { total += num } return total } func main() { numbers := []int{1, 2, 3} fmt.Printf("1 + 2 + 3 = %d\n", sum(numbers...)) // 切片变量后面加 ... 即可 } // $ go run main.go // 输出如下 /** 1 + 2 + 3 = 6 */
不传递任何参数
package main import "fmt" func sum(numbers ...int) int { total := 0 for _, num := range numbers { total += num } return total } func main() { fmt.Printf("不传递任何参数 = %d\n", sum()) } // $ go run main.go // 输出如下 /** 不传递任何参数 = 0 */
指针参数
建议先阅读指针小节。
例子
指针变量参数
package main import "fmt" func double(n int) { n *= 2 } func doubleWithPtr(n *int) { *n *= 2 } func main() { n := 100 double(n) fmt.Printf("使用普通变量作为函数参数执行完成后, n = %d\n", n) // 可以看到,变量值并未发生变化 doubleWithPtr(&n) fmt.Printf("使用指针变量作为函数参数执行完成后, n = %d\n", n) // 变量值已经发生变化 } // $ go run main.go // 输出如下 /** 使用普通变量作为函数参数执行完成后, n = 100 使用指针变量作为函数参数执行完成后, n = 200 */
指针数组变量参数
package main import "fmt" func double(numbers [3]int) { for _, v := range numbers { v *= 2 } } func doubleWithPtr(numbers *[3]int) { for i := range numbers { numbers[i] *= 2 } } func main() { numbers := [3]int{100, 200, 300} double(numbers) fmt.Printf("使用数组变量作为函数参数执行完成后, n = %d\n", numbers) // 可以看到,数组元素并未发生变化 doubleWithPtr(&numbers) fmt.Printf("使用指针数组变量作为函数参数执行完成后, n = %d\n", numbers) // 数组元素已经发生变化 } // $ go run main.go // 输出如下 /** 使用数组变量作为函数参数执行完成后, n = [100 200 300] 使用指针数组变量作为函数参数执行完成后, n = [200 400 600] */
切片参数
在 切片 小节中讲到,切片的底层引用了一个数组,可以简单地理解为:切片本身是一个指针,指向底层数组的元素, 所以常用的方式的是将函数参数定义为切片类型。
package main import "fmt" func double(numbers []int) { for i := range numbers { numbers[i] *= 2 } } func main() { numbers := []int{100, 200, 300} double(numbers) fmt.Printf("使用切片变量作为函数参数执行完成后, n = %d\n", numbers) // 切片元素已经发生变化 } // $ go run main.go // 输出如下 /** 使用切片变量作为函数参数执行完成后, n = [200 400 600] */
小结
默认情况下,Go 的函数参数传递方式使用 值传递
,也就是说,修改参数的值不会影响到 原变量
, 如果希望修改参数的同时修改 原变量
,需要传递变量的引用 (指针)。
对于基础数据类型 (如 int, float, bool 等),需要传递值的地址,对于已经是 引用类型
的数据类型 (如切片、通道等),直接传递值即可。
这篇关于Go 快速入门指南 - 变长参数和指针参数的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-20go-zero 框架的 RPC 服务 启动start和停止 底层是怎么实现的?-icode9专业技术文章分享
- 2024-12-19Go-Zero 框架的 RPC 服务启动和停止的基本机制和过程是怎么实现的?-icode9专业技术文章分享
- 2024-12-18怎么在golang中使用gRPC测试mock数据?-icode9专业技术文章分享
- 2024-12-15掌握PageRank算法核心!你离Google优化高手只差一步!
- 2024-12-15GORM 中的标签 gorm:"index"是什么?-icode9专业技术文章分享
- 2024-12-11怎么在 Go 语言中获取 Open vSwitch (OVS) 的桥接信息(Bridge)?-icode9专业技术文章分享
- 2024-12-11怎么用Go 语言的库来与 Open vSwitch 进行交互?-icode9专业技术文章分享
- 2024-12-11怎么在 go-zero 项目中发送阿里云短信?-icode9专业技术文章分享
- 2024-12-11怎么使用阿里云 Go SDK (alibaba-cloud-sdk-go) 发送短信?-icode9专业技术文章分享
- 2024-12-10搭建个人博客网站之一、使用hugo创建个人博客网站