Go每日一题(111) 的题目如下

3193 次点击 · 3 赞 ·大约8小时之前 开始浏览   · 来源「Golang来啦」

如果 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
}
3193 阅读
23 回复
NovaChaos
NovaChaos · #1 · 3年之前

mk

feiyang
feiyang · #2 · 3年之前

go 中有些的变量不可以寻址,指的是不能通过&获得其地址。

所以 func( *A ) 只能接收 *A, func( A ) 可以接收 A 或者 *A ,通过指针一定能得到变量的值 *A -> A

brothersam
brothersam · #3 · 3年之前

BD,(B不是太确定)

Dessert
Dessert · #4 · 3年之前
feiyangfeiyang #2 回复

go 中有些的变量不可以寻址,指的是不能通过&获得其地址。 所以 func( `*A` ) 只能接收 `*A`, func( A ) 可以接收 A 或者 `*A` ,通过指针一定能得到变量的值 `*A` -> A

mark:func(A)可以接收A和A,func(A)只能A,因为有些变量不可寻址(&获取地址)

euibieur894
euibieur894 · #5 · 3年之前

打卡

wzbwzt
wzbwzt · #6 · 3年之前

1

hasbug
hasbug · #7 · 3年之前

mark

k8scat
k8scat · #8 · 3年之前

C

brothersam
brothersam · #9 · 2年之前

AC

bsdx866
bsdx866 · #10 · 2年之前

image.png

NovaChaos
NovaChaos · #11 · 2年之前

mk

wzbwzt
wzbwzt · #12 · 2年之前

1

feiyang
feiyang · #13 · 2年之前

go 中有些的变量不可以寻址,指的是不能通过&获得其地址。

所以 func( *A ) 只能接收 *A, func( A ) 可以接收 A 或者 *A ,通过指针一定能得到变量的值 *A -> A

还比如 map 里面 的 value 也是不可寻地址的,因为 map 扩容后,value 地址就会改变

Neightly
Neightly · #14 · 2年之前
feiyangfeiyang #13 回复

go 中有些的变量不可以寻址,指的是不能通过&获得其地址。 所以 func( `*A` ) 只能接收 `*A`, func( A ) 可以接收 A 或者 `*A` ,通过指针一定能得到变量的值 `*A` -> A 还比如 map 里面 的 value 也是不可寻地址的,因为 map 扩容后,value 地址就会改变

八个月前是错的,八个月后还是错的。

feiyang
feiyang · #15 · 2年之前

14楼 @Neightly 菜鸟愚昧,麻烦大佬指点, 感激不尽

Neightly
Neightly · #16 · 2年之前
feiyangfeiyang #15 回复

14楼 @Neightly 菜鸟愚昧,麻烦大佬指点, 感激不尽

As with selectors, a reference to a non-interface method with a value receiver using a pointer will automatically dereference that pointer: pt.Mv is equivalent to (*pt).Mv.

As with method calls, a reference to a non-interface method with a pointer receiver using an addressable value will automatically take the address of that value: t.Mp is equivalent to (&t).Mp.

仅限于selector和method(receiver),普通参数可没有这待遇。而且这里面还涉及method set和wrapper method,想扯的话还是挺多的。

至于你说的因为 map 扩容后,value 地址就会改变并不是理由,至少不够充分。

有没有想过栈也会扩容为什么就可以寻址了呢。

你不能说因为栈上adjustpointer比较容易所以可以寻址,map比较难那就算了吧。

既然栈可以寻址,函数返回值难道不是在栈上(go1.17之后有点模糊,但之前可是很确定的),怎么就不行了呢?

YuPeng
YuPeng · #17 · 2年之前

mark

hasbug
hasbug · #18 · 2年之前

mark

528548004
528548004 · #19 · 2年之前

mark

na-ee
na-ee · #20 · 2年之前

image.png func( A ) 只能接收 A, func( A ) 可以接收 A 或者 A ,通过指针一定能得到变量的值 A -> A

huangyf168
huangyf168 · #21 · 2年之前

mark

YuPeng
YuPeng · #22 · 大约1年之前

mark

Qmfuser
Qmfuser · #23 · 大约1年之前

mark

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传