理解 Go 的对象值传递
在 Go 中,函数参数是按值传递的。当对象作为参数传递时,将创建该对象的副本并将其传递给函数。这意味着函数内对对象所做的任何更改都不会影响函数外的原始对象。
Go 中的指针值
但是,理解这一点很重要传递值和传递指针之间的区别。指针是对内存位置的引用。当您将指针传递给函数时,您传递的是对象的地址,而不是对象本身的副本。这意味着通过指针对对象进行的更改将影响函数外部的原始对象。
要理解这个概念,让我们看一个示例:
package main import ( "fmt" "runtime" ) type Something struct { number int queue chan int } func gotest(s *Something, done chan bool) { fmt.Printf("from gotest:\n") fmt.Printf("Address of s: %p\n", &s) for num := range s.queue { fmt.Printf("Value received: %d\n", num) s.number = num } done <- true } func main() { runtime.GOMAXPROCS(4) s := new(Something) fmt.Printf("Address of s in main: %p\n", &s) s.queue = make(chan int) done := make(chan bool) go gotest(s, done) // Passing a pointer to gotest s.queue <- 42 close(s.queue) <-done fmt.Printf("Address of s in main: %p\n", &s) fmt.Printf("Final value of s.number: %d\n", s.number) }
输出:
Address of s in main: 0x4930d4 from gotest: Address of s: 0x4974d8 Value received: 42 Address of s in main: 0x4930d4 Final value of s.number: 42
在此示例:
结论:
在 Go 中,理解值传递和值传递之间的区别至关重要并通过指针传递。当您需要更改函数外部的对象时,请将指向该对象的指针作为参数传递。但是,出于打印目的,建议使用 fmt 包而不是使用 println(&s) 以避免与指针值有关的任何混淆。
以上是Go的传值机制如何影响函数中的对象修改?的详细内容。更多信息请关注PHP中文网其他相关文章!