go 指針類(lèi)型參數(shù)傳遞有兩種方式:值傳遞:函數(shù)獲得指針副本,對(duì)副本的更改不影響原始指針。引用傳遞:函數(shù)獲得對(duì)原始指針的引用,對(duì)引用的更改影響原始指針。
Go 指針類(lèi)型參數(shù)傳遞機(jī)制
在 Go 中,指針類(lèi)型參數(shù)以兩種不同的方式傳遞給函數(shù):值傳遞和引用傳遞。
值傳遞
如果將指針值作為值傳遞給函數(shù),則函數(shù)將獲得該指針的副本。對(duì)該副本所做的任何更改都不會(huì)影響原始指針。
代碼示例:
package main import "fmt" func changeValue(ptr *int) { *ptr = 10 } func main() { ptr := new(int) *ptr = 5 fmt.Println(*ptr) // 輸出: 5 changeValue(ptr) fmt.Println(*ptr) // 輸出: 5 }
登錄后復(fù)制
引用傳遞
如果將指針地址作為值傳遞給函數(shù),則函數(shù)將獲得對(duì)原始指針的引用。對(duì)該引用所做的任何更改都會(huì)影響原始指針。
代碼示例:
package main import "fmt" func changePointer(ptr **int) { *ptr = new(int) **ptr = 10 } func main() { ptr := new(int) *ptr = 5 fmt.Println(*ptr) // 輸出: 5 changePointer(&ptr) fmt.Println(*ptr) // 輸出: 10 }
登錄后復(fù)制
實(shí)戰(zhàn)案例
在以下實(shí)戰(zhàn)案例中,我們使用值傳遞和引用傳遞來(lái)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的鏈表。
使用值傳遞實(shí)現(xiàn)鏈表:
type Node struct { value int next *Node } func createList(values []int) *Node { head := &Node{value: values[0]} current := head for _, v := range values[1:] { next := &Node{value: v} current.next = next current = next } return head } func printList(head *Node) { for current := head; current != nil; current = current.next { fmt.Printf("%d ", current.value) } fmt.Println() } func main() { values := []int{1, 2, 3, 4, 5} head := createList(values) printList(head) // 輸出: 1 2 3 4 5 }
登錄后復(fù)制
使用引用傳遞實(shí)現(xiàn)鏈表:
type Node struct { value int next **Node } func createList(values []int) *Node { head := &Node{value: values[0]} current := head for _, v := range values[1:] { next := &Node{value: v} *current.next = next current = next } return head } func printList(head *Node) { for current := head; current != nil; current = *current.next { fmt.Printf("%d ", current.value) } fmt.Println() } func main() { values := []int{1, 2, 3, 4, 5} head := createList(values) printList(head) // 輸出: 1 2 3 4 5 }
登錄后復(fù)制
在第一個(gè)示例中,我們使用值傳遞創(chuàng)建鏈表。在第二個(gè)示例中,我們使用引用傳遞創(chuàng)建鏈表。執(zhí)行結(jié)果都是相同的,但使用引用傳遞時(shí),我們可以在函數(shù)中修改鏈表的順序。