The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
xnile

请教一个 golang 接口问题

  •  
  •   xnile · Oct 11, 2019 · 4289 views
    This topic created in 2433 days ago, the information mentioned may be changed or developed.

    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 replies    2019-10-11 17:29:55 +08:00
    Aphsss
        1
    Aphsss  
       Oct 11, 2019
    把 i3 := I{s} 换成 i3 := I(s) ?
    xnile
        2
    xnile  
    OP
       Oct 11, 2019
    @Aphsss 不成
    Vegetable
        3
    Vegetable  
       Oct 11, 2019   ❤️ 1
    这是语法问题
    I{}这个语法不存在,转换类型是 1 楼说的方法,[]int{1,2,3}是初始化一个 1,2,3 组成的整型切片,int{1}什么也不是
    Maboroshii
        4
    Maboroshii  
       Oct 11, 2019   ❤️ 1
    i3 := s
    AzadCypress
        5
    AzadCypress  
       Oct 11, 2019 via Android
    []I{s}
    是 I 类型切片字面量,就像 []int{1}一样,而如果你用 int{1}就会报同样的错误
    sirgod
        6
    sirgod  
       Oct 11, 2019
    没有 I{s}这种语法,你可以 var i3 I = s,或者像楼上说的 i3 := I(s)
    xnile
        7
    xnile  
    OP
       Oct 11, 2019
    @Vegetable
    @AzadCypress 感谢二位指点,明白了
    shawnli0711
        8
    shawnli0711  
       Oct 11, 2019
    i2 赋值一个切片,语法正确;
    i3 赋值一个接口?语法说不通啊。
    ixx
        9
    ixx  
       Oct 11, 2019
    说白了就是接口不能实例化,但可以定义接口数组并初始化元素
    xnile
        10
    xnile  
    OP
       Oct 11, 2019
    @shawnli0711
    @ixx 对,知道接口不能实例化,语法不存在,但是没想到[]切片初始化这块,一下子没转过弯,犯二了。
    reus
        11
    reus  
       Oct 11, 2019
    @Vegetable
    @sirgod
    这个是 composite literal 语法,语法是没问题的,问题是 I 是接口类型,不是复合类型。如果 I 是复合类型,例如 type I []int,那 I{1, 2, 3}是可以编译的
    zunceng
        12
    zunceng  
       Oct 11, 2019
    上面几位是漏了 `&`吧
    ```
    i3 := I(&s)
    i3.say()
    ```
    这样? 没怎么读过官方的文档 不知道这个怎么叫 我只知道 pointer 可以直接转成对应的 interface
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3625 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 43ms · UTC 04:46 · PVG 12:46 · LAX 21:46 · JFK 00:46
    ♥ Do have faith in what you're doing.