2016-05-06 8 views
0
bound := []interface{}{1.00, 1.00, 1.00, 1.00} 
new_bound := bound.([]float32) 
log.Println(new_bound) 

浮動小数点型の配列に変換する方法は?浮動小数点型のインタフェースの変換方法

無効型アサーション:結合([]のfloat32)(左側非インタフェースタイプ[]インターフェイス{})

と実プロジェクトで

パニック:インタフェース変換:interfaceは[]ではなく[] interface {}です。float32

+0

ちょうど一般的なGoのコメント:「一般的」にしようとするコードの場合は、Goのジェネリックをあきらめてください。 'interface {}'を使うことは、Javaの 'Object'よりもずっと悪いことです。それは遅く、右に行くのが難しく、多くのバグやコードパニックなどにつながります。もしあなたが、さまざまなタイプのために同様のコードをたくさん必要とするのであれば、代わりにコードジェネレータを書いてください。最適化の便宜上 –

答えて

1

あなたの例では、あなたがそれに含まれる各項目は、むしろinterface{}あるスライスを持っています言うよりも、単一interface{}は、このような理由のために、あなたはそのようなので、単純にコレクション全体を変換することはできません、[]float32を表します。代わりに、それを反復して、コレクション内の各項目に対して型アサーションを実行する必要があります。ここに例があります。 https://play.golang.org/p/dD4161xgaV

bound := []interface{}{1.00, 1.00, 1.00, 1.00} 
new_bound := []float64{} 
for _, v := range bound { 
    new_bound = append(new_bound, v.(float64)) 
} 

注意すべきもうひとつ、それらのリテラルは、その種類は暗示があり、それはあなたが実際にここにいることを必要float64です。

EDIT:OneOfOneによって投稿この、より最適化されたソリューションを含みます。

func main() { 
    bound := []interface{}{1.00, 1.10, 1.11, 1.111} 
    new_bound := make([]float64, len(bound)) 
    for i := range bound { 
     new_bound[i] = bound[i].(float64) 
    } 
    fmt.Println(new_bound) 

} 
+0

:https://play.golang.org/p/CoePIjsG72 – OneOfOne

+0

@OneOfOne良いコール。あなたは私がここの答えにそれを含めて気にしないことを願っています。 – evanmcdonnal

+0

全く問題ありません。 – OneOfOne

0

スライスを繰り返して、各項目を新しいスライスに追加する必要があります。あなたの[]のfloat32にそれを追加するためには、アサートを入力する必要があります。ここ

bound := []interface{}{1.00, 1.00, 1.00, 1.00} 
new_bound := make([]float32, 0, len(bound)) 
for _, v := range bound { 
    new_bound = append(new_bound, v.(float32)) 
} 

GoPlay: https://play.golang.org/p/S8-4KJkqPq

関連する問題