iT邦幫忙

2021 iThome 鐵人賽

DAY 10
0
自我挑戰組

30 天學 Golang?Go 啦哪次不 Go系列 第 10

Day#10 Struct

來到了第十天,今天要更深入了解 struct 在 Go 裡面扮演的角色,
話不多說,我們就進入正題吧 ─=≡Σ(((っ゚∀゚)っ

Structure

Structure(簡稱 Struct)在 Go 能讓使用者透過集合不同資料打包成一個自行定義型別,而透過自定義型別生出來的資料,在物件導向的概念就可以被稱作實體,甚至可以把它想像成是一個無法繼承的類別。

struct 起手式:

type Cat struct {
	name string
	age  int
}

一個 struct 可能會有零到多個欄位,每個欄位都會對應一個資料型態。
如果 struct 有多個型別相同的欄位,可以合併為一條:

type Cat struct {
	name, breed string
	age         int
}

而要使用 struct 的方式,與宣告變數的方式一樣,並且有幾種的賦值方式:

  1. key-value (最推薦)
    map 類似,一個欄位對應一個值。
type Cat struct {
	name, breed string
	age         int
}

cat := Cat{name: "BuiBui", breed: "Mix", age: 5}
fmt.Println(cat)
  1. 依照欄位順序決定
type Cat struct {
	name, breed string
	age         int
}

cat := Cat{"BuiBui", "Mix", 5}
fmt.Println(cat)
  1. 直接取得 struct 的 pointer
type Cat struct {
	name, breed string
	age         int
}

cat := &Cat{"BuiBui", "Mix", 5}
fmt.Println(cat)

登愣,狀況題來了!
請問 struct 內欄位的型別可以用 struct 嗎?

當然可以!基本上 struct 內要放什麼資料型別都是沒問題的,
來看看巢狀的 struct 該怎麼應用吧:

package main

import "fmt"

type Cat struct {
	name, breed string
	age         int
	owner       Ower
}

type Ower struct {
	name, gender string
	age          int
}

func main() {
	cat := Cat{
		name:  "BuiBui",
		breed: "Mix",
		age:   5,
		owner: Ower{
			name:   "Chan",
			gender: "female",
			age:    18}}
	fmt.Println(cat
}

只要在 ower 欄位以 Type{key: value} 形式書寫就行了,是不是超簡單呢!

匿名 Struct

雖然欄位配型別看起來很舒服,但其實 Go 也支援只提供型別,不寫欄位的方式。

package main

import "fmt"

type Cat struct {
	string
	int
	Ower
}

type Ower struct {
	string
	int
}

func main() {
	cat := Cat{"BuiBui", 5, Ower{"Chan", 18}}
	fmt.Println(cat)
}

結尾

struct 的文章就到今天結束,有任何問題都歡迎與我告知 :)
鐵人賽文章也同時發佈於 這裡


上一篇
Day9# Function 及 Function Receiver
下一篇
Day11# Pointer
系列文
30 天學 Golang?Go 啦哪次不 Go20

尚未有邦友留言

立即登入留言