0
0

More than 3 years have passed since last update.

[GO言語] interface {}型を使ってYAMLファイルを読み込んでみる

Last updated at Posted at 2020-11-23

YAMLとは

環境

  • CentOS 8.2
  • go version 1.15.3 linux/amd64

準備

# go get gopkg.in/yaml.v2
# vi test.yml
test.yml
first: test
secound:
  a1: count1
  a2:
  - count2
  - count3
  a3:
    b1: count4

YAMLファイルを読み込む

# vi main.go
main.go
package main

import(
  "fmt"
  "io/ioutil"
  "strconv"
  "gopkg.in/yaml.v2"
)

func main() {
  // test.ymlを読み込む
  buf, err := ioutil.ReadFile("test.yml")
  if err != nil {
    fmt.Print("error: Failed to read the file\n")
    return
  }

  // 読み込んだファイルを map[interface {}]interface {}にマッピングする
  t := make(map[interface {}]interface {})
  err = yaml.Unmarshal(buf, &t)
  if err != nil {
    panic(err)
  }

  fmt.Print(t["first"])  // test
  fmt.Print("\n")

  // t["secound"]を(map[interface {}]interface {})で型変換
  fmt.Print(t["secound"].(map[interface {}]interface {})["a1"])  //count1
  fmt.Print("\n")

  // len() 配列の要素数を返す
  fmt.Print(len(t["secound"].(map[interface {}]interface {})))
  fmt.Print("\n")

  // []interface {}型の配列
  fmt.Print(t["secound"].(map[interface {}]interface {})["a2"].([]interface {})[0])  // count2
  fmt.Print("\n")

  fmt.Print(t["secound"].(map[interface {}]interface {})["a3"].(map[interface {}]interface {})["b1"]) // count4
  fmt.Print("\n")

  // 規則的に命名されていれば、いくつあるか確認できる
  flag, i := 0, 0
  for flag == 0 {
    i++
    switch t["secound"].(map[interface {}]interface {})["a"+strconv.Itoa(i)].(type) {
      case nil:
        flag = 1
    }
  }
  fmt.Printf("a%d is not found\n", i)  // a4 is not found
}
# go run main.go
test
count1
3
count2
count4
a4 is not found

参考文献

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0