banner
biuaxia

biuaxia

"万物皆有裂痕,那是光进来的地方。"
github
bilibili
tg_channel

【转载】golang函数的参数

title: 【转载】golang 函数的参数
date: 2022-06-17 16:58:00
toc: false
index_img: http://api.btstu.cn/sjbz/?lx=m_dongman&cid=4
category:

  • Go
    tags:
  • Golang

原文:golang 函数的参数 - Golang 技术栈,Golang 文章、教程、视频分享!,本站仅作保存记录及调整排版,不做盈利性质的商业行为。

提示:本文有提到指针传递的类型!

go 语言函数可以有 0 或多个参数,参数需要指定 数据类型

声明函数时的参数列表叫做形参,调用时传递的参数叫做实参。

go 语言是通过传值的方式传参的,意味着传递给函数的是拷贝后的副本,所以函数内部访问、修改的也是这个副本。

go 语言可以使用 变长参数 ,有时候并不能确定参数的个数,可以使用变长参数,可以在函数定义语句的参数部分使用 ARGS...TYPE的方式。这时会将 ...代表的参数全部保存到一个名为 ARGS 的 slice 中,注意这些参数的数据类型都是 TYPE。

go 语言函数的参数实例#

go 语言传参

// 形参列表
func f1(a int, b int) int {
	if a > b {
		return a
	} else {
		return b
	}
}

func main() {
	// 实参列表
	r := f1(1, 2)
	fmt.Printf("r: %v\n", r)
}

演示参数传递,按值传递

func f1(a int) {
	a = 200
	fmt.Printf("a1: %v\n", a)
}

func main() {
	a := 100
	f1(a)
	fmt.Printf("a: %v\n", a)
}

运行结果

a1: 200
a: 100

从运行结果可以看到,调用函数 f1 后,a 的值并没有被改变,说明参数传递是拷贝了一个副本,也就是拷贝了一份新的内容进行运算。

mapsliceinterfacechannel这些数据类型本身就是指针类型的,所以就算是拷贝传值也是拷贝的指针,拷贝后的参数仍然指向底层数据结构,所以修改它们可能会影响外部数据结构的值。

package main

import "fmt"

func f1(a []int) {
	a[0] = 100
}

func main() {
	a := []int{1, 2}
	f1(a)
	fmt.Printf("a: %v\n", a)
}

运行结果

a: [1 2]
a: [100 2]

从运行结果发现,调用函数后,slice 内容被改变了。

变长参数

package main

import "fmt"

func f1(args ...int) {
	for _, v := range args {
		fmt.Printf("v: %v\n", v)
	}
}
func f2(name string, age int, args ...int) {
	fmt.Printf("name: %v\n", name)
	fmt.Printf("age: %v\n", age)
	for _, v := range args {
		fmt.Printf("v: %v\n", v)
	}
}
func main() {
	f1(1, 2, 3)
	fmt.Println("------------")
	f1(1, 2, 3, 4, 5, 6)
	fmt.Println("------------")
	f2("tom", 20, 1, 2, 3)
}

运行结果

v: 1
v: 2
v: 3
------------
v: 1
v: 2
v: 3
v: 4
v: 5
v: 6
------------
name: tom
age: 20
v: 1
v: 2
v: 3
加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。