📕
Go 語言程式設計入門
  • 最新消息
  • 中文版更新日誌
  • 譯者誌謝
  • 01-起步走
    • 01.01-檔案與資料夾
    • 01.02-終端機(Terminal)
    • 01.03-文字編輯器
    • 01.04-Go 的工具
  • 02-你的第一個程式
    • 02.01-如何讀 Go 程式
    • 02.02-問題
  • 03-型別
    • 03.01-數字
    • 03.02-字串
    • 03.03-問題
  • 04-變數
    • 04.01-如何命名變數
    • 04.02-Scope(變數的作用範圍)
    • 04.03-常數(Constant)
    • 04.04-定義多個變數
    • 04.05-範例程式
    • 04.06-問題
  • 05-控制結構
    • 05.01-For
    • 05.02-If
    • 05.03-switch
    • 05.04-問題
  • 06-Array、Slice 與 Map
    • 06.01-陣列(Array)
    • 06.02-Slice
    • 06.03-Map
    • 06.04-問題
  • 07-函式
    • 07.01-你的第二個函式
    • 07.02-回傳多個值
    • 07.03-參數個數可變的函式(Variadic Function)
    • 07.04-Closure
    • 07.05-遞迴(Recursive)
    • 07.06-Defer, Panic & Recover
    • 07.07-Panic & Recover
    • 07.08-問題
  • 08-指標
    • 08.01-「*」與「&」運算符號
    • 08.02-new
    • 08.03-問題
  • 09-Struct 與 Interface
    • 09.01-struct
    • 09.02-Method
    • 09.03-Interface
    • 09.04-問題
  • 10-Concurrency(平行處理)
    • 10.01-Goroutine
    • 10.02-Channel
    • 10.03-問題
  • 11-Packages
    • 11.01-建立 Package
    • 11.02-文件
    • 11.03-問題
  • 12-測試
  • 13-The Core Packages
    • 13.01-字串
    • 13.02-輸入與輸出
    • 13.03-檔案與資料夾
    • 13.04-錯誤訊息
    • 13.05-Container 與 Sort
    • 13.06-雜湊&加解密
    • 13.07-伺服器
    • 13.08-解析命令列參數
    • 13.09-Synchronization Primitives(同步處理原始物件)
  • 14-下一步
    • 14.01-閱讀大師作品
    • 14.02-動手實作
    • 14.03-團隊合作
  • 15. 附錄-額外資源
Powered by GitBook
On this page
Edit on GitHub
  1. 09-Struct 與 Interface

09.01-struct

要讓一個使程式變好,最簡單的方式是使用 struct,struct 是一種型別,包含多個有名稱的欄位。例如,我們可以用如下方式表示一個圓圈:

type Circle struct {
    x float64
    y float64
    r float64
}

關鍵字 type 指出了一個新的型別,後面跟著型別的名稱(Circle),struct 關鍵字表示我們定義了一個 struct 型別,大括號裡面有一些欄位。每個欄位都有一個名稱與型別,如同函式那樣,我們也可以將相同型別的變數欄位放在一起:

type Circle struct {
    x, y, r float64
}

初始化

有許多方式可以讓我們建立新的 Circle 型別之實體(instance):

var c Circle

如同其它的資料型別,這樣可以建立一個 Circle 區域變數,預設值為零。對於一個 struct 而言,設定為零表示將 struct 的每個欄位都設定為相對應的零值(int 型別設定為 0, float 型別設定為 0.0, string 型別設定為 "", 指標型別設定為 nil , …)。我們也可以使用 new 函式來建立:

c := new(Circle)

這樣會為每個欄位配置記憶體空間,並將每個欄位設定為零,接著傳回一個指標(*Circle)。通常我們會比較想要為每個欄位設定一個值,有下列兩種方式:

c := Circle{x: 0, y: 0, r: 5}

或是我們知道欄位名稱的定義順序,也可以直接賦值:

c := Circle{0, 0, 5}

欄位

我們可以使用 . 運算符來存取這些欄位:

fmt.Println(c.x, c.y, c.r)
c.x = 10
c.y = 5

再來修改 circleArea 函式,讓它可以使用一個 Circle:

func circleArea(c Circle) float64 {
    return math.Pi * c.r*c.r
}

我們在 main 函式是這樣:

c := Circle{0, 0, 5}
fmt.Println(circleArea(c))

要記得一件事情,就是 Go 語言一定會複製參數。如果我們修改 circleArea 函式中的欄位值,則不會更動到原本的變數。因此我們通常會以下列方式設計函式:

func circleArea(c *Circle) float64 {
    return math.Pi * c.r*c.r
}

並修改 main 函式:

c := Circle{0, 0, 5}
fmt.Println(circleArea(&c))

Previous09-Struct 與 InterfaceNext09.02-Method

Last updated 2 years ago