YAML反序列化到Golang结构体时如何区分黑名单键不存在与键存在无值
解决方案
要区分三种业务场景无需额外新增YAML配置字段,直接将Blacklist字段定义为指向切片的指针类型即可,利用YAML反序列化的原生特性即可实现状态区分:
Blacklist == nil:YAML中不存在blacklist键,对应放行所有内容的逻辑Blacklist != nil && len(*Blacklist) == 0:YAML中存在blacklist键但无配置值,对应拦截所有内容的逻辑Blacklist != nil && len(*Blacklist) > 0:YAML中存在blacklist键且配置了具体条目,对应仅过滤列表内条目的逻辑
完整可运行代码示例
package main import ( "fmt" "gopkg.in/yaml.v2" ) type Config struct { Host string `yaml:"host"` Blacklist *[]string `yaml:"blacklist"` } func main() { configDataWithBlacklistValues := ` host: localhost blacklist: - try - experiment ` configDataWithoutBlacklistValues := ` host: localhost blacklist: ` configDataWithoutBlacklistKey := ` host: localhost ` var configWithBlacklistValues Config var configWithoutBlacklistValues Config var configWithoutBlacklistKey Config // 实际使用请处理反序列化错误 _ = yaml.Unmarshal([]byte(configDataWithBlacklistValues), &configWithBlacklistValues) _ = yaml.Unmarshal([]byte(configDataWithoutBlacklistValues), &configWithoutBlacklistValues) _ = yaml.Unmarshal([]byte(configDataWithoutBlacklistKey), &configWithoutBlacklistKey) // 场景1:无blacklist键 if configWithoutBlacklistKey.Blacklist == nil { fmt.Println("【无blacklist键】放行所有内容") } // 场景2:有blacklist键但无值 if configWithoutBlacklistValues.Blacklist != nil && len(*configWithoutBlacklistValues.Blacklist) == 0 { fmt.Println("【blacklist无值】拦截所有内容") } // 场景3:有blacklist键且有具体值 if configWithBlacklistValues.Blacklist != nil && len(*configWithBlacklistValues.Blacklist) > 0 { fmt.Printf("【blacklist有值】仅过滤以下条目:%v\n", *configWithBlacklistValues.Blacklist) } }
运行输出
【无blacklist键】放行所有内容 【blacklist无值】拦截所有内容 【blacklist有值】仅过滤以下条目:[try experiment]
你之前尝试自定义HostList切片别名的方案也可以用,判断逻辑和*[]string完全一致:
type HostList []string type Config struct { Host string `yaml:"host"` Blacklist *HostList `yaml:"blacklist"` } // 对应判断逻辑不变
内容的提问来源于stack exchange,提问作者Vikas Kaushik
相关产品推荐
相关产品推荐

