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()
} 请教一下,这段代码不理解为什么切片接口类型就能赋值,而接口类型就不可以
1
Aphsss 2019-10-11 10:00:50 +08:00
把 i3 := I{s} 换成 i3 := I(s) ?
|
3
Vegetable 2019-10-11 10:07:18 +08:00 1
这是语法问题
I{}这个语法不存在,转换类型是 1 楼说的方法,[]int{1,2,3}是初始化一个 1,2,3 组成的整型切片,int{1}什么也不是 |
4
Maboroshii 2019-10-11 10:07:45 +08:00 1
i3 := s
|
5
AzadCypress 2019-10-11 10:07:52 +08:00 via Android
[]I{s}
是 I 类型切片字面量,就像 []int{1}一样,而如果你用 int{1}就会报同样的错误 |
6
sirgod 2019-10-11 10:09:49 +08:00
没有 I{s}这种语法,你可以 var i3 I = s,或者像楼上说的 i3 := I(s)
|
7
xnile OP |
8
shawnli0711 2019-10-11 10:15:39 +08:00
i2 赋值一个切片,语法正确;
i3 赋值一个接口?语法说不通啊。 |
9
ixx 2019-10-11 10:31:31 +08:00
说白了就是接口不能实例化,但可以定义接口数组并初始化元素
|
10
xnile OP |
11
reus 2019-10-11 15:51:34 +08:00
|
12
zunceng 2019-10-11 17:29:55 +08:00
上面几位是漏了 `&`吧
``` i3 := I(&s) i3.say() ``` 这样? 没怎么读过官方的文档 不知道这个怎么叫 我只知道 pointer 可以直接转成对应的 interface |