iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 10
0

golang本身的程式進入點就是一個function,名為main的function

package main

func main() {
	
}

當然可以全部的code都塞在main裡面,只是寫到後來一定會有
1.程式行數太長:寫code不用比行數多啦~~~~簡潔好讀才是重點
2.企業邏輯分不清:拆成獨立邏輯後續查bug或是維護都方便
3.重覆程式碼一直複製貼上
要解決上面的問題,成本最低的作法就是寫成function,
把程式碼拆成一塊一塊的,就跟樂高積木一樣,一塊積木可以當成是一個function,
把n個function組合成一個application。

let's go func

輸入func按下enter,snippet會自動產生function的code出來。

func ()  {
	
}

function的標準寫法

//test是function的名稱,a,b,c是外部傳入的參數,string是回傳值的型別
func test(a string, b int, c bool) string {
	fmt.Println("a string:", a, "b int:", b, "c bool:", c)
    //return是結束function與回傳回傳值
	return "QQ"
}
//也可以指定回傳值的變數名稱
func test(a string, b int, c bool)( res string) {
	fmt.Println("a string:", a, "b int:", b, "c bool:", c)
    //return是結束function與回傳回傳值
    res = "GGQQ"
	return res
    //因為function已經有宣res1, res2 := test("GG", 9999, false)告回傳變數,可以直接寫return就好,回傳結果跟return res一樣
}

golang的function可以回傳多值,跟c#不一樣rrrrrr,如果func的某個回傳值沒用到,不想宣告變數去接時
可以用底線取代

package main

import "fmt"

func main() {
	res1, res2 := test("GG", 9999, false)
    //我不需要第一個回傳值
    _, res4 := test("GG", 9999, false)
    //我不需要第二個回傳值
    res5,_ := test("GG", 9999, false)
	fmt.Println(res1, res2)
}
func test(a string, b int, c bool) (res1 string, res2 string) {
	fmt.Println("a string:", a, "b int:", b, "c bool:", c)
	return "QQ", "GG"
}

如果傳入的參數數量不定時也可以這樣子寫。

package main

import "fmt"

func main() {
	res := test("GG", "AA", "CC", "DD", "EE")
	fmt.Println(res)
    res2 := test("GG", "AA")
	fmt.Println(res2)
}
func test(multis ...string) string {
	for _, param := range multis {
		fmt.Println("param:", param)
	}
	return "GG"
}

golang也有匿名function可以使用,有時候覺得為了某些邏輯或是條件額外寫一個function,會產生使用率很低的function,不寫成function又覺得code落落長不好看,這時候就可以寫匿名function來解決這個困擾~~
寫出乾淨俐落的code是碼農的基本要求rrrr

package main

import "fmt"

func main() {
	test := "GOLANG"
	var QQ = func() {
		fmt.Println(test, "VERY GOOD")
	}
	HH := func() {
		fmt.Println(test, "so GOOD")
	}
	QQ()
	HH()

}

function可以宣告成變數,那可以變成回傳值,簡單來說會return func,可以把A變成B,像是把小夫變成胖虎的概念一樣
https://ithelp.ithome.com.tw/upload/images/20200917/201295151fKoy5WUns.jpg

package main

import (
	"fmt"
)

func main() {
	mdfk2020 := testGG("MDFK 2020")
	mdfk2020()
}
func testGG(name string) func() {
	return func() {
		fmt.Println(name)
	}
}

煩人的callback function~~簡單說就是把func當參數丟進去function進來去執行

package main

import "fmt"

func main() {
	var GG = []string{"MDFK", "2020", "GG"}
	test(GG, func(test string) {
		fmt.Println("i'm callback:", test)
	})
}

func test(s []string, callback func(string)) {
	for _, text := range s {
		callback(text)
	}
}


上一篇
[DAY9]來學GO迴圈
下一篇
[DAY11]GO的萬用形態:interface
系列文
欸你這週GO了嘛30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言