type Test struct {
Name string
}
func main() {
var tt Test
change(&tt)
fmt.Println(tt.Name) // out change
}
func change(t *Test) {
t2 := new(Test)
t2.Name = "change"
*t = *t2 // 请问这句话怎么解释,做了什么?
}
type Test struct {
Name string
}
func main() {
var tt Test
change(&tt)
fmt.Println(tt.Name) // out change
}
func change(t *Test) {
t2 := new(Test)
t2.Name = "change"
*t = *t2 // 请问这句话怎么解释,做了什么?
}
是不是想复杂了?
t = t2 // 请问这句话怎么解释,做了什么?
t2 是一个指针变量,t2 是dereference 运算,取得t2 指针所指向的值,赋值给予 t
t 也是dereference 运算,意思是修改了指针t 的值。
函数传的参数是指针,所以函数内部修改了t的值,所以调用函数后,值被修改了。
package main
import "fmt"
type Test struct {
Name string
}
func main() {
var tt Test
change(&tt)//把tt的地址传到参数里
fmt.Println(tt.Name) // out change
}
func change(t Test/是一个指针,t的地址*/) {
t2 := new(Test)//创建了一个类型为Test的空指针
t2.Name = "change" //给T2所指向的地址里的值,赋值(初始为空)
t = t2 // 取T2的指针所指向的值赋值给t的指针所指向的值
}
7 回答5.3k 阅读
6 回答6.8k 阅读✓ 已解决
4 回答2.3k 阅读
1 回答3.3k 阅读
2 回答886 阅读✓ 已解决
2 回答2.2k 阅读
1 回答2.1k 阅读
自己打印下指针的地址是否会变动就知道了:
打印结果是:
很明显两个赋值语句的结果是指针的地址变动了。也就是语句
*t = *t2
的作用是不变动t
的指针的前提下,变更t
的值,而直接赋值t=t2
不会导致函数调用方t
的值变动,也就是不会导致外部的tt
的值变动。因此,如果你的
change
函数是为了对传递进来的t
做相关操作,又要影响外部,因此不能使用直接赋值语法t=t2
对t
赋值。