在 Go 的世界裡,interface 被定義為一組 method signatures
透過 interface 來定義一個物件的行為
此外也可以當作是能儲存任意型別的變數值
這裡用 A Tour of Go 上的官方範例來做示範
package main
import (
"fmt"
"math"
)
// Abser is an interface
type Abser interface {
Abs() float64
}
// MyFloat is alias of float64
type MyFloat float64
// Abs is a method of MyFloat
func (f MyFloat) Abs() float64 {
if f < 0 {
return float64(-f)
}
return float64(f)
}
// Vertex is a struct
type Vertex struct {
X, Y float64
}
// Abs is a method of Vertex
func (v *Vertex) Abs() float64 {
return math.Sqrt(v.X*v.X + v.Y*v.Y)
}
func main() {
var a Abser
f := MyFloat(-math.Sqrt2)
v := Vertex{3, 4}
a = f
a = &v
fmt.Println(a.Abs())
}
下面就來逐一講解~
Abser
這個 interface,並定義 Abs() float64
function -> Line 9~11
type MyFloat
為 float64
的 alias (別名) -> Line 14
type MyFloat
實作 Abser interface 中的 Abs() float64
function -> Line 17~22
Vertex
這個物件 -> Line 25~27
Vertex
這個物件實作 Abser interface 中的 Abs() float64
function -> Line 30~32
Abser interface
的變數 a -> Line 35
type MyFloat
的變數 f -> Line 36
Vertex
物件的變數 v -> Line 37
MyFloat
有實作 Abser interface
,所以才能進行傳遞) -> Line 39
*Vertex
有實作 Abser interface
,所以才能進行傳遞) -> Line 40
package main
import "fmt"
func main() {
var i interface{}
a := 10
i = a
fmt.Printf("%T,%v\n", i, i)
b := "Hello"
i = b
fmt.Printf("%T,%v\n", i, i)
}
/* 輸出結果
int,10 // Line 10 輸出
string,Hello // Line 14 輸出
*/
今天簡單介紹了 Go 的 interface 用法
struct + method + interface = Go 實現物件導向很重要的要素
下一篇要來介紹「泛型的美好,值得你擁有」的 generic
明天見~