Rumah > Artikel > pembangunan bahagian belakang > Adakah terdapat alternatif yang lebih baik untuk parameter variadic golang?
Alternatif yang lebih baik kepada fungsi variadic ialah: Menggunakan hirisan sebagai argumen Menggunakan struct sebagai argumen Menggunakan fungsi currying
Alternatif yang lebih baik kepada fungsi variadic dalam Go
Argumen variadic melalui mana-mana nombor kod argumen Go >... sintaks. Walaupun ini mudah dalam beberapa kes, ia juga mempunyai hadnya, termasuk: ...
语法允许传递任意数量的参数。虽然这在某些情况下很方便,但也有其局限性,包括:
替代方案
有几种替代方案可以替代可变参数函数:
1. 使用切片作为参数:
func max(numbers []int) int { if len(numbers) == 0 { return 0 } max := numbers[0] for _, n := range numbers { if n > max { max = n } } return max }
2. 使用 structs 作为参数:
type Stats struct { Mean float64 Median float64 Mode float64 } func calcStats(nums []float64) Stats { // ... 计算统计数据并填充 `Stats` struct return Stats{ Mean: mean, Median: median, Mode: mode, } }
3. 使用函数柯里化:
柯里化将一个多参数函数转换为一个一系列单参数函数的过程。例如,我们可以对 max
Parameter fungsi variadik tidak mempunyai jenis eksplisit, yang mungkin menyebabkan penyemak jenis gagal Ralat dikesan.
max
: func maxCurried(ns ...int) int { return func(n int) int { if n > ns[0] { ns[0] = n } return ns[0] } }🎜Kes praktikal🎜🎜🎜 Katakan kita mempunyai fungsi yang perlu mengira nilai maksimum siri integer Mari kita bandingkan menggunakan parameter pembolehubah Kecekapan fungsi dan fungsi slice: 🎜
package main import ( "fmt" "time" ) func maxVarargs(nums ...int) int { if len(nums) == 0 { return 0 } max := nums[0] for _, n := range nums { if n > max { max = n } } return max } func maxSlice(nums []int) int { if len(nums) == 0 { return 0 } max := nums[0] for _, n := range nums { if n > max { max = n } } return max } func main() { // 产生一个包含 100 万个随机整数的切片 nums := make([]int, 1000000) for i := range nums { nums[i] = rand.Int() } // 使用可变参数函数计算最大值 start := time.Now() maxVarargs(nums...) elapsedVarargs := time.Since(start) // 使用切片函数计算最大值 start = time.Now() maxSlice(nums) elapsedSlice := time.Since(start) fmt.Println("MaxVarargs execution time:", elapsedVarargs) fmt.Println("MaxSlice execution time:", elapsedSlice) }🎜Jalankan program ini dan kita akan melihat bahawa fungsi slice adalah jauh lebih pantas daripada fungsi variadic. 🎜
Atas ialah kandungan terperinci Adakah terdapat alternatif yang lebih baik untuk parameter variadic golang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!