ホームページ >バックエンド開発 >Golang >Golang関数における構造体ポインタと構造体の値転送の違い

Golang関数における構造体ポインタと構造体の値転送の違い

WBOY
WBOYオリジナル
2024-05-31 19:43:59960ブラウズ

Go では、関数のパラメーターを値またはポインターで渡すことができます。値で渡すとコピーが渡され、コピーへの変更は元の値に影響しません。ポインターで渡すとアドレスが渡され、内容への変更は元の値に反映されます。実際には、ポインターの受け渡しは、スライスをソートする場合などにコードを最適化するために使用できます。コードを最適化し、パフォーマンスを向上させるには、適切な配信方法を選択することが重要です。

Golang 函数中 struct 指针与 struct 值传递的区别

Goでの関数パラメータの受け渡し: 値の受け渡しとポインタの受け渡し

Goでは、関数のパラメータを値またはポインタで渡すことができます。これら 2 つの配信方法の違いを理解することは、Go プログラミングを習得するために重要です。

値渡し

値渡しとは、関数が受信パラメーターの値のコピーを受け取ることを意味します。パラメーター値を変更しても、元の値には影響しません。例:

func changeValue(s string) {
    s = "modified"
}

func main() {
    var s = "original"
    changeValue(s)
    fmt.Println(s) //输出: original
}

changeValue 関数の sstring 型のコピーです。 s を変更しても、main 関数の元の s 変数には影響しません。 changeValue 函数中,sstring 类型的副本。对 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。