iT邦幫忙

2021 iThome 鐵人賽

DAY 12
0
Modern Web

還喝不 go系列 第 12

[13th][Day12] struct

Day8

go 的變數有著各式各樣的型態: int float string pointer ...
那麼 ...當變數變成一大包的組合時,會發生什麼事呢 ...

一件衣服的 價格、size
車子的 年份、車門數、加速度、油耗、cc數
平面座標系中的 X,Y 座標
一棟房子的 坪數、面寬、樓高、建材...等等
若用單層的變數會顯得非常的笨重

price := 1000000000
size := 100.17
width := 6.6
height := 3.6
kitchen := "BOSCH"
bathroom := "KOHLER"

變數的組合 struct
目前為止的例子中,變數都是儲存單一的值。如果想用變數表示較複雜的概念,請使用 struct

golang 中會使用 結構 (struct) 來表示複合的概念;

來看個簡單的例子

type Demo struct {
    x float64
    y float64
}

如果我們只需要使用結構,但不想創造新的型別,也可以使用匿名結構。

package main
 
import (
    "fmt"
)
 
func main() {
    p := struct {
        x float64
        y float64
    }{x: 3.0, y: 4.0}
 
    fmt.Println(p.x)
    fmt.Println(p.y)
}

可以分別印出 p struct 下,p.x p.y 的值

在宣告 struct時 同時 定義新的型別,以利後續程式呼叫,比方說環境變數、http client 的 domain、grpc client 的連線初始化

struct 是一整包變數的組合,那麼 …
當 struct 裡面又包 struct 時
當 struct 裡面包 struct 然後又包 struct 時 ... 會發生什麼事呢?

下面宣告了 Point 型別,該型別有兩個屬性 (field),分別是 x 和 y,兩者資料型態皆為 float64

接著,我們宣告一個變數 p 以及及賦值;最後,我們呼叫 p 的屬性 x 和 y。

func main() {
    p := Point{x: 3.0, y: 4.0}
 
    fmt.Println(p.x)
    fmt.Println(p.y)
}

struct 裡的屬性,不一定要相同

type Demo struct {
    x1 float64
    x2 int64
    x3 string
    x4 bool
    x5 map[string]interface{}
    x6 []int
}

struct 的屬性,也可以用另一個 struct

package main

import "fmt"

type KitchenSet struct {
	Stove         string // 爐子 sove
	Oven          string // 烤爐
	Dishwasher    string // 洗碗機
	KitchenIsland string // 中島
	Bar           string // 吧台
}

type House struct {
	Name    string
	Price   int
	Size    float64
	Kitchen KitchenSet
}

func main() {
	c := House{
		Name:  "Dibao",
		Price: 1000000000,
		Size:  200.87,
		Kitchen: KitchenSet{
			Stove:         "BOCSH",
			KitchenIsland: "Mediterranean",
			Oven:          "Taya",
		},
	}

	fmt.Println(c.Name)
	fmt.Println(c.Price)
	fmt.Println(c.Kitchen.Stove)

}

我宣告了一個 KitchenSet 類別
接著, House,類別,該型別有四個屬性,分別是 Name、 Price、Size、Kitchen
其中 Kitchen 用到先前宣告的 KitchenSet 類別。

關於 struct 的部分在實務上是非常常用的,除非是很單純的功能 的 func,不然...動輒十幾二十幾個參數,如果不用 struct 的方式做傳遞 , 方法或類別的命名會非常非常的雜亂


上一篇
[13th][Day11] errgroup
下一篇
[13th][Day13] slice
系列文
還喝不 go20

尚未有邦友留言

立即登入留言