一篇文章帶你瞭解 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: 但是可以明顯看到,使用函數將相同功能抽出來,代碼會變的簡單,整潔。

函數使用

函數名命名規則

函數命名儘量以駝峯命名,例如:getNameconnectData等。

語法

在 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