函數學習
1、自執行函數和閉包 在js中也有這個概念,通過對比我們就能更好的理解go語言的語法特性
- 自執行函數
1、1 通過學習javascript我們再來深入學習go的語法,在javascript的意思就是自己調用自己
(function ( a, b) {
console.log("a=" + a +"b="+b)
})(1,2);
// result = a =1 b =2
1、2 在GO中語法是怎麼樣的呢
func main() {
/*fmt.Println(intSum(1,2))
var f = adder()
fmt.Println(f(10))
fmt.Println(f(20))
fmt.Println(f(30))*/
func(x, y int) {
fmt.Println(x + y)
}(10, 20)
}
總結: 通過兩種語言的對比我們知道,他們先定義執行,之後立馬調用自己, 然後執行函數體裏面的內容。
- 閉包
1、3 在js中的閉包
function init() {
var name = "Mozilla"; // name 是一個被 init 創建的局部變量
function displayName() { // displayName() 是內部函數,一個閉包
alert(name); // 使用了父函數中聲明的變量
}
displayName();
}
init();
1、4 在go中我們應該如何寫閉包,他有什麼特性
func adder() func(int) int{
var x int // 10
return func(y int) int {
x+=y
return x
}
}
fmt.Println(f(10)) //1O
fmt.Println(f(20)) //30
fmt.Println(f(30)) //60
總結: 這個理解屬於個人理解, 爲什麼調用f(10)的時候是10呢。調用f(20)的時候等於30呢。這時候我們需要思考,如果他沒有保存局部變量的值那麼f(10)=10,f(20)=20,這個理解應該沒有問題, 當我們運行的時候發現結果並不是我們理解的這樣。那麼我認爲,程序在運行的時候並沒有銷燬局部變量的值,而是保存最新的局部變量值,這樣他就可以得到我們上面執行的結果。
閉包場景二學習
func main() {
jpgFunc := suffix(".jpg")
txtFunc := suffix(".txt")
fmt.Println(jpgFunc("test")) //test.jpg
fmt.Println(txtFunc("test")) //test.txt
}
// 判斷前綴
func suffix(suffix string) func(string) string {
return func(name string) string {
if !strings.HasSuffix(name, suffix) {
return name + suffix
}
return name
}
}
場景三學習
func calc(base int) (func(int) int, func(int) int) {
add := func(i int) int {
base += i
return base
}
sub := func(i int) int {
base -= i
return base
}
return add, sub
}
func main() {
f1, f2 := calc(10)
fmt.Println(f1(1), f2(2)) //11 9
fmt.Println(f1(3), f2(4)) //12 8
fmt.Println(f1(5), f2(6)) //13 7
}
總結: 通過上面三個例子我們不難知道,閉包其實不難理解,他會保存引用變量的值。