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 という名前のスライスに保存されます。これらのパラメータのデータ型はすべて 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]

実行結果からわかるように、関数を呼び出した後、スライスの内容が変更されました。

可変長パラメータ

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
読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。