golang基礎-函式是變數、自定義type、命名返回值、可變參、defer、匿名
阿新 • • 發佈:2019-02-03
函式是一個變數型別
package main
import("fmt"
)
func main() {
c := add
fmt.Println(c)
sum := c(10, 20)
fmt.Println(sum)
}
func add(a, b int) int {
return a + b
}
輸出如下:
0x488a00
30
自定義一個type型別函式model
package main
import("fmt"
)
//定義一個type型別,func(int,int) int 構造一種方法的模型
type methodModel func(int,int) int
func add(a int ,b int) int {
return a+b
}
//接受一個類似methodModel方法的具體方法
func operator(entity methodModel,a int,b int)int{
return entity(a,b)
}
func main() {
var a int = 1
var b int = 2
c:= add
sum := operator(c,a,b)
fmt.Printf("%d\n" ,sum)
}
輸出3
命名返回值、忽略返回值
1、值傳遞
2、引用傳遞
注意1:無論是值傳遞,還是引用傳遞,傳遞給函式的都是變數的副本
不過,值傳遞是值的拷貝。引用傳遞是地址的拷貝
map、slice、chan、指標、interface預設以引用的方式傳遞
package main
import("fmt"
)
func add(a, b int) (c int) {
c = a + b
return
}
func calc(a, b int) (sum int, avg int) {
sum = a + b
avg = (a +b)/2
return
}
func main() {
var a int = 1
var b int = 2
c := add(a,b)
fmt.Println(c)
sum,_ := calc(a,b)
fmt.Println(sum)
sum1,avg1 := calc(a,b)
``
mt.Println(sum1,avg1)
}
輸出如下:
3
3
3 1
可變引數
package main
import("fmt"
)
func add(a int,args ... int)(result int) {
result = a
for i:=0;i<len(args);i++{
result += args[i]
}
return
}
func main() {
sum := add(1,2,3)
fmt.Print(sum)
}
輸出如下:6
defer用途
- 當函式返回時,執行defer語句。因此,可以用來做資源清理
- 多個defer語句,按先進後出的方式執行
- defer語句中的變數,在defer宣告時就決定了
package main
import("fmt"
)
func add(a int,b int) int{
defer fmt.Println("defer method")
return a + b
}
func main() {
defer fmt.Println("defer main1")
defer fmt.Println("defer main2")
sum := add(1,2)
fmt.Print(sum,"\n")
defer fmt.Println("defer method after")
}
輸出如下:
defer method
3
defer method after
defer main2
defer main1
匿名函式
package main
import("fmt"
)
//匿名函式1
var (
result = func(a int,b int) int{
return a + b
}
)
//非匿名函式
func sum1(a int,b int)int {
return a + b
}
//匿名函式2
func sum2(a int ,b int) int {
tempMethod := func(a int ,b int) int {
return a + b
}
return tempMethod(a,b)
}
func sum3(a int ,b int ) int {
resultTemp := func(a int ,b int )int {
return a + b
}(a,b)
return resultTemp
}
func main() {
sum := result(1,2)
fmt.Println(sum)
method:=sum1
fmt.Println(method(3,4))
fmt.Println(sum2(4,6))
fmt.Println(sum3(7,9))
}
輸出如下:
3
7
10
16