一篇文章帶你了解Go語言基礎(chǔ)之函數(shù)(上篇)
前言
Hey,大家好呀,我是星期八,這次咱們繼續(xù)學(xué)習(xí)Go基礎(chǔ)之函數(shù)叭。
為什么需要函數(shù)
函數(shù),在所有編程語言中都叫函數(shù),Java,PHP,Python,JS等,統(tǒng)一都叫函數(shù)。
函數(shù)的作用
一般是這樣形容的:函數(shù)可以將重復(fù)的,或者特定功能的,封裝成一個方便調(diào)用的東西。
注:在Go中,函數(shù)是支持閉包的。
在沒有使用函數(shù)時
代碼
- package main
- import "fmt"
- func main() {
- //模擬一個打開文件,寫入一行內(nèi)容進(jìn)入文件,在關(guān)閉文件的功能
- var file_name = "a.txt" //文件名
- var w_content = "愛我中華" //寫入的內(nèi)容
- fmt.Println(fmt.Sprintf("打開 %s 文件",file_name))
- fmt.Println(fmt.Sprintf("向 %s 文件寫入了 %s ", file_name, w_content))
- fmt.Println(fmt.Sprintf("關(guān)閉 %s 文件",file_name))
- //如果再再向其他文件寫入內(nèi)容,還需要復(fù)制一次
- var file_name2 = "b.txt" //文件名
- var w_content2 = "中國威武" //寫入的內(nèi)容
- fmt.Println(fmt.Sprintf("打開 %s 文件",file_name2))
- fmt.Println(fmt.Sprintf("向 %s 文件寫入了 %s ", file_name2, w_content2))
- fmt.Println(fmt.Sprintf("關(guān)閉 %s 文件",file_name2))
- }
使用函數(shù)后
將相同功能封裝成函數(shù)。
- package main
- import "fmt"
- func w_file(filename string, w_content string) {
- fmt.Println(fmt.Sprintf("打開 %s 文件", filename))
- fmt.Println(fmt.Sprintf("向 %s 文件寫入了 %s ", filename, w_content))
- fmt.Println(fmt.Sprintf("關(guān)閉 %s 文件", filename))
- }
- func main() {
- //將相同功能封裝成函數(shù)
- w_file("a.txt", "愛我中華")
- w_file("b.txt", "中國威武")
- }
上述代碼執(zhí)行的結(jié)果都如下
ps:但是可以明顯看到,使用函數(shù)將相同功能抽出來,代碼會變的簡單,整潔。
函數(shù)使用
函數(shù)名命名規(guī)則
函數(shù)命名盡量以駝峰命名,例如:getName,connectData等。
語法
在Go中,定義函數(shù)語言用到func關(guān)鍵字。
- func 函數(shù)名([參數(shù)1 參數(shù)類型1,參數(shù)2 參數(shù)類型2,...]) [(返回值 返回值類型,...)]{
- 邏輯代碼
- }
- //中括號表示可選參數(shù)
無參數(shù),無返回值
- package main
- import "fmt"
- func say1() {
- fmt.Println("我終于會說話了...")
- }
有參數(shù),無返回值
- func say2(c string) {
- fmt.Println("我終于會說" + c + "了")
- }
有或者無參數(shù),有返回值
- func say3(c string) (string) {
- fmt.Println("我終于會說" + c + "了")
- return "哦耶"
- }
main函數(shù)
- func main() {
- say1()
- say2("你好哇")
- result := say3("你好哇")
- fmt.Printf(result)
- }
結(jié)果
- package main
- import "fmt"
- func say() string{
- fmt.Println("我終于會說話了...")
- return ""
- }
- func main() {
- //函數(shù)名+括號調(diào)用函數(shù)
- say() //結(jié)果:我終于會說話了...
- }
注:如果函數(shù)有返回值,可以不接收。
函數(shù)參數(shù)特性
在Go中,如果函數(shù)參數(shù)都是統(tǒng)一類型,可以這樣寫。
- //arg1, arg2, arg3, arg4參數(shù)類型都是string
- func say(arg1, arg2, arg3, arg4 string) {
- fmt.Println("我終于會說話了...")
- }
- //arg1,arg2參數(shù)是int類型,arg4,arg4是string類型,
- func say(arg1, arg2, int, arg3, arg4 string) {
- //表示arg1, arg2, arg3, arg4參數(shù)類型都是string
- fmt.Println("我終于會說話了...")
- }
大概意思就是,如果參數(shù)不寫類型,會以后面碰到的類型為準(zhǔn)。
函數(shù)的...參數(shù)
...參數(shù),也叫可變長參數(shù),有點(diǎn)像Python中的*args。
功能是當(dāng)不知道接收多少個參數(shù)時,接收多的參數(shù)會放在...中。
...參數(shù)需要放在最后面。
代碼
- package main
- import "fmt"
- func say(name string, content ...string) {
- fmt.Println(content) //結(jié)果:[666 雙擊 ok 哦耶]
- fmt.Printf("%T\n", content) //結(jié)果:[]string,是切片類型
- fmt.Println("我是"+name, "我說了:")
- //循環(huán)切片
- for _, v := range content {
- fmt.Println(v)
- }
- }
- func main() {
- //函數(shù)名+括號調(diào)用函數(shù)
- say("張三", "666", "雙擊", "ok", "哦耶") //結(jié)果:我終于會說話了...
- }
結(jié)果如圖所示
注:參數(shù)是...類型的,他的值是一個切片類型。
函數(shù)的返回值
返回值是一個的
- package main
- import "fmt"
- //返回值是一個
- func say1() string {
- return "ok"
- }
返回值是多個的,需要用括號括起來
- //返回值是多個的,需要用括號括起來
- func say2() (int, string) {
- return 1, "ok"
- }
返回值是命名的
- //返回值是命名的,不管是多個返回值還是一個返回值,都需要括號
- //如果是命名返回值,需要在邏輯代碼中,將變量賦值
- func say3() (a int, b string) {
- //邏輯代碼
- a = 18
- b = "666"
- /*
- 直接return即可,不需要retrun a,b
- return的默認(rèn)就是 a 和 b
- 不用跟上述返回一樣,返回具體值
- */
- return
- }
main函數(shù)
- func main() {
- s := say1()
- fmt.Println(s)
- a1, b1 := say2()
- fmt.Println(a1, b1)
- a2, b2 := say3()
- fmt.Println(a2, b2)
- }
結(jié)果
總結(jié)
上述我們學(xué)習(xí)了Go基礎(chǔ)之函數(shù)。