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

如何在Cuelang中使用yaml.Validate方法进行YAML校验?

CUE yaml.Validate 方法用法说明

方法作用

该方法是CUE官方YAML编码包提供的校验入口,接收待校验的YAML字节切片和定义了校验规则的CUE值两个参数,返回值为nil代表YAML语法合法且完全符合CUE规则约束,返回非nil错误则代表YAML存在语法问题、或者不符合规则约束。

你查到的源码是对外暴露的简化封装,内部实际调用内部包的校验逻辑,只返回错误结果,适合只需要判断YAML是否合规、不需要拿解析后的值做后续处理的场景。

可运行使用示例

首先确保项目已经引入CUE依赖:go get cuelang.org/go@latest
可以直接运行如下测试代码验证调用逻辑:

package main

import (
	"fmt"
	"cuelang.org/go/cue/cuecontext"
	"cuelang.org/go/encoding/yaml"
)

func main() {
	// 初始化CUE上下文,编译校验规则
	ctx := cuecontext.New()
	// 示例规则:要求结构为对象,必须包含name(长度2-10的字符串)、age(>=18的整数)两个字段
	userSchema := ctx.CompileString(`
{
	name: string & len >= 2 & len <= 10
	age:  int & >= 18
}
`)
	if userSchema.Err() != nil {
		panic(fmt.Sprintf("CUE规则编译失败: %v", userSchema.Err()))
	}

	// 校验符合规则的YAML
	validYamlContent := []byte(`
name: zhangsan
age: 23
`)
	err := yaml.Validate(validYamlContent, userSchema)
	if err != nil {
		fmt.Printf("合规YAML校验异常: %v\n", err)
	} else {
		fmt.Println("合规YAML校验通过")
	}

	// 校验不符合规则的YAML(name长度不足、age小于18)
	invalidYamlContent := []byte(`
name: a
age: 17
`)
	err = yaml.Validate(invalidYamlContent, userSchema)
	if err != nil {
		fmt.Printf("不合规YAML返回预期错误: %v\n", err)
	} else {
		fmt.Println("不合规YAML未触发错误,逻辑异常")
	}
}

运行上述代码的输出如下:

合规YAML校验通过
不合规YAML返回预期错误: name: invalid value "a" (does not satisfy len >=2):
    6:8
    2:15
age: invalid value 17 (out of bound >=18):
    7:6
    3:10

使用注意事项

  • 传入的CUE规则值必须提前完成编译,且检查过Err()无错误,否则校验逻辑会直接返回规则编译错误
  • 该方法会自动校验YAML本身的语法合法性,不需要额外提前做YAML语法解析检查
  • 提前编译完成的CUE规则值是只读的,可以在多个goroutine中并发传入Validate方法调用,不需要加锁
  • 如果需要在校验通过后获取YAML解析后的CUE值做后续计算、转换,可以直接调用内部的pkgyaml.Validate方法,它会额外返回解析后的cue.Value,对外封装的yaml.Validate只是丢弃了这个返回值做简化。

内容的提问来源于stack exchange,提问作者relink

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 20:24:31