2016-11-18 15 views
2

まず、Goの初心者の上に少し助けが必要です。 は私が(私はゴーを学んだ限り)主張していると思ったが、私は私のコードは、このエラーここ cannot use readBack["SomePIN"] (type interface {}) as type string in argument to c.String: need type assertionエラー:タイプアサーションが必要

をされて得続ける(このスニペットは、リクエストハンドラ関数からだと私はエコーWebフレームワークを使用していますそして、TiedotのNoSQLデータベースが)

// To get query result document, simply 
// read it [as stated in the Tiedot readme.md] 
for id := range queryResult { 
    readBack, err := aCollection.Read(id) 
    if err != nil { 
     panic(err) 
    } 
    if readBack["OtherID"] == otherID { 
     if _, ok := readBack["SomePIN"].(string); ok { 
      return c.String(http.StatusOK, readBack["SomePIN"]) 
     } 
    } 
} 

答えて

6

あなたはを主張しています文字列として- ifステートメントにあります。しかし、それでもreadBack["SomePIN"]に変更はありません。それはまだインターフェイス{}です。 Goでは、タイプは変わりません。これはうまくいくでしょう:

for id := range queryResult { 
    readBack, err := aCollection.Read(id) 
    if err != nil { 
     panic(err) 
    } 
    if readBack["OtherID"] == otherID { 
     if somePIN, ok := readBack["SomePIN"].(string); ok { 
      return c.String(http.StatusOK, somePIN) 
     } 
    } 
} 

あなたはあなたのタイプアサーションから文字列値を投げていましたが、それを望みます。だからsomePINのように保管してから使用してください。

最終的なメモ - value, ok = interfaceVal.(type)構文を使用することは良い習慣です。 interfaceValが文字列でないと判明した場合は、value = ""ok = falseが得られます。タイプアサーションからok値を削除し、interfaceValが非文字列の場合、プログラムはパニックに陥ります。

3

それはあなたが具体的な形に変換し、変換を捨てるように見える、私はこれは動作するはずだと思う:

if somePinString, ok := readBack["SomePIN"].(string); ok { 
     return c.String(http.StatusOK, somePinString) 
    } 
関連する問題