上代码
package main import( "fmt" ) // 声明一个基于 int 的类型 Integer type Integer int // 基于指针的传递( Integer 类型的指针变量 a ) func (a* Integer) Add_pointer (b Integer) { *a += b } // 基于值的传递,按理,经过这次调用,也是对 a 进行重新赋值,为什么调用之后,再去打印,还是以前的值? func (a Integer) Add_value (b Integer) { a += b } func main() { var a Integer = 1 var b Integer = 1 a.Add_pointer(2) b.Add_value(2) fmt.Println("a =", a) fmt.Println("b =", b) } // a=3 // b=1
为什么会有这个输出?
![]() | 1 yatsun 2020-11-20 12:15:26 +08:00 学过 c 吗,子函数里的是形参,是额外开辟的空间,不会改变原本的值 |
2 BoarBoar 2020-11-20 12:16:46 +08:00 C 语言学过吧?一样的 指针就是变量 a 的内存地址,在原变量上+2 对于 b 实际上是新创建了一个变量,暂且叫做 b(1)吧,b(1)实际上是新的一块内存,+2 后对原变量没影响 |
![]() | 3 raaaaaar 2020-11-20 12:17:12 +08:00 via Android ![]() 忘记指针,忘记值传递,忘记传值这些概念。 记住:一个是操作一块内存,一个是操作两块内存。 |
![]() | 4 shangyes 2020-11-20 12:29:15 +08:00 方法是函数 ```golang func Add_pointer(a* Integer, b Integer) { *a += b } func Add_value(a, b Integer) { a += b } ``` |
6 6ufq0VLZn0DDkL80 2020-11-20 14:41:30 +08:00 go 里面只有值传递,记着这一点就行了。只不过有时候这个值是一个指针。 |
![]() | 7 cco 2020-11-20 14:46:20 +08:00 值传递!没有别的。 |
![]() | 8 xkeyideal 2020-11-20 14:52:08 +08:00 从 C 语言的角度来说,a.Add_pointer(2) 这一行代码都不会编译通过的,另外呢,无脑指针会比较方便,但指针并非都是最优解 |
![]() | 9 hzfyjgw 2020-11-20 14:58:33 +08:00 |
![]() | 10 lance6716 2020-11-20 15:05:25 +08:00 via Android 其实一直对这个很迷惑,尤其是到了含有指针的结构体时:传指针的地址就不叫传值了吗 |
11 joesonw 2020-11-20 15:07:00 +08:00 4 楼是正解. go 不是 OOP, 没有 class, 都只是方法而已. 例如 type S struct {} func (s *S) Say() { println("hello world") } func main() { var s *S s.Say() } 是正常运行的 https://play.golang.org/p/7pQ51IZ-4rB |
12 chor02 2020-11-20 18:32:19 +08:00 via iPhone 可以理解 func (a* Integer)和 func (a Integer)中的 a*和 a 也是一 |
13 ghjacky 2020-11-20 19:11:30 +08:00 这个是 go 里边的 receiver,不过类似于参数传递,都是值传递(拷贝了一份数据),指针传递也是值传递,只不过指针类型的数据本身就是一内存地址,所以,更改指针指向内存空间的值,原始值也会改变啊。 |
![]() | 14 ScepterZ 2020-11-20 19:14:27 +08:00 你这句话属于瞎说……这个 a 是复制来的,不是原来那个 基于值的传递,按理,经过这次调用,也是对 a 进行重新赋值 |