You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 06:18:02