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 的值並沒有被改變,說明參數傳遞是拷貝了一個副本,也就是拷貝了一份新的內容進行運算。
map
、slice
、interface
、channel
這些數據類型本身就是指針類型的,所以就算是拷貝傳值也是拷貝的指針,拷貝後的參數仍然指向底層數據結構,所以修改它們可能會影響外部數據結構的值。
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