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.