在 Golang 的世界裡,實作介面是隱含式的,意思是說我實做一個介面的時候,並不會在該 type 上宣告我有實作哪一個介面,在這情況下,我要怎麼確保有正確實作該介面的方法呢?

其實我們可以用下面的語法檢查在編譯時期是否可以正常編譯。 線上範例: https://play.golang.org/p/Dmve5CBompA

compiled check
  • go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package main

func main() {
}

var _ myinterface = (*user)(nil)

type myinterface interface {
GetName(id int) string
}

type user struct {}

func(user) OtherMethod(id int) string {
return "Miles"
}

我的 user 沒有實作 myinterface,所以因為這行 var _ myinterface = (*user)(nil) 的關係,他在編譯的時候就會跳出下列的錯誤。

./prog.go:4:6: cannot use (user)(nil) (type user) as type myinterface in assignment:
*user does not userement myinterface (missing GetName method)

var _ myinterface = (*user)(nil) 是什麼意思呢? 根據 Compile time checks to ensure your type satisfies an interface 的說法

Essentially you are casting nil to a type of pointer to MyType. It’s a zero-memory way to represent a pointer to your struct in Go.


這是說,我用 nil 轉型成 *user type,並且轉型後用 myinterface 的型別來接,用這樣的方式就可以在編譯時期確保介面有被正確實作。

其他補充,我們也可以用 Type assertions 來判斷是否可以轉型成該介面。

延伸閱讀

[How can I guarantee my type satisfies an interface?]
[Compile time checks to ensure your type satisfies an interface]