请教一个 golang 接口问题

2019-10-11 09:56:34 +08:00
 xnile

package main

import ( "fmt" )

type I interface { say() }

type S struct { name string }

func (s S) say() { fmt.Println(s.name) }

func main() { var s = S{"Jay"} fmt.Println(s)

var i1 I = s
i1.say()

i2 := []I{s} // 这里可以
i2[0].say()

i3 := I{s} //这里报错 invalid type for composite literal: I
i3.say()

} 请教一下,这段代码不理解为什么切片接口类型就能赋值,而接口类型就不可以

3675 次点击
所在节点    Go 编程语言
12 条回复
Aphsss
2019-10-11 10:00:50 +08:00
把 i3 := I{s} 换成 i3 := I(s) ?
xnile
2019-10-11 10:07:10 +08:00
@Aphsss 不成
Vegetable
2019-10-11 10:07:18 +08:00
这是语法问题
I{}这个语法不存在,转换类型是 1 楼说的方法,[]int{1,2,3}是初始化一个 1,2,3 组成的整型切片,int{1}什么也不是
Maboroshii
2019-10-11 10:07:45 +08:00
i3 := s
AzadCypress
2019-10-11 10:07:52 +08:00
[]I{s}
是 I 类型切片字面量,就像 []int{1}一样,而如果你用 int{1}就会报同样的错误
sirgod
2019-10-11 10:09:49 +08:00
没有 I{s}这种语法,你可以 var i3 I = s,或者像楼上说的 i3 := I(s)
xnile
2019-10-11 10:10:29 +08:00
@Vegetable
@AzadCypress 感谢二位指点,明白了
shawnli0711
2019-10-11 10:15:39 +08:00
i2 赋值一个切片,语法正确;
i3 赋值一个接口?语法说不通啊。
ixx
2019-10-11 10:31:31 +08:00
说白了就是接口不能实例化,但可以定义接口数组并初始化元素
xnile
2019-10-11 10:54:59 +08:00
@shawnli0711
@ixx 对,知道接口不能实例化,语法不存在,但是没想到[]切片初始化这块,一下子没转过弯,犯二了。
reus
2019-10-11 15:51:34 +08:00
@Vegetable
@sirgod
这个是 composite literal 语法,语法是没问题的,问题是 I 是接口类型,不是复合类型。如果 I 是复合类型,例如 type I []int,那 I{1, 2, 3}是可以编译的
zunceng
2019-10-11 17:29:55 +08:00
上面几位是漏了 `&`吧
```
i3 := I(&s)
i3.say()
```
这样? 没怎么读过官方的文档 不知道这个怎么叫 我只知道 pointer 可以直接转成对应的 interface

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/608111

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX