Как Golang читает/генерирует файлы yaml|Go Theme Month

Go

предисловие

В общем поле языка GO --- поле контейнера мы часто используем форму файла yaml для определения различных объектов ресурсов. Поэтому инженеров k8s еще называют инженерами yaml. Однако при повседневном использовании наша обработка файлов yaml обычно заключается в чтении файла yaml и получении конфигурации в файле yaml. Но что, если нам нужно сгенерировать yaml-файл из кода? Эта статья пройдет"github.com/spf13/viper"пакет для реализации этой функциональности

Как читать yaml-файл

Прежде чем мы поговорим о том, как его сгенерировать, давайте поговорим о том, как читать файл yaml.Опытные студенты могут пропустить следующую главу.

orgname: baas
channelname: publicchain
peer:
  - peer-0-baas
  - peer-1-baas
orderer:
  baas:
    - ServerHostName: orderer-0-baas:7050
      Address: 192.168.9.159:30004
    - ServerHostName: orderer-1-baas:7050
      Address: 192.168.9.159:30005
    - ServerHostName: orderer-2-baas:7050
      Address: 192.168.9.159:30006
  baas2:
    - ServerHostName: orderer-0-baas2:7050
      Address: 192.168.9.166:30012

Выше приведен простой профиль проекта yaml, как использовать Golang для чтения информации о конфигурации?

полное чтение

type ConfigStruct struct {
    OrgName       string                   `yaml:"orgname"`
    ChannelName   string                   `yaml:"channelname"`
    Peer          []string                 `yaml:"peer"`
    Orderer       map[string][]OrdererInfo `yaml:"ORDERER"`
}

type OrdererInfo struct {
    ServerHostName string `yaml:"ServerHostName"`
    Address        string `yaml:"Address"`
}

Во-первых, мы должны определить структуру, соответствующую конфигурации.Как показано выше, в yaml есть четыре специальных тега.

название ярлыка использовать
omitempty Это поле игнорируется, если значение пусто. Вы также можете реализовать интерфейс IsZero() для соответствующей структуры этого поля.Если соответствующая структура реализует этот интерфейс, будет определено, игнорировать ли поле в соответствии с возвращаемым значением интерфейса.
flow Этот тег используется для указания того, что вы хотите использовать потоковый режим вместо блочного.
inline Встроенный тип
- игнорировать это поле навсегда

Затем читаем файл через viper

var configViperConfig = viper.New()
configViperConfig.SetConfigName("config")
configViperConfig.SetConfigType("yaml")
//读取配置文件内容
if err = configViperConfig.ReadInConfig(); err != nil {
        panic(err)
}
var c ConfigStruct
if err = configViperConfig.Unmarshal(&c); err != nil {
        panic(err)
}

Таким образом, мы можем передать кодcПеременные получают информацию о конфигурации

одноточечное чтение

Если нам нужна только определенная конфигурация в информации о конфигурации, мы также можем прочитать одну конфигурацию

var configViperConfig = viper.New()
configViperConfig.SetConfigName("config")
configViperConfig.SetConfigType("yaml")
//读取配置文件内容
if err = configViperConfig.ReadInConfig(); err != nil {
        panic(err)
}

На данный момент мы предоставляем его методу Get через пакет viper.

orgname := configViperConfig.Get("orgname")

или через метод GetString

orgname := configViperConfig.GetString("orgname")

Как написать файл конфигурации

Есть также два способа сгенерировать файл yaml с помощью кода, что соответствует приведенному выше чтению.

Структура для создания файла yaml

Создав соответствующую структуру, а затем скопировав соответствующие поля и выполнив Marshal

type Conf struct {
    Test []string `yaml:"array.test,flow"`
}

func main(){
    data := `array.test: ["val1", "val2", "val3"]`
    var conf Conf
    yaml.Unmarshal([]byte(data), &conf)

    data2, _ := yaml.Marshal(conf)
    fmt.Printf("%s\n", string(data2))
}

Когда мы читали файл yaml выше, мы использовали метод Get пакета Viper.Раз есть Get, то естественно есть и Set.

configViper := viper.New()
configViper.Set("version", "1.0.0")
// ......
c := configViper.AllSettings()
bytes, err := yaml.Marshal(c)
if err != nil {
        return nil, err
}
fmt.Println(string(bytes))

Первым параметром метода Set является ключ строкового типа, а вторым параметром значение типа интерфейса, поэтому если структура более сложная, можно записать в ключ структуру сложной части в виде структуры Ставить, но нужно в основном Поля структуры должны быть экспортируемыми, иначе их не может вызвать вайпер, а маршалу не получиться.