Go 的函式本身不支援預設變數,但我們可以透過傳入結構的方式模擬預設變數,如下例:
package main
import "log"
type Color int
const (
White Color = iota
Black
Green
Yellow
)
type Size int
const (
Large Size = iota
Middle
Small
ExtraLarge
)
type Clothes struct {
color Color
size Size
}
type Param struct {
Color Color
Size Size
}
func MakeClothes(param Param) *Clothes {
c := new(Clothes)
c.color = param.Color
c.size = param.Size
return c
}
func main() {
// Clothes with custom parameters
c1 := MakeClothes(Param{Color: Black, Size: Middle})
if !(c1.color == Black) {
log.Fatal("Wrong color")
}
if !(c1.size == Middle) {
log.Fatal("Wrong size")
}
// Clothes with default parameters
c2 := MakeClothes(Param{})
if !(c2.color == White) {
log.Fatal("Wrong color")
}
if !(c2.size == Large) {
log.Fatal("Wrong size")
}
}
const 就是英文裡 常數(constant)的意思
先設定一個常數函數
裡面的 iota 是常數計數器
iota在const關鍵字出現時將被重置為0(const內部的第一行之前),const中每新增一行常量聲明將使iota計數一次(iota可理解為const語句塊中的行索引)。
可以想像iota就是用來設定常數區塊的索引值
type Stereotype int
const (
TypicalNoob Stereotype = iota // 0
TypicalHipster // 1
TypicalUnixWizard // 2
TypicalStartupFounder // 3
)
init 函式是一個特殊的函式,若程式碼內有 init 會在程式一開始執行的時候呼叫該函式,順序在 main 函式之前。通常 init 函式都是用來初始化一些外部資源。以下是一個摘自 Go 官方網站的例子:
func init() {
if user == "" {
log.Fatal("$USER not set")
}
if home == "" {
home = "/home/" + user
}
if gopath == "" {
gopath = home + "/go"
}
// gopath may be overridden by --gopath flag on command line.
flag.StringVar(&gopath, "gopath", gopath, "override default GOPATH")
}