
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 这是语法问题 I{}这个语法不存在,转换类型是 1 楼说的方法,[]int{1,2,3}是初始化一个 1,2,3 组成的整型切片,int{1}什么也不是 |
4 Maboroshii 2019-10-11 10:07:45 +08:00 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 |