Struct

struct 是集合資料型別,它將零或多個任意型別具名值組成一個實體。每個值稱為欄位

type Employee struct{
  ID int
  Name string
  Address string
  DoB time.Time
  Position string
  Salary int
  ManagerId int
}

基本操作

var dilbert Employee

dilbert.Salary -= 5000

// 透過指標存取
position := &dilbert.Position
*position = "Senior " + *position

// or

var employeeOfTheMonth *Employee = &dilbert
employeeOfTheMonth.Position += " (proactive team player)"

// 宣告 Struct
type Point struct{ X, Y int }

p := Point{ 1, 2 }
pp := Point { X: 1 } // Y 會被塞入預設值 0

當 struct 被當作參數傳遞時,特別注意除非傳入的是 struct 的位址,否則拿到的會是該 struct 的 copy

// copy
func Scale(p Point, factor int) Point{
  return Point{ p.X * factor, p.Y factor }
}

// address
func Bonus(e *Employee, percent int) int{
  return e.Salary * percent / 100
}

相同型別的欄位可以寫在一起。 大寫的欄位名稱代表能夠被外部存取。

type Employee struct{
  ID int
  Name, Address string
  DoB time.Time
  Position string
  Salary int
  ManagerId int
}

具名的 struct type 不能宣告相同型別的 struct 在欄位中,但指標型別可以。

// Allow
type tree struct{
  value int
  left, right *tree
}

// Not Allow
type tree struct{
  value int
  left, right tree
}

比較 struct

如果所有 struct 的欄位可以比較,那該 struct 就可以進行比較。如此一來,這個 struct 就可以拿來當作 map 的 key 。

struct 的不具名欄位

type Point struct{
  X, Y int
}

type Circle struct{
  Point
  Radius int
}

type Wheel struct{
  Circle
  Spokes int
}

// 我們可以這樣使用
var w Wheel
w.X = 8
w.Y = 8
w.Radius = 5
w.Spokes = 28

// 但也因為不具名的關係,下面的方式無法通過 complie
w = Wheel{ 8, 8, 5, 28 }