你可能不知道的一些Go Packages知識
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 main import ( "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 10
The square of 10 is 100
The double of 10 is 20
20 100
20 100
函數的返回值可以被命名函數的返回值可以被命名
下面以returnNames.go為例,我們會把returnNames.go的代碼分成3部分來進行講解
Part 1
package main
import (
"fmt"
"os"
"strconv"
)
func nameMinMax(x, y int) (min, max int) {
if x > y {
min = y
max = x
} else {
min = x
max = y
}
return
}
你可能不知道的一些Go Packages知識