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 という名前のスライスに保存されます。これらのパラメータのデータ型はすべて 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]
実行結果からわかるように、関数を呼び出した後、スライスの内容が変更されました。
可変長パラメータ
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