V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
xnile
V2EX  ›  Go 编程语言

请教一个 golang 接口问题

  •  
  •   xnile · 2019-10-11 09:56:34 +08:00 · 3658 次点击
    这是一个创建于 1880 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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()
    

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

    12 条回复    2019-10-11 17:29:55 +08:00
    Aphsss
        1
    Aphsss  
       2019-10-11 10:00:50 +08:00
    把 i3 := I{s} 换成 i3 := I(s) ?
    xnile
        2
    xnile  
    OP
       2019-10-11 10:07:10 +08:00
    @Aphsss 不成
    Vegetable
        3
    Vegetable  
       2019-10-11 10:07:18 +08:00   ❤️ 1
    这是语法问题
    I{}这个语法不存在,转换类型是 1 楼说的方法,[]int{1,2,3}是初始化一个 1,2,3 组成的整型切片,int{1}什么也不是
    Maboroshii
        4
    Maboroshii  
       2019-10-11 10:07:45 +08:00   ❤️ 1
    i3 := s
    AzadCypress
        5
    AzadCypress  
       2019-10-11 10:07:52 +08:00 via Android
    []I{s}
    是 I 类型切片字面量,就像 []int{1}一样,而如果你用 int{1}就会报同样的错误
    sirgod
        6
    sirgod  
       2019-10-11 10:09:49 +08:00
    没有 I{s}这种语法,你可以 var i3 I = s,或者像楼上说的 i3 := I(s)
    xnile
        7
    xnile  
    OP
       2019-10-11 10:10:29 +08:00
    @Vegetable
    @AzadCypress 感谢二位指点,明白了
    shawnli0711
        8
    shawnli0711  
       2019-10-11 10:15:39 +08:00
    i2 赋值一个切片,语法正确;
    i3 赋值一个接口?语法说不通啊。
    ixx
        9
    ixx  
       2019-10-11 10:31:31 +08:00
    说白了就是接口不能实例化,但可以定义接口数组并初始化元素
    xnile
        10
    xnile  
    OP
       2019-10-11 10:54:59 +08:00
    @shawnli0711
    @ixx 对,知道接口不能实例化,语法不存在,但是没想到[]切片初始化这块,一下子没转过弯,犯二了。
    reus
        11
    reus  
       2019-10-11 15:51:34 +08:00
    @Vegetable
    @sirgod
    这个是 composite literal 语法,语法是没问题的,问题是 I 是接口类型,不是复合类型。如果 I 是复合类型,例如 type I []int,那 I{1, 2, 3}是可以编译的
    zunceng
        12
    zunceng  
       2019-10-11 17:29:55 +08:00
    上面几位是漏了 `&`吧
    ```
    i3 := I(&s)
    i3.say()
    ```
    这样? 没怎么读过官方的文档 不知道这个怎么叫 我只知道 pointer 可以直接转成对应的 interface
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1196 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 18:25 · PVG 02:25 · LAX 10:25 · JFK 13:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.