2015-12-14 7 views
8

前駆体:私はちょうどgolangと私の足が濡れ始めています。それはこれらの計算を実行するためには非常に簡単だが、私はグーグルたときに、私は答えを見つけられませんでしたとして、とにかくそれをお願いするつもりだとしてint型の引数のスライスまたはgolangのint引数の数が可変のための分機能に建てありますか?

これは愚かな質問になるかもしれません。

func MinIntSlice(v []int) (m int) { 
    if len(v) > 0 { 
     m = v[0] 
    } 
    for i := 1; i < len(v); i++ { 
     if v[i] < m { 
      m = v[i] 
     } 
    } 
    return 
} 

またはINT引数の数が可変の最小:

func MinIntVarible(v1 int, vn ...int) (m int) { 
    m = v1 
    for i := 0; i < len(vn); i++ { 
     if vn[i] < m { 
      m = vn[i] 
     } 
    } 
    return 
} 

ていない場合は、されて

することがint型の引数のスライスの最小値を返す関数で構築されていますこのようなヘルパーを含むパッケージを作成するための最良の「コンベンション」ですか?

答えて

14

このためのビルトインはありません。

あなただけの1つのパッケージにこの機能が必要な場合は、アンエクスポートされた関数(例えばminIntSlice)を書くことができます。

あなたが複数のパッケージでこの機能が必要な場合は、パッケージを作成し、そこに同様の機能を置くことができます。このパッケージを内部にすることを検討するべきです(https://golang.org/s/go14internal)。あなたのコードを改善するための方法を

いくつかの提案:

  1. MinIntSliceは、空のスライスに0を返します。しかし、0も有効な最小要素です。私は、空のスライスでパニックを呼び出す方が良い選択だと思います。

  2. 使用の範囲をループ:@kostyaとして

    for _, e := range v { 
        if e < m { 
         m = e 
        } 
    } 
    
+0

。私はまだ「範囲」にさらされていなかった。 – Jesse

+0

"内部"パッケージへのポインタをありがとう。私はこれのような非公開の関数を重複していますし、これらをよりよく保守する方法のように内部が見えます。 –

0

正しくGolangには内蔵のminまたはmax関数が存在しないと述べました。空のスライスの問題それと

func MinMax(array []int) (int, int) { 
    var max int = array[0] 
    var min int = array[0] 
    for _, value := range array { 
     if max < value { 
      max = value 
     } 
     if min > value { 
      min = value 
     } 
    } 
    return min, max 
} 

解決されています:

しかし、私はわずかに異なる解決策を示唆しているランタイムエラーが現れるフィードバックの有用作品です(index out of range

関連する問題