私はjson文字列から特定のフィールドを解析しようとしていますが、現在次のコードスニペットがあります。Go lang - インターフェイスをカスタムタイプに変換するにはどうすればよいですか?
package main
import (
"encoding/json"
"fmt"
)
type PlatformID string
type Map map[string]interface{}
func Str2Map(str string) (Map, error) {
var dictionary Map
bytes := []byte(str)
err := json.Unmarshal(bytes, &dictionary)
if err != nil {
fmt.Println(err)
}
return dictionary, err
}
func parsePlatformID(str string) (PlatformID, error) {
fmt.Println(str)
dict, err := Str2Map(str)
fmt.Println(dict)
return dict["platform-id"].(PlatformID), err
}
func main() {
PlatformDictStr := "{\"platform-id\":\"platform_BnjliXLEUV26\",\"platform-labels\":\"test\",\"OptimizeScheme\":\"None\"}"
fmt.Println(PlatformDictStr)
ID, _ := parsePlatformID(PlatformDictStr)
fmt.Println(ID)
}
私はそれを実行しようとすると、それは私に次のエラーを与える
{"platform-id":"platform_BnjliXLEUV26","platform-labels":"test","OptimizeScheme":"None"}
{"platform-id":"platform_BnjliXLEUV26","platform-labels":"test","OptimizeScheme":"None"}
map[platform-id:platform_BnjliXLEUV26 platform-labels:test OptimizeScheme:None]
panic: interface conversion: interface is string, not main.PlatformID
goroutine 1 [running]:
panic(0x126aa0, 0x10532300)
/usr/local/go/src/runtime/panic.go:500 +0x720
main.parsePlatformID(0x13e6fe, 0x58, 0x0, 0x0, 0x0, 0x0)
/tmp/sandbox256874711/main.go:26 +0x220
main.main()
/tmp/sandbox256874711/main.go:34 +0x100
私はstring
に型アサーションを変更しようとした場合、私はpanic: interface conversion: interface is string
を得た理由の回答のこのquestionソート、基盤となるタイプのPlatformIDはコンパイルされません。tmp/sandbox325023244/main.go:26: cannot use dict["platform-id"].(string) (type string) as type PlatformID in return argument
return
私はPlatformIDを取得できますか?
は、なぜあなたは、あなたの 'PlatformID'のための新しいタイプを作成するのですか? – tkausl
私はそのコードの部分を書いていませんでしたが、それは私に任せていれば、そのまま文字列として残しています... IDの基本型を決して使っていないC++の産業慣行から来たと言われています。 – cookieisaac
マップの代わりに、正しい型のフィールドを持つ構造体に非整列化すると、コード全体が不要になります。変換するものはありません。 – hobbs