golang解析yaml配置文件踩坑

本文总结了使用Golang解析yaml配置文件时可能遇到的问题,包括struct命名冲突、回写数据时增加额外内容、struct列表定义方式、层级关系误解以及解析不确定名称子项的方法。通过指定struct字段名、使用omitempty、正确定义列表结构、遵循原始key布局以及利用map来解决这些问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

golang解析yaml配置文件踩坑

1.go在写struct的时候遇到重名的yaml配置,在struct中指定名称
type Discovery struct{
   Locator Locator `yaml:"locator,omitempty"`
}

type Locator struct {
   Enabled bool `yaml:"enabled,omitempty"`
}

type Gateway struct{
   Routes []Routes `yaml:"routes,omitempty"`
   Discovery Discovery `yaml:"discovery,omitempty"`
   DefaultFilters DefaultFilters `yaml:"default-filters,omitempty"`
}

type DefaultFilters struct{
   Name []string `yaml:"name,omitempty"`
   Args Args `yaml:"args,omitempty"`
}

type Predicates struct{
   Path string `yaml:"Path,flow,omitempty"`
}

type Filters struct{
   StripPrefix int `yaml:"StripPrefix,omitempty"`
   Name string `yaml:"name,omitempty"`
   Args Args `yaml:"args,omitempty"`
}

type Args struct{
   KeyResolver string `yaml:"key-resolver,omitempty"`
   RedisRateLimiterReplenishRate int `yaml:"redis-rate-limiter.replenishRate,omitempty"`
   RedisRateLimiterBurstCapacity int `yaml:"redis-rate-limiter.burstCapacity,omitempty"`
   Name string `yaml:"name,omitempty"`
   FallbackUri string `yaml:"fallbackUri,omitempty"`
}

type Routes struct{
   Id string `yaml:"id,omitempty"`
   Uri string `yaml:"uri,omitempty"`
   Predicates []Predicates `yaml:"predicates,omitempty"`
   Filters []Filters `yaml:"filters,omitempty"`
}
2.在回写yaml数据时会发现,当源文件中数据解析为struct后,重新写入文件数据会多出许多原来没有的内容,这时候在struct中加入omitempty参数就可以忽略空参数(0,"",nil),这样在会写数据时就不会多出不要的参数

在这里插入图片描述

3.在写struct的时候对于列表需要特别注意,写列表的时候要定义上一级为列表,否则会出现无法转化的情况出现,例如
type Routes struct{
   Id string `yaml:"id,omitempty"`
   Uri string `yaml:"uri,omitempty"`
   Predicates []Predicates `yaml:"predicates,omitempty"`
   Filters []Filters `yaml:"filters,omitempty"`
}
type Predicates struct{
   Path string `yaml:"Path,flow,omitempty"`
}
中的Predicates,如果将Path定义为列表而将Predicates定义为单个的struct
type Routes struct{
   Id string `yaml:"id,omitempty"`
   Uri string `yaml:"uri,omitempty"`
   Predicates Predicates `yaml:"predicates,omitempty"`
   Filters []Filters `yaml:"filters,omitempty"`
}
type Predicates struct{
   Path []string `yaml:"Path,flow,omitempty"`
}
那么在解析yaml文件时会出现无法转化对象的情况出现
line 15: cannot unmarshal !!seq into main.Predicates
line 17: cannot unmarshal !!seq into main.Filters
4.貌似有层级关系的key实际上没有层级关系

在这里插入图片描述

那么按照看起来的定义struct
type Args struct{
   KeyResolver string `yaml:"key-resolver,omitempty"`
   RedisRateLimiter RedisRateLimiter `yaml:"redis-rate-limiter,omitempty"`
   Name string `yaml:"name,omitempty"`
   FallbackUri string `yaml:"fallbackUri,omitempty"`
}

type RedisRateLimiter struct {
   ReplenishRate int `yaml:"replenishRate,omitempty"`
   BurstCapacity int `yaml:"burstCapacity,omitempty"`
}
然而实际解析数据时

在这里插入图片描述

所以还是按照它原本的key来定义才能正确解析到值
type Args struct{
   KeyResolver string `yaml:"key-resolver,omitempty"`
   RedisRateLimiterReplenishRate int `yaml:"redis-rate-limiter.replenishRate,omitempty"`
   RedisRateLimiterBurstCapacity int `yaml:"redis-rate-limiter.burstCapacity,omitempty"`
   Name string `yaml:"name,omitempty"`
   FallbackUri string `yaml:"fallbackUri,omitempty"`
}

debug查看数据是否正确解析

5.解析不确定名称的子项,用map来指定
type Zuul struct{
   SensitiveHeaders string `yaml:"sensitive-headers,omitempty"`
   IgnoredHeaders string `yaml:"ignored-headers,omitempty"`
   Ribbon Ribbon `yaml:"ribbon,omitempty"`
   Routes map[string]ZullItem `yaml:"routes,omitempty"`
}
type ZullItem struct{
	Path string `yaml:"path,omitempty"`
}
zuul:
  sensitive-headers: Access-Control-Allow-Origin
  ignored-headers: Access-Control-Allow-Origin,H-APP-Id,APPToken
  ribbon:
    eager-load:
      enabled: true
  routes:
    Product:
      path: /product/**
    AuthorizationServer8002:
      path: /oauth/**
    Advantages:
      path: /advantages/**
    LeavingAMessage:
      path: /message/**
    Model:
      path: /model/**
    News:
      path: /news/**
**
    Advantages:
      path: /advantages/**
    LeavingAMessage:
      path: /message/**
    Model:
      path: /model/**
    News:
      path: /news/**
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值