在 Go 中,函數參數可以透過值傳遞或指標傳遞的方式傳遞。值傳遞傳遞副本,對副本的修改不會影響原始值;指標傳遞傳遞位址,內容的修改會反映在原始值中。在實戰中,指針傳遞可用於最佳化程式碼,例如在對切片進行排序時。選擇正確的傳遞方式對於優化程式碼和提高效能至關重要。
Go 中函數參數傳遞:值傳遞與指標傳遞
在Go 中,函數參數可以以值傳遞或指標傳遞的方式傳遞。理解這兩種傳遞方式之間的差異對於掌握 Go 程式設計至關重要。
值傳遞
值傳遞是指函數接收傳入參數值的副本。對參數值的任何修改都不會影響原始值。例如:
func changeValue(s string) { s = "modified" } func main() { var s = "original" changeValue(s) fmt.Println(s) //输出: original }
在 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
切片的指標。透過傳入指針,函數可以直接修改切片的內容,無需建立副本。這提高了函數的效率,特別是當切片很大時。
結論
了解值傳遞與指標傳遞的差異對於高效編寫 Go 程式至關重要。值傳遞適用於需要修改副本而不是原始值的情況,而指標傳遞適用於需要修改原始值的情況。根據需要選擇正確的傳遞方式可以優化程式碼並提高程式的效能。
以上是Golang 函數中 struct 指標與 struct 值傳遞的差異的詳細內容。更多資訊請關注PHP中文網其他相關文章!