Go和Java聚合量变量的区别 2022-04-19 23:09 > 标量:普通变量;聚合量:类或者结构体那样的变量。 ```go package main import "fmt" //swag: Go中指针的体验以及和Java的区别 type person struct { age int name string } func test1(i int64) { i = 10; } func test2(i *int64) { *i = 10; } func test3(str string) { str = "10" } func test4(str *string) { *str = "10" } func test5(per person) { per.age = 10 per.name = "10" } func test6(per *person) { per.age = 10 per.name = "10" } func main() { var i int64 = 0 test1(i) fmt.Println(i)//0 var j int64 = 0 test2(&j) fmt.Println(j)//10 var s1 string = "0" test3(s1) fmt.Println(s1)//0 var s2 string = "0" test4(&s2) fmt.Println(s2)//10 var per1 person = person{ age: 0, name: "0", } test5(per1) fmt.Println(per1)//{0 0} var per2 person = person{ age: 0, name: "0", } test6(&per2) fmt.Println(per2)//{10 10} var per3 *person = &person{ age: 0, name: "0", } test5(*per3)//per3是指针,*per3是取他的值,将值传给test5函数的参数per,所以函数里改变的是临时参数per的东西 fmt.Println(per3)//&{0 0} var per4 *person = &person{ age: 0, name: "0", } test6(per4)//per4是指针,储存的是地址,将地址传给test6的参数per,修改的是per的内容,但是per是一个地址,所以修改的是该地址的内容,所以影响会是永久的,外面的per4也指向这块地址,所以会改变。 fmt.Println(per4)//&{10 10} /* 总结: Go中的结构体和Java不同。普通变量一样,但是结构体和类变量的底层不同。 Java中的类,定义的变量,该变量直接储存的就是地址,所以传入函数中直接就能修改掉。 而Go中所有的变量(普通变量int、string...和结构体变量struct)储存的都只是值而已,只有通过*,显式指针的方式,才能在函数内修改掉这块地址储存的值(并影响到函数外)。【有点不太记得了,C/C++好像也是这样吧】 */ } ``` --END--
发表评论