iT邦幫忙

2023 iThome 鐵人賽

DAY 13
0
Cloud Native

【하나, 둘, ready, get set, go】系列 第 13

【하나, 둘, ready, get set, go】Day 13 - interface

  • 分享至 

  • xImage
  •  

前情提要

在 Go 的世界裡,interface 被定義為一組 method signatures

透過 interface 來定義一個物件的行為

此外也可以當作是能儲存任意型別的變數值

實際操作

method signatures

這裡用 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())
}

下面就來逐一講解~

  1. 宣告 Abser 這個 interface,並定義 Abs() float64 function -> Line 9~11
  2. 宣告 type MyFloatfloat64 的 alias (別名) -> Line 14
  3. type MyFloat 實作 Abser interface 中的 Abs() float64 function -> Line 17~22
  4. 宣告 Vertex 這個物件 -> Line 25~27
  5. Vertex 這個物件實作 Abser interface 中的 Abs() float64 function -> Line 30~32
  6. 宣告型別為 Abser interface 的變數 a -> Line 35
  7. 宣告型別為 type MyFloat 的變數 f -> Line 36
  8. 宣告型別為 Vertex 物件的變數 v -> Line 37
  9. 將 f 傳遞給 a (因為 MyFloat 有實作 Abser interface,所以才能進行傳遞) -> Line 39
  10. 將 &v 傳遞給 a (因為 *Vertex 有實作 Abser interface,所以才能進行傳遞) -> Line 40
  11. 輸出結果 (這裡輸出的會是 &v 的 Abs 結果) -> Line 42

儲存任意型別的變數值

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

明天見~


上一篇
【하나, 둘, ready, get set, go】Day 12 - method
下一篇
【하나, 둘, ready, get set, go】Day 14 - generic
系列文
【하나, 둘, ready, get set, go】30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言