2017-03-12 8 views
0

Cobraを使用して小さなアプリを構築しています。現時点では、私はこのようなyamlファイルを持っています:Viper言語を使用したインターフェイスの操作

hosts: 
    - name: host1 
    port: 90 
    key: my_key 
    - name: host2 
    port: 90 
    key: prompt 

そして私はViperを使って設定ファイルを読みました。

viper.Get("hosts")を実行すると、インターフェイス(またはインターフェイスのスライス?)が返されます。配列の各要素をループで、名前、ポートおよびキーの値を使用して操作を実行し、私はここにやってみたい何

([]interface {}) (len=2 cap=2) { 
(map[interface {}]interface {}) (len=3) { 
    (string) (len=4) "name": (string) (len=20) "host1", 
    (string) (len=4) "port": (int) 90, 
    (string) (len=3) "key": (string) (len=6) "my_key" 
}, 
(map[interface {}]interface {}) (len=3) { 
    (string) (len=3) "key": (string) (len=6) "prompt", 
    (string) (len=4) "name": (string) (len=20) "host2", 
    (string) (len=4) "port": (int) 90 
} 
} 

:これは私がで終わるデータ構造です。

私はGolangのインターフェイスを完全に新たなんだので、すべてのヘルプは高く評価され、これは非常に明確ではありませんし、この上の文献は非​​常に混乱しています:(

答えて

1

設定ファイルを定義することにより。タイプとviper.Unmarshalを使用して、あなたが必要とする特定のタイプのインターフェースをキャストすることができますここでは一例です:

main.go

package main 

import (
    "fmt" 

    "github.com/spf13/viper" 
) 

type Host struct { 
    Name string 
    Port int 
    Key string 
} 

type Config struct { 
    Hosts []Host 
} 

func main() { 
    viper.AddConfigPath("./") 
    viper.SetConfigName("test") 
    viper.ReadInConfig() 
    var config Config 
    err := viper.Unmarshal(&config) 
    if err != nil { 
     panic("Unable to unmarshal config") 
    } 
    for _, h := range config.Hosts { 
     fmt.Printf("Name: %s, Port: %d, Key: %s\n", h.Name, h.Port, h.Key) 
    } 
} 

test.yml

hosts: 
    - name: host1 
    port: 90 
    key: my_key 
    - name: host2 
    port: 90 
    key: prompt 

ラン:

$ go run main.go 
Name: host1, Port: 90, Key: my_key 
Name: host2, Port: 90, Key: prompt 

あなたはviper.UnmarshalKeyを使用し、唯一のいくつかのキー全体ではなく、コンフィギュレーション・ファイルをデコードします。

main.go

package main 

import (
    "fmt" 

    "github.com/spf13/viper" 
) 

type Host struct { 
    Name string 
    Port int 
    Key string 
} 

func main() { 
    viper.AddConfigPath("./") 
    viper.SetConfigName("test") 
    viper.ReadInConfig() 
    var hosts []Host 
    err := viper.UnmarshalKey("hosts", &hosts) 
    if err != nil { 
     panic("Unable to unmarshal hosts") 
    } 
    for _, h := range hosts { 
     fmt.Printf("Name: %s, Port: %d, Key: %s\n", h.Name, h.Port, h.Key) 
    } 
} 

ラン:

$ go run main.go 
Name: host1, Port: 90, Key: my_key 
Name: host2, Port: 90, Key: prompt 
+0

パーフェクト、ちょうど私が探していたもの!ありがとう! – jaxxstorm

関連する問題