iT邦幫忙

2023 iThome 鐵人賽

DAY 8
0
Cloud Native

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

【하나, 둘, ready, get set, go】Day 8 - struct

  • 分享至 

  • xImage
  •  

前情提要

我們在前一天介紹了 Go 的 Array、Slices

今天要來介紹的是 Go 很重要的資料結構 - struct

我們可以使用 struct 來將一連串相關的資訊包裝起來,變成資料
像是 API Request、Response 等

而 struct 也是 Go 要實作物件導向很重要的一個要素

在這篇,我們先不會提到物件導向相關的東西,後面再來提~

結構宣告

在 Go 要宣告 struct 也很簡單,語法如下

// 語法
type <struct 名稱> struct {
  <結構成員 1> <型別> <Tag>
  <結構成員 2> <型別> <Tag>
  ...
  <結構成員 n> <型別> <Tag>
}

實際範例如下

// Example
type Album struct {
  Name string `json:"name"`
  Singer string `json:"singer"`
  ReleaseDate string `json:"releaseDate"`
  Price float64 `json:"price"`
}

以上面的例子來說,我們宣告了一個叫做 Album 的 struct
其包含四個成員,分別如下

  • Album (struct)
    • Name (string)
    • Singer (string)
    • ReleaseDate (string)
    • Price (float64)

結構使用

基本款

接下來就用這個 Album struct 來說明如何使用

package main

import "fmt"

type Album struct {
    Name string `json:"name"`
    Singer string `json:"singer"`
    ReleaseDate string `json:"releaseDate"`
    Price float64 `json:"price"`
}

func main() {
    album := Album{
        Name:        "KILL MY DOUBT",
        Singer:      "ITZY",
        ReleaseDate: "2023-07-31",
        Price:       13400,
    }
    jsonData, err := json.Marshal(album)
    if err != nil {
        fmt.Println(err)
    } else {
        fmt.Println(string(jsonData))
    }
}

輸出結果如下

{
    "name": "KILL MY DOUBT",
    "singer": "ITZY",
    "releaseDate": "2023-07-31",
    "price": 13400
}

我們在 5~10 行的地方,宣告了 Album struct
接著在 13~18 行的地方,宣告一個型別為 Album struct 的變數 album,並賦值給他
接著在 19~24 行,將其轉成 JSON 後印出

上面的宣告 (13~18 行),其實也可以改寫成下面這樣
不寫對應的結構成員名稱,Go 會自己去對應 (但我自己是習慣會寫啦)

album := Album{
    "KILL MY DOUBT",
    "ITZY",
    "2023-07-31",
    13400,
}

透過 struct 將欄位抽離

接下來要介紹的是在 struct A 中使用 struct B 來將欄位抽離的用法
雖然單看這句話,感覺會有點難理解用途,不如實際用一次就知道了

針對價格部分,我們多新增一些欄位
因為專輯可能會有很多版本,每個版本的價格都不盡相同
struct 定義好之後像下面這樣

type Price struct {
    Version string  `json:"version"`
    Price   float64 `json:"price"`
    Unit    string  `json:"unit"`
}

接著將原先的 Price 欄位改成這邊新定義的 Price struct

type Album struct {
    Name        string  `json:"name"`
    Singer      string  `json:"singer"`
    ReleaseDate string  `json:"releaseDate"`
    Price
}

type Price struct {
    Version string  `json:"version"`
    Price   float64 `json:"price"`
    Unit    string  `json:"unit"`
}

/* 上面這種寫法,等於下面這樣
type Album struct {
    Name        string  `json:"name"`
    Singer      string  `json:"singer"`
    ReleaseDate string  `json:"releaseDate"`
    Version     string  `json:"version"`
    Price       float64 `json:"price"`
    Unit        string  `json:"unit"`
}
*/

宣告部分,改寫如下

album := Album{
    Name:        "KILL MY DOUBT",
    Singer:      "ITZY",
    ReleaseDate: "2023-07-31",
    Price: Price{
        Version: "STANDARD",
        Price:   13400,
        Unit:    "KRW",
    },
}

輸出結果如下

{
    "name": "KILL MY DOUBT",
    "singer": "ITZY",
    "releaseDate": "2023-07-31",
    "version": "STANDARD",
    "price": 13400,
    "unit": "KRW"
}

這種抽離的用法我自己覺得會是偏向模組化的感覺
將一個大 struct 透過多個小 struct 來組成
維護上感覺也會比較方便?

宣告型別為 struct 的成員

此外也可以在結構中宣告型別為結構的成員,像是下面這樣
我們將 Price 改寫,改寫完的 struct 如下

type Album struct {
    Name        string  `json:"name"`
    Singer      string  `json:"singer"`
    ReleaseDate string  `json:"releaseDate"`
    Prices      []Price `json:"prices"`
}

type Price struct {
    Version string  `json:"version"`
    Price   float64 `json:"price"`
    Unit    string  `json:"unit"`
}

宣告部分,改寫後如下

album := Album{
    Name:        "KILL MY DOUBT",
    Singer:      "ITZY",
    ReleaseDate: "2023-07-31",
    Prices: []Price{
        {Version: "LIMITED", Price: 13400, Unit: "KRW"},
        {Version: "STANDARD", Price: 13400, Unit: "KRW"},
        {Version: "DIGIPACK", Price: 10400, Unit: "KRW"},
        {Version: "CASSETTE", Price: 10400, Unit: "KRW"},
    },
}

輸出結果如下

{
    "name": "KILL MY DOUBT",
    "singer": "ITZY",
    "releaseDate": "2023-07-31",
    "prices": [
        {
            "version": "LIMITED",
            "price": 13400,
            "unit": "KRW"
        },
        {
            "version": "STANDARD",
            "price": 13400,
            "unit": "KRW"
        },
        {
            "version": "DIGIPACK",
            "price": 10400,
            "unit": "KRW"
        },
        {
            "version": "CASSETTE",
            "price": 10400,
            "unit": "KRW"
        }
    ]
}

總結

今天簡單介紹了 Go 的 struct 基本用法

用 Go 實作物件導向時,struct 會是一個重點

下一篇會來介紹 map 的用法

明天見~


上一篇
【하나, 둘, ready, get set, go】Day 7 - Array、slices
下一篇
【하나, 둘, ready, get set, go】Day 9 - map
系列文
【하나, 둘, ready, get set, go】30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言