使用函數(shù)的正確姿勢(shì)#
什么是高階函數(shù)芍锦?
1.接受其它的函數(shù)作為參數(shù)
2.把其它函數(shù)作為輸出結(jié)果
滿足任意一點(diǎn)都可以稱為高階函數(shù)F凰凇调塌!
package main
import "fmt"
type funcVar func()
func func1(f funcVar){
f()
}
func func2(){
fmt.Println("I'am a function")
}
func func3() func(){
return func() {
fmt.Println("I'am an internal function")
}
}
func main(){
var f funcVar
f = func2
func1(f)
a := func3()
a()
}
閉包的概念
閉包個(gè)人了解就是函數(shù)和局部變量行成一個(gè)代碼塊,這樣函數(shù)在后面可以訪問到變量头镊。感覺像是延遲調(diào)度增炭。
package main
import "fmt"
type funcVar func()
func main(){
var a funcVar
a = func(i int)(func()){
return func() {
fmt.Println(i)
}
}(5)
a()
}
函數(shù)參數(shù)的改變
傳入函數(shù)的參數(shù)如果是引用類型,那么會(huì)被改變拧晕,如果是值類型隙姿,那么不會(huì)被改變!3Ю獭J溏琛队丝!
對(duì)于復(fù)合類型
complex := [3][]int{
[]int{1,2}
[]int{3,4}
[]int{5,6}
}
如果更改數(shù)組的值比如在函數(shù)內(nèi)部
complex[1]= []int{7,8}//沒用!S簟机久!
但如果
complex[1][0] = 7//這樣就會(huì)被改變了
問題
復(fù)合類型傳入函數(shù)后,這個(gè)函數(shù)中對(duì)該值的修改會(huì)影響到它的值嗎赔嚎?
上面說過了膘盖,看你的修改方式
函數(shù)真正拿到的參數(shù)值其實(shí)只是他們的副本,那么返回給調(diào)用方的結(jié)果值也是復(fù)制的嗎尤误?
如果返回的是值侠畔,那么是復(fù)制的,如果是地址损晤,那么就不會(huì)復(fù)制软棺。
func func4() *int{
a := 10
fmt.Println(&a)
return &a
}
func func5() int{
a := 10
fmt.Println(&a)
return a
}
func main(){
/*var f funcVar
f = func2
func1(f)
a := func3()
a()*/
b := func4()
fmt.Println(b)
c := func5()
fmt.Println(&c)
}