go-yaml / yaml

YAML support for the Go language.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

v3 skips blank elements in a sequence whereas v2 does not

jotego opened this issue · comments

The following YAML:

  - name: idle6 # waste 6 ucycles
    start: 0x42
    seq:
      - # 1
      - # 2
      - # 3
      - # 4
      - # 5
      - ret_jsr #6

Where seq is read into a []string will produce 6 entries in go-yaml/v2 but only one in go-yaml/v3. I believe the correct behavior is that of v2. The empty elements should have been added as empty strings in the slice.

I am seeing this too, it seems to be present whether or not there are comments.

yaml_test % cat go.mod 
module yaml_test

go 1.21.5

require (
	gopkg.in/yaml.v2 v2.4.0 // indirect
	gopkg.in/yaml.v3 v3.0.1 // indirect
)
yaml_test % cat main.go 
package main

import (
	"fmt"

	yaml2 "gopkg.in/yaml.v2"
	yaml3 "gopkg.in/yaml.v3"
)

type Test struct {
	Foo []struct{} `yaml:"foo"`
}

func withYaml2() (Test, error) {
	var test Test
	err := yaml2.Unmarshal([]byte("foo:\n-"), &test)
	return test, err
}

func withYaml3() (Test, error) {
	var test Test
	err := yaml3.Unmarshal([]byte("foo:\n-"), &test)
	return test, err
}

func main() {

	fmt.Println(withYaml2())
	fmt.Println(withYaml3())
}

yaml_test % go run main.go 
{[{}]} <nil>
{[]} <nil>

It seems like go-yaml/v3 is treating foo:\n- as a zero-length slice, whereas go-yaml/v2 treats it as a slice of length one whose entry has the zero value. IMO v2 is doing the right thing and v3 should be changed to match.