Go では、関数のパラメーターを値またはポインターで渡すことができます。値で渡すとコピーが渡され、コピーへの変更は元の値に影響しません。ポインターで渡すとアドレスが渡され、内容への変更は元の値に反映されます。実際には、ポインターの受け渡しは、スライスをソートする場合などにコードを最適化するために使用できます。コードを最適化し、パフォーマンスを向上させるには、適切な配信方法を選択することが重要です。
Goでの関数パラメータの受け渡し: 値の受け渡しとポインタの受け渡し
Goでは、関数のパラメータを値またはポインタで渡すことができます。これら 2 つの配信方法の違いを理解することは、Go プログラミングを習得するために重要です。
値渡し
値渡しとは、関数が受信パラメーターの値のコピーを受け取ることを意味します。パラメーター値を変更しても、元の値には影響しません。例:
func changeValue(s string) { s = "modified" } func main() { var s = "original" changeValue(s) fmt.Println(s) //输出: original }
changeValue
関数の s
は string
型のコピーです。 s
を変更しても、main
関数の元の s
変数には影響しません。 changeValue
函数中,s
是 string
类型的副本。对 s
的修改不会影响 main
函数中的原始 s
变量。
指针传递
指针传递是指函数接收传入参数的地址。对参数内容的任何修改都会反映在原始变量中。例如:
func changePointer(s *string) { *s = "modified" } func main() { var s = "original" changePointer(&s) fmt.Println(s) //输出: modified }
在 changePointer
函数中,s
是指向原始 string
变量 s
的指针。对 *s
的修改会直接修改 main
函数中的原始 s
变量。
实战案例
以下是一个利用指针传递在实际场景中进行代码优化的示例:
type Person struct { Name string Age int } func sortByName(people []Person) { for i := 0; i < len(people)-1; i++ { for j := i + 1; j < len(people); j++ { if people[i].Name > people[j].Name { // 交换 people[i] 和 people[j] people[i], people[j] = people[j], people[i] } } } } func main() { people := []Person{ {"Alice", 20}, {"Bob", 25}, {"Charlie", 30}, } sortByName(people) fmt.Println(people) //输出: [{Alice 20} {Bob 25} {Charlie 30}] }
在这个示例中,sortByName
函数接收一个 Person
ポインターの受け渡し
ポインターの受け渡しとは、関数が受信パラメーターのアドレスを受け取ることを意味します。パラメータの内容を変更すると、元の変数に反映されます。例:rrreee
changePointer
関数の s
は、元の string
変数 s
へのポインターです。 *s
を変更すると、main
関数内の元の s
変数が直接変更されます。 🎜🎜🎜実践的なケース🎜🎜🎜 以下は、実際のシナリオでのコード最適化のためのポインタ受け渡しの使用例です: 🎜rrreee🎜 この例では、sortByName
関数は person を受け取ります。
スライスへのポインタ。ポインタを渡すことにより、この関数はコピーを作成せずにスライスの内容を直接変更できます。これにより、特にスライスが大きい場合、関数の効率が向上します。 🎜🎜🎜結論🎜🎜🎜 値による受け渡しとポインターによる受け渡しの違いを理解することは、Go プログラムを効率的に作成するために重要です。値による受け渡しは、元の値ではなくコピーを変更する必要がある場合に適しており、ポインターによる受け渡しは、元の値を変更する必要がある場合に適しています。ニーズに応じて適切な配信方法を選択すると、コードが最適化され、プログラムのパフォーマンスが向上します。 🎜以上がGolang関数における構造体ポインタと構造体の値転送の違いの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。