一篇文章帶你瞭解 Go 語言基礎之函數(上篇)
前言
Hey,大家好呀,我是星期八,這次咱們繼續學習 Go 基礎之函數叭。
爲什麼需要函數
函數,在所有編程語言中都叫函數,Java,PHP,Python,JS 等,統一都叫函數。
函數的作用
一般是這樣形容的: 函數可以將重複的,或者特定功能的,封裝成一個方便調用的東西。
注: 在 Go 中,函數是支持閉包的。
在沒有使用函數時
代碼
package main
import "fmt"
func main() {
//模擬一個打開文件,寫入一行內容進入文件,在關閉文件的功能
var file_name = "a.txt" //文件名
var w_content = "愛我中華" //寫入的內容
fmt.Println(fmt.Sprintf("打開 %s 文件",file_name))
fmt.Println(fmt.Sprintf("向 %s 文件寫入了 %s ", file_name, w_content))
fmt.Println(fmt.Sprintf("關閉 %s 文件",file_name))
//如果再再向其他文件寫入內容,還需要複製一次
var file_name2 = "b.txt" //文件名
var w_content2 = "中國威武" //寫入的內容
fmt.Println(fmt.Sprintf("打開 %s 文件",file_name2))
fmt.Println(fmt.Sprintf("向 %s 文件寫入了 %s ", file_name2, w_content2))
fmt.Println(fmt.Sprintf("關閉 %s 文件",file_name2))
}
使用函數後
將相同功能封裝成函數。
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("關閉 %s 文件", filename))
}
func main() {
//將相同功能封裝成函數
w_file("a.txt", "愛我中華")
w_file("b.txt", "中國威武")
}
上述代碼執行的結果都如下
ps: 但是可以明顯看到,使用函數將相同功能抽出來,代碼會變的簡單,整潔。
函數使用
函數名命名規則
函數命名儘量以駝峯命名,例如:getName
,connectData
等。
語法
在 Go 中,定義函數語言用到func
關鍵字。
func 函數名([參數1 參數類型1,參數2 參數類型2,...]) [(返回值 返回值類型,...)]{
邏輯代碼
}
//中括號表示可選參數
無參數,無返回值
package main
import "fmt"
func say1() {
fmt.Println("我終於會說話了...")
}
有參數,無返回值
func say2(c string) {
fmt.Println("我終於會說" + c + "了")
}
有或者無參數,有返回值
func say3(c string) (string) {
fmt.Println("我終於會說" + c + "了")
return "哦耶"
}
main 函數
func main() {
say1()
say2("你好哇")
result := say3("你好哇")
fmt.Printf(result)
}
結果
調用函數
函數名 + 括號調用函數,如果有參數傳入相關參數即可。
package main
import "fmt"
func say() string{
fmt.Println("我終於會說話了...")
return ""
}
func main() {
//函數名+括號調用函數
say() //結果:我終於會說話了...
}
注: 如果函數有返回值,可以不接收。
函數參數特性
在 Go 中,如果函數參數都是統一類型,可以這樣寫。
//arg1, arg2, arg3, arg4參數類型都是string
func say(arg1, arg2, arg3, arg4 string) {
fmt.Println("我終於會說話了...")
}
//arg1,arg2參數是int類型,arg4,arg4是string類型,
func say(arg1, arg2, int, arg3, arg4 string) {
//表示arg1, arg2, arg3, arg4參數類型都是string
fmt.Println("我終於會說話了...")
}
大概意思就是,如果參數不寫類型,會以後面碰到的類型爲準。
函數的... 參數
... 參數,也叫可變長參數,有點像 Python 中的*args
。
功能是當不知道接收多少個參數時,接收多的參數會放在... 中。
... 參數需要放在最後面。
代碼
package main
import "fmt"
func say(name string, content ...string) {
fmt.Println(content) //結果:[666 雙擊 ok 哦耶]
fmt.Printf("%T\n", content) //結果:[]string,是切片類型
fmt.Println("我是"+name, "我說了:")
//循環切片
for _, v := range content {
fmt.Println(v)
}
}
func main() {
//函數名+括號調用函數
say("張三", "666", "雙擊", "ok", "哦耶") //結果:我終於會說話了...
}
結果如圖所示
注: 參數是... 類型的,他的值是一個切片類型。
函數的返回值
返回值是一個的
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的默認就是 a 和 b
不用跟上述返回一樣,返回具體值
*/
return
}
main 函數
func main() {
s := say1()
fmt.Println(s)
a1, b1 := say2()
fmt.Println(a1, b1)
a2, b2 := say3()
fmt.Println(a2, b2)
}
結果
總結
上述我們學習了 Go 基礎之函數。如果在操作過程中有任何問題,記得下面討論區留言,我們看到會第一時間解決問題。
我是碼農星期八,如果覺得還不錯,記得動手點贊一下哈。感謝你的觀看。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/qWQf6CfsQqBxBpnchPhgqQ