Go は厳密に型指定されたプログラミング言語であり、その関数パラメータは値によって渡されます。これは、パラメーターを関数に渡すとき、実際にはパラメーターの値のコピーを作成し、その値を処理のために関数に渡していることを意味します。したがって、Go で関数のパラメータ受け渡しを使用する場合は、次の点に注意する必要があります。
Go では、基本的なデータ型に加えて、値型を除くすべてのデータ型は参照型です。値型のデータを関数の引数として渡す場合は値のコピーが関数に渡され、参照型のデータを関数の引数として渡す場合はメモリ上のデータのアドレスが渡されます。
例として、値型と参照型のそれぞれのパラメータの受け渡し処理を見てみましょう。
package main import "fmt" func main() { // 值类型参数传递 var a = 10 fmt.Println("Before call func: ", a) // 输出 10 changeByVal(a) fmt.Println("After call func: ", a) // 输出 10 // 引用类型参数传递 var b = []int{1, 2, 3} fmt.Println("Before call func: ", b) // 输出 [1 2 3] changeByRef(b) fmt.Println("After call func: ", b) // 输出 [4 5] } // 值类型参数传递 func changeByVal(num int) { num = 100 } // 引用类型参数传递 func changeByRef(arr []int) { arr[0] = 4 arr[1] = 5 }
値型のパラメータの受け渡しの場合、パラメータが渡されても、関数内では、パラメーター値は 100 に変更されますが、外部変数は影響を受けません。参照型パラメータを渡した場合、関数内でパラメータが変更され、関数外の実データにも影響が及びます。
参照型データを変更したい場合、ポインタ型パラメータの受け渡しを使用できます。ポインタは変数のアドレスを格納するデータ型で、Go では値によっても渡されます。
& 演算子を使用して変数のアドレスを取得し、* 演算子を使用してアドレスに格納されているデータを取得できます。
例:
package main import "fmt" func main() { var a = 10 var b *int b = &a fmt.Println("Before call func: ", a) // 输出 10 changeByPtr(b) fmt.Println("After call func: ", a) // 输出 100 } func changeByPtr(num *int) { *num = 100 }
ポインターが指すデータ (元の変数 a) が関数内で変更され、実際の外部データも影響を受けることがわかります。
関数が可変長パラメーターを受け取る必要がある場合は、... を使用してそれを表すこともできます。この構文は、Python の args および kwargs に似ています。
例:
package main import "fmt" func main() { printNames("John", "Alice", "Bob") } func printNames(names ...string) { for _, name := range names { fmt.Println(name) } }
この例では、可変長パラメーターを使用して関数 printNames を定義し、受け取るパラメーターのタイプは文字列です。関数内では、 range を使用してすべてのパラメーターを反復処理し、その値を 1 つずつ出力します。
概要
Go では、関数のパラメーターの受け渡しは値によって行われるため、値の型と参照型の違いに注意する必要があります。参照型のデータを変更する必要がある場合は、ポインタ型のパラメータの受け渡しを使用できます。さらに、... を使用して可変長パラメータを表すこともでき、関数が可変長のパラメータを受け取りやすくなります。
以上がGoで関数の引数を渡すにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。