iT邦幫忙

2023 iThome 鐵人賽

DAY 12
0
Cloud Native

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

【하나, 둘, ready, get set, go】Day 12 - method

  • 分享至 

  • xImage
  •  

前情提要

Go 跟其他語言不太一樣,就是沒有 classes,但是可以自己在型別上定義 method

method 簡單來說就是一個帶有 接受器 (receiver) 參數的 function

下面我們就來實際操作看看吧~

實際操作

package main

import "fmt"

type Album struct {
    ID     int
    Name   string
    Artist string
    Year   int
}

func (a Album) GetName() string {
    return a.Name
}

func main() {
    album := Album{
    	ID:     1,
    	Name:   "KILL MY DOUBT",
    	Artist: "ITZY",
    	Year:   2023,
    }
    fmt.Println(album.GetName())
}

講解

在前面第 8 天介紹 struct 的時候有說過,struct 是 Go 實現物件導向很重要的要素
(除了 struct 跟 method 外,還有後面兩天會介紹的 functions、interface)

Line 5~10

首先,我們先建立一個 Album struct

type Album struct {
    ID     int
    Name   string
    Artist string
    Year   int
}

Line 12~14

接著建立一個 帶有 Album struct 的 receiver function GetName() string

這個 GetName() string function 的用途是回傳專輯名稱

func (a Album) GetName() string {
    return a.Name
}

Line 17~23

宣告一個變數 album 來初始化 Album 物件

最後透過變數 album 來使用 Album 物件作為 receiver 的 GetName() string function

func main() {
    album := Album{
    	ID:     1,
    	Name:   "KILL MY DOUBT",
    	Artist: "ITZY",
    	Year:   2023,
    }
    fmt.Println(album.GetName())
}

順帶一提

method 中的 receiver 並不要求是 struct,也可以是自己定義的型別,或是我們前一天介紹的 pointers 指標

像是 A Tour of Go 上的兩個官方範例

使用自定義型別

package main

import (
    "fmt"
    "math"
)

// MyFloat 是自己定義的型別
type MyFloat float64

// Abs 是 MyFloat 的 Method
func (f MyFloat) Abs() float64 {
    if f < 0 {
        return float64(-f)
    } else {
        return float64(f)
    }
}

func main() {
    f := MyFloat(-math.Sqrt2)
    fmt.Println(f.Abs())
}

使用 pointers 指標

package main

import (
    "fmt"
    "math"
)

type Vertex struct {
    X, Y float64
}

// Abs 是 Vertex 的 Method
func (v Vertex) Abs() float64 {
    return math.Sqrt(v.X*v.X + v.Y*v.Y)
}

// Scale 是 *Vertex 的 Method
func (v *Vertex) Scale(f float64) {
    v.X *= f
    v.Y *= f
}

func main() {
    v := Vertex{3, 4}
    v.Scale(10)
    fmt.Println(v.Abs())
}

總結

今天簡單介紹了 Go 的 method 用法

下一篇會來介紹同為 Go 用來實現物件導向的 interface

明天見~


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

尚未有邦友留言

立即登入留言