關於Go Package關於Go Package
Go Packages 主要用來把相關的functions, variables, 和constants 組織到一起,這樣你就可以很方便的遷移Packages和把它們用到自己的程式中。
注意除了main package, Go packages 不是自治程式,不能被編譯成可執行檔。它們必須直接或者間接的被main package調用才能使用。
如果你直接執行一個沒個package:
$ go run aPackage.go
go run: cannot run non-main package
關於Go function關於Go function
匿名函數(anonymous functions)
匿名函數可以在內部定義,而不需要使用函數名,匿名函數通常被用來實現一些不需要太多代碼的功能。在Go中 一個函數可以返回一個匿名函數,或者使用匿名函數作為它的其中一個參數。另外,匿名函數可以通過一Go 變數來訪問。注意,匿名函數也稱為閉包,特別是在函數式編程術語中。
匿名函數具有較小的實現和本地焦點,這被認為是一種很好的做法。 如果匿名函數沒有本地焦點,那麼你可能需要考慮使其成為常規函數。
注意不要在沒有特殊需求的時候在你程式中使用使用大量的匿名函數。
Go 函數可以返回多個值
func aFunction() (int, int, float64, float64) {
}
下面會有一個用一個functions.go來展示Go的匿名函數
package mainimport ( "fmt" "os" "strconv")func doubleSquare(x int) (int, int) { return x * x, x * x }func main() { arguments := os.Args if len(arguments) != 2 { fmt.Println("The program needs 1 argument!") return } y, err := strconv.Atoi(arguments[1]) if err != nil { fmt.Println(err) return } square := func (s int) int { return s * s } fmt.Println("The square of", y, "is", square(y)) double := func (s int) int { return s + s } fmt.Println("The double of", y, "is", double(y)) fmt.Println(doubleSquare(y)) d, s := doubleSquare(y) fmt.Println(d, s)}
上面的square 和 double 都持有一個匿名函數。不好的一點是,在以後的程式中你可以更改square,double或之後其他變數的值為匿名函數的變數,這意味著這些變數的含義可以更改並計算其他內容。
修改值為匿名函數變數的值是不推薦的,因為這可能是導致非常難以排查bug的主要原因。
如上面所示我們可以直接列印doubleSquare()的傳回值,也可以給他們分配不同的變數進行列印。
執行functions.go:
$ go run function.go 1 21 The program needs 1 argument!rMacBook:code mtsouk$ go run functions.go 10The square of 10 is 100The double of 10 is 2020 10020 100
函數的傳回值可以被命名函數的傳回值可以被命名
下面以returnNames.go為例,我們會把returnNames.go的代碼分成3部分來進行講解
Part 1
package mainimport ( "fmt" "os" "strconv")func nameMinMax(x, y int) (min, max int) { if x > y { min = y max = x } else { min = x max = y } return}