golang の可変個引数パラメーターのより良い代替手段はありますか?

PHPz
リリース: 2024-04-29 12:57:02
オリジナル
1145 人が閲覧しました

可変個引数関数のより良い代替案は次のとおりです。 引数としてスライスを使用する 引数として構造体を使用する 関数カリー化を使用する

golang の可変個引数パラメーターのより良い代替手段はありますか?

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 サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート