go 函數

  • 2020 年 4 月 21 日
  • 筆記

命名規範

1 變數:go語言中變數區分大小寫,建議用駝峰
		var Name="lqz"
		var name="lqz"
		fmt.Println(Name)
		fmt.Println(name)
2 文件名:建議用下劃線
3 大寫字母開頭,表示導出欄位(外部包可以使用)
4 先導入第三方包,內置包,自己寫的包
5 不像python中縮進代表同一段程式碼塊
    var a =10
    fmt.Println(a)
    fmt.Println("xxx")

函數

1、函數調用

package main

import "fmt"

func main() {
	//1 函數調用
	test()
}

//func關鍵字 函數名(參數1 類型,參數2 類型){函數體的內容}
//1 定義一個無參數,無返回值的普通函數
func test()  {
	fmt.Println("我是test")
}
// 我是test

2、函數調用

package main

import "fmt"

func main() {
	a:=10
	test(a)
	test(10)
}

//2 帶參數,無返回值
// go中全是位置參數, 沒有所謂的關鍵字參數,默認參數
func test(b int)  {
	fmt.Println(b)
}

// 10
// 10

3、帶多個參數,有一個返回值(指明返回參數類型是什麼)

package main

import "fmt"

func main() {
	var a int
	a=test(10,11)
	//a:=test(100,11)
	fmt.Println(a)
}

//4 帶多個參數,有一個返回值(指明返回參數類型是什麼)
//返回值類型是int類型
func test(a, b int) int {
	c := a + b
	return c
}

//21

4、帶多個參數,多返回值(返回值類型,返回值類型)_接收

package main

import "fmt"

func main() {
	//5 函數調用(有幾個返回值,必須用幾個值來接收)
	a,b:=test(10,11)
	//第二個參數不接收了(跟python中_不一樣,python中_就是一個變數)
	//a,_:=test(10,11)
	fmt.Println(a,b)
	fmt.Println(a)
	//fmt.Println(_)


}

func test(a,b int)(int,int) {
	c:=a+b
	d:=a*b
	return c,d
}

//21 110
//21

5、可變長參數

package main

import "fmt"

func main() {
	fmt.Println(1,"ddd",3.14,4,4,5,6,7,8)
	test(1,2,3,4,4,56,7,7,8,9,9,0)


}

//6 可變長參數
//可以傳任意長度的int類型
func test(a ...int) {
	//a是切片
	fmt.Println(a[1])
}

//1 ddd 3.14 4 4 5 6 7 8
//2

6、匿名函數

package main

import "fmt"

func main() {
	//放在函數內部,有兩種處理方案
	//1 讓它執行
	//2 當參數返回
	//否則報錯
	func (){
		fmt.Println("我是匿名函數")
	}()
}

//我是匿名函數

7、函數是一等公民(頭等函數),函數也是一個類型

//在一門語言中,如果函數可以賦值個變數,那函數就叫一等公民,或者叫頭等函數
//返回值是函數類型


package main

import "fmt"

func main() {
	//8 函數是一等公民

	//方式一
	test()()  //沒問題

	//方式二
	//var a func()
	//a=test()
	//a()

	//方式三
	//a:=test()
	//a()
}

//方式一
//func test() func() {
//	var a func()=func (){
//		fmt.Println("我是內層函數")
//	}
//	return a
//}

//方式二
func test() func() {
	return func (){
		fmt.Println("我是內層函數")
	}
}

//我是內層函數

8、閉包函數

閉包函數(1 定義再函數內部 2 對外部作用域有引用)
// 閉包函數:多了一種函數傳參的方式

package main

import "fmt"

func main() {
	a:=test(10)
	fmt.Println(a)
	a()
}

func test(b int) func() {
	a:= func() {
		fmt.Println(b)
	}
	return a
}

9、閉包函數高級

package main

import "fmt"

func main() {
	//方式一傳參調用
	test(99)(88,77)
	
	//方式二傳參調用
	a:=test(99)
	a(88,77)
}

func test(b int) func(x,y int) {
	var a func(x,y int)
	a= func(x,y int) {
		fmt.Println(b+x+y)
	}
	return a
}