首頁 >後端開發 >Golang >Golang 函數中 struct 指標與 struct 值傳遞的差異

Golang 函數中 struct 指標與 struct 值傳遞的差異

WBOY
WBOY原創
2024-05-31 19:43:59964瀏覽

在 Go 中,函數參數可以透過值傳遞或指標傳遞的方式傳遞。值傳遞傳遞副本,對副本的修改不會影響原始值;指標傳遞傳遞位址,內容的修改會反映在原始值中。在實戰中,指針傳遞可用於最佳化程式碼,例如在對切片進行排序時。選擇正確的傳遞方式對於優化程式碼和提高效能至關重要。

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

Go 中函數參數傳遞:值傳遞與指標傳遞

在Go 中,函數參數可以以值傳遞或指標傳遞的方式傳遞。理解這兩種傳遞方式之間的差異對於掌握 Go 程式設計至關重要。

值傳遞

值傳遞是指函數接收傳入參數值的副本。對參數值的任何修改都不會影響原始值。例如:

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

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

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 切片的指標。透過傳入指針,函數可以直接修改切片的內容,無需建立副本。這提高了函數的效率,特別是當切片很大時。

結論

了解值傳遞與指標傳遞的差異對於高效編寫 Go 程式至關重要。值傳遞適用於需要修改副本而不是原始值的情況,而指標傳遞適用於需要修改原始值的情況。根據需要選擇正確的傳遞方式可以優化程式碼並提高程式的效能。

以上是Golang 函數中 struct 指標與 struct 值傳遞的差異的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn