如果 Add() 函数的调用代码为:
func main() {
var a Integer = 1
var b Integer = 2
var i interface{} = &a
sum := i.(*Integer).Add(b)
fmt.Println(sum)
}
则Add函数定义正确的是:
A.
type Integer int
func (a Integer) Add(b Integer) Integer {
return a + b
}
B.
type Integer int
func (a Integer) Add(b *Integer) Integer {
return a + *b
}
C.
type Integer int
func (a *Integer) Add(b Integer) Integer {
return *a + b
}
D.
type Integer int
func (a *Integer) Add(b *Integer) Integer {
return *a + *b
}
mk
go 中有些的变量不可以寻址,指的是不能通过&获得其地址。
所以 func(
*A
) 只能接收*A
, func( A ) 可以接收 A 或者*A
,通过指针一定能得到变量的值*A
-> ABD,(B不是太确定)
mark:func(A)可以接收A和A,func(A)只能A,因为有些变量不可寻址(&获取地址)
打卡
1
mark
C
AC
mk
1
go 中有些的变量不可以寻址,指的是不能通过&获得其地址。
所以 func(
*A
) 只能接收*A
, func( A ) 可以接收 A 或者*A
,通过指针一定能得到变量的值*A
-> A还比如 map 里面 的 value 也是不可寻地址的,因为 map 扩容后,value 地址就会改变
八个月前是错的,八个月后还是错的。
14楼 @Neightly 菜鸟愚昧,麻烦大佬指点, 感激不尽
仅限于selector和method(receiver),普通参数可没有这待遇。而且这里面还涉及method set和wrapper method,想扯的话还是挺多的。
至于你说的
因为 map 扩容后,value 地址就会改变
并不是理由,至少不够充分。有没有想过栈也会扩容为什么就可以寻址了呢。
你不能说因为栈上
adjustpointer
比较容易所以可以寻址,map比较难那就算了吧。既然栈可以寻址,函数返回值难道不是在栈上(go1.17之后有点模糊,但之前可是很确定的),怎么就不行了呢?
mark
mark
mark
mark
mark
mark