首页 > 其他分享 >Go 快速入门指南 - 变长参数和指针参数

Go 快速入门指南 - 变长参数和指针参数

时间:2022-12-24 18:37:14浏览次数:59  
标签:int fmt go 参数 numbers func Go main 指针

变长参数

在函数的最后一个参数的数据类型之前加上省略号 ​​...​​​ ,表示该参数的数据类型是 ​​变长类型​​​, 调用该函数时可以传递任意数量 ​​( 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 快速入门指南 - 变长参数和指针参数_Go

标签:int,fmt,go,参数,numbers,func,Go,main,指针
From: https://blog.51cto.com/u_15915979/5967428

相关文章

  • Go 快速入门指南 - defer 函数
    概述一个 ​​defer​​ 语句就是一个普通的函数或方法调用。 ​​defer​​ 语句保证了不论是在正常情况下(return返回),还是非正常情况下(发生错误,程序终止),函数......
  • Go 快速入门指南 - panic/recover 函数
    panic​​panic​​​ 会终止程序并退出,因此只有在发生严重的错误时才会使用 ​​panic​​。例子主动触发packagemainfuncmain(){panic("someerror...")}//$go......
  • Go 快速入门指南 - 结构体
    概述​​结构体​​​ 是将零个或多个字段(变量)组合在一起的复合数据类型,类似于面向对象语言中的 ​​对象​​。结构体以及其字段都使用 可见性 规则。语法规则type......
  • Go 快速入门指南 - 嵌套结构体
    概述Go支持将多个结构体通过嵌套的方式,组成一个大的结构体,降低了单个结构体复杂度,同时提高了结构体之间组合的灵活性。例子为了省略篇幅,本小节只使用 ​​字面量​​​ ......
  • Go 快速入门指南 - 函数
    概述​​函数​​ 是将一个或者一类问题包装为一个代码块,可以被多次调用,提高代码重用性。Go函数中声明、定义、参数、返回值这些基础概念,和其他编程语言中的一致,这里不再......
  • Go 快速入门指南 - init 函数
    概述​​init()函数​​ 是一个特殊的函数,一般称为初始化函数,不能被调用。 在每个文件里面,当程序启动或者文件被作为包引用的时候,init()函数就会自动执行,一般用来做一......
  • Go 快速入门指南 - 接口和方法
    接口Go接口是隐式实现。 对于一个数据类型,无需声明它实现了哪些接口,只需要实现接口必需的方法即可。当然了,存在一个小问题就是:我们可能无意间实现了某个接口:),所以 ​......
  • Go 快速入门指南 - 判断是否实现接口
    判断是否实现接口Go里面没有 ​​implements​​ 关键字来判断一个结构体(对象)是否实现了某个接口, 要实现类似的功能,需要用到 ​​类型断言​​。类型断言//判断......
  • Go 快速入门指南 - 零值和错误
    零值当一个变量使用 ​​var​​​ 进行声明后并未进行初始化(变量后面没有赋值符 ​​=​​)操作,会默认分配一个零值(zerovalue)。不同类型对应的零值类型零值boolf......
  • Go 快速入门指南 - 类型比较
    概述​​比较运算符​​​ 用来比较两个操作数并返回一个 ​​bool​​ 值,常见的比较运算符:==等于!=不等于<小于<=小于等于>大于>=大于等于......