首頁 > 軟體

golang的匿名函數和普通函數的區別解析

2023-03-29 06:01:17

golang的匿名函數和普通函數的區別

匿名函數是不具名的函數,可以在不定義函數名的情況下直接使用,通常用於函數內部的區域性作用域中。而普通函數則是通過定義函數名,在任何地方都可以直接呼叫的函數。
在 Go 中,匿名函數與普通函數有以下區別:

  • 匿名函數可以在函數內部定義,普通函數只能在包級別定義;
  • 匿名函數可以在定義後立即呼叫,也可以賦值給一個變數後再呼叫,而普通函數只能通過函數名呼叫;
  • 匿名函數可以存取並修改外部變數,即閉包特性,而普通函數只能存取引數和全域性變數;
  • 匿名函數可以作為函數引數傳遞,也可以作為函數返回值,而普通函數只能作為函數引數傳遞。

例如,以下程式碼使用了匿名函數:

package main
import "fmt"
func main() {
    func() {
        fmt.Println("Hello, World!")
    }()
}

在這個例子中,我們定義了一個匿名函數,並在函數定義後立即呼叫。該匿名函數沒有名稱,沒有引數,沒有返回值,僅僅列印 “Hello, World!”。由於該函數是在 main 函數內部定義的,因此只能在 main 函數內部呼叫,外部無法存取。

匿名函數可以存取並修改外部變數,即閉包特性

	s := []string{"我喜歡", "鄧文怡"}
	func(){
		s[1] = "程式設計"
		s = append(s, "和", "寫作")
	}()
	for _, v := range s {
		print(v, " ")
	}
	// 我喜歡 程式設計 和 寫作

在這個例子中,我們定義了一個字串切片 s,包含兩個元素 “我喜歡” 和 “鄧文怡”。然後定義了一個匿名函數,並在函數定義後立即呼叫。在該匿名函數中,我們將 s 切片的第二個元素修改為 “程式設計”,並將 “和” 和 “寫作” 兩個元素新增到 s 切片的末尾。最後,通過使用 range 迴圈遍歷 s 切片的每個元素,並將其列印出來。因此,列印輸出的結果為 “我喜歡 程式設計 和 寫作”。值得注意的是,由於該匿名函數是在 main 函數內部定義的,因此只能在 main 函數內部呼叫,外部無法存取。

由於該匿名函數是在 main 函數內部定義的,因此可以存取和修改 s 切片。在該匿名函數定義時,它參照了變數 s,因此它形成了一個閉包,即該匿名函數“捕獲”了在其定義範圍內宣告的變數 s。所以,在匿名函數中修改 s 切片的值也影響到了 main 函數中 s 切片的值。 這就是匿名函數的閉包特性:函數可以存取並修改其定義範圍內的變數。

補充:Golang的匿名函數

golang中的匿名函數 golang中的匿名函數1.匿名函數介紹2.匿名函數使用方式2.1定義時直接呼叫2.2將匿名函數賦值給一個變數2.3定義全域性匿名函數

golang中的匿名函數

1.匿名函數介紹

golang支援匿名函數,如果某些函數僅想在特定位置使用一次,那麼可以考慮使用匿名函數。
匿名函數也可以實現多次呼叫。

2.匿名函數使用方式

2.1定義時直接呼叫

範例程式碼:

package main
import (
	"fmt"
)

func main() {
	fmt.Println("Hello World!");

	//匿名函數使用方式1:定義時直接呼叫。
	//(num1 int,num2 int),形參前不寫函數名,並在函數後直接呼叫。
	res := func (num1 int,num2 int) int {
		return num1 + num2
	}(2,3)

	fmt.Printf("res的值為:%v",res)
}

結果:

2.2將匿名函數賦值給一個變數

範例程式碼:

package main
import (
	"fmt"
)

func main() {
	fmt.Println("Hello World!");

	//匿名函數使用方式2:將匿名函數賦值給變數,使用變數呼叫。
	add := func (num1 int,num2 int) int {
		return num1 + num2
	}

	//通過函數變數 呼叫函數。
	res := add(2,3)

	fmt.Printf("add的型別為:%T,res的值為:%v",add,res)
}

結果:

add的型別為 函數 func(int,int) int 型別。

2.3定義全域性匿名函數

package main
import (
	"fmt"
)

//匿名函數使用方式3:將函數賦值給全域性變數。
var Add = func (num1 int,num2 int) int{
	return num1 + num2
}

func main() {
	fmt.Println("Hello World!");

	res := Add(2,3)
	fmt.Printf("Add全域性變數的型別:%T,res的型別:%T,res的值為:%v",Add,res,res)

}

結果:

到此這篇關於golang的匿名函數和普通函數的區別的文章就介紹到這了,更多相關go匿名函數內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com