可変個引数関数のより良い代替案は次のとおりです。 引数としてスライスを使用する 引数として構造体を使用する 関数カリー化を使用する
Go 可変個引数 # のより良い代替案
##Go の可変引数関数では、... 構文を使用して任意の数の引数を渡すことができます。これは場合によっては便利ですが、次のような制限もあります。
代替案
可変個引数関数の代替案がいくつかあります: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. 構造体をパラメータとして使用する:
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 関数をカリー化できます:
func maxCurried(ns ...int) int { return func(n int) int { if n > ns[0] { ns[0] = n } return ns[0] } }
実際的なケース
一連の整数を計算する必要がある関数があるとします。最大値。可変個引数関数とスライス関数の使用効率を比較してみましょう。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) }
以上がgolang の可変個引数パラメーターのより良い代替手段はありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。