今天邁入Go的函式啦
函式func是聰明人為了不想重複打一樣的Code才寫的。
函式效能,因為要進出、攜帶傳入值、返回值,效能不佳,但講究的是重複利用性、可讀性。
可讀性佳跟效能快在某些方面是背道而馳的,例如:機器碼效能一級棒,但可讀性零。
但在2020這個手機就是20世紀超級電腦的年代很少人在Care了這一點點消耗了,架構、演算法還看得更重要。
Go語言func命名是採用駝峰式大小寫,譬如:HowDoYouTurnThisOn 。
字首大寫代表對外暴露,字首小寫代表此func只能在相同的Package中才能使用。
沒錯。
我們所熟悉的main 就是一個func,所有程式的進入點。
Go語言中函式有許多種方式可以應用,我把它拆分來成好多型,語法會混搭著用,
來看看以下簡單的func範例:
沒有回傳任何東西的func
func Variable() {
...
}func a() {
...
}
func a() {
fmt.Println("Hello")
}
func main() {
a()
}
/* result:
Hello
*/
主程式直接call就能印出了
回傳一個變數,要先定義回傳的變數型態
func Variable() ReturnType {
...
}func b() string {
return ...
}
func b() string {
return "Hi"
}
func c() int {
return 1 + 5
}
func main() {
b := b()
fmt.Println(b)
fmt.Println(c() + 6)
}
/* result:
Hi
12
*/
https://play.golang.org/p/GHVtD8oNm2J
func Variable() (Variable ReturnType) {
...
}func d() (e string) {
...
return
}
func d() (e string) {
e = "I am e!"
return e
}
這行為等於是在func頭裡面就做了 var e string 這件事
所以函式內的e可以直接取用。
有預先宣告變數的話,Go有100%的信心知道你要回傳變數e,
所以就算把return e 只寫成return也可以智能的回傳。
func Variable() (ReturnType, ReturnType) {
...
}func f() (int, int) {
return ...
}
func f() (int, int) {
return 1 + 1, 2 + 2
}
func main() {
x, y := f()
fmt.Println(x, y)
}
/* result:
2 4
*/
https://play.golang.org/p/6L9hkyluXR_e
現在應該知道多個回傳值、又預先宣告變數名稱該怎麼做了吧
https://play.golang.org/p/Al_5IeRtrxw
以上都是func比較基礎的功能,頗酷、也挺簡便好用。
往下會講進階用法
func 還能回傳 func
Go有這個用法,超酷~~
Struct搭配Func,就像變形金鋼鐵人者哈特利波特斯拉線圈
首先要先宣告一個Struct,
再來才是以下的Func*func (S Struct) Variable() {
...
}func (CIS *Programmer) ask() {
...
}
type Programmer struct {
Question string
}
func (CIS *Programmer) Ask() {
question := CIS.Question
fmt.Println(question)
}
這方法讓你的物件Programmer 動了起來,
他不只是個物件了,他現在會ask問可不可以休息
func main() {
var I Programmer
I.Question = "Hey, Can I Sleep?"
I.Ask()
}
/* result:
Hey, Can I Sleep?
*/
很遺憾的,雖然工程師很累很想睡覺,但收到的回應通常是
No
你可以再做一個Boss物件,Boss.Reply()來回答No。
https://play.golang.org/p/iH3orZt1HDG
go func 併發指令簡單好記
詳見Day14 Go併發症狀
你聽過回調函式(Callback Function)嗎?
請問 go能return陣列嗎?
可以,類似這樣
func test() (array []string) {
array = append(array, "1", "2")
return
}
謝謝 我昨天一直試都編譯錯誤