2016-05-28 38 views
3

我開始學會去和無法理解如下:爲什麼方法簽名必須完全匹配接口方法

package main 

import "fmt" 

type I interface { 
    foo(interface {}) 
} 

type S struct {} 

func (s S) foo(i int) { 
    fmt.Println(i) 
} 

func main() { 
    var i I = S{} 
    i.foo(2) 
} 

這種失敗:

cannot use S literal (type S) as type I in assignment: 
     S does not implement I (wrong type for foo method) 
       have foo(int) 
       want foo(interface {}) 

我不明白爲什麼圍棋不接受foo(int)簽名,因爲int實施了interface {}。任何人都可以幫忙解釋一下嗎?

+1

如果程序的最後一行是由'i.foo(「你好」)'代替,會發生什麼?它不會是一個類型錯誤,因爲'i.foo'接受任何類型的參數。 –

+0

@PaulHankin,這是真的,但你想說什麼呢? – kaspersky

+0

通過它,我的意思是,如果's'滿足接口'I',那麼你就會有一個很好的類型化程序,它用一個字符串參數調用'S.foo',即使它需要一個int參數。所以去的類型系統將不健全。 –

回答

8

我認爲你對界面的理解並不健全。 Interface {}本身就是一種類型。它由兩部分組成:基礎類型和基礎價值。

Golang沒有超載。 Golang類型系統的名字相匹配,需要在類型一致性

所以,當你定義一個函數取一個接口類型作爲參數:

foo(interface {}) 

這是從一個函數取整數類型不同的功能:

foo(int) 

所以,你應該更改以下行

func (s S) foo(i interface{}) { 
    fmt.Println(i) 
} 

或者更好的是這樣的:

type I interface { 
    foo() 
} 

type S struct { 
    I int 
} 

func (s S) foo() { 
    fmt.Println(s.I) 
} 

func main() { 
    var i I = S{2} 
    i.foo() 
} 
相關問題