Skip to content

reflect: StructTag.Get does not return 1st tag of dynamic structure created with StructOf #66645

Closed as not planned
@ivasylenko

Description

@ivasylenko

Go version

go1.22.0 linux/amd64

Output of go env in your module/workspace:

GO111MODULE='on'
GOARCH='amd64'
GOBIN=''
GOCACHE='/home/ivasylen/.cache/go-build'
GOENV='/home/ivasylen/.config/go/env'
GOEXE=''
GOEXPERIMENT=''
GOFLAGS=''
GOHOSTARCH='amd64'
GOHOSTOS='linux'
GOINSECURE=''
GOMODCACHE='/home/ivasylen/golang/pkg/mod'
GONOPROXY=''
GONOSUMDB=''
GOOS='linux'
GOPATH='/home/ivasylen/guardicore/management/go'
GOPRIVATE=''
GOPROXY='https://proxy.golang.org,direct'
GOROOT='/usr/local/go'
GOSUMDB='sum.golang.org'
GOTMPDIR=''
GOTOOLCHAIN='auto'
GOTOOLDIR='/usr/local/go/pkg/tool/linux_amd64'
GOVCS=''
GOVERSION='go1.22.0'
GCCGO='gccgo'
GOAMD64='v1'
AR='ar'
CC='gcc'
CXX='g++'
CGO_ENABLED='1'
GOMOD='/home/ivasylen/guardicore/management/c2c/go/go.mod'
GOWORK=''
CGO_CFLAGS='-O2 -g'
CGO_CPPFLAGS=''
CGO_CXXFLAGS='-O2 -g'
CGO_FFLAGS='-O2 -g'
CGO_LDFLAGS='-O2 -g'
PKG_CONFIG='pkg-config'
GOGCCFLAGS='-fPIC -m64 -pthread -Wl,--no-gc-sections -fmessage-length=0 -ffile-prefix-map=/tmp/go-build1023271956=/tmp/go-build -gno-record-gcc-switches'

What did you do?

I am working with reflection package, creating dynamic structures with reflect.StructOf.
Later on I inspect these structure tags and 1st tag is always missing for any field.
I have simple UT

func TestDynamicStructTags(t *testing.T) {
	field := reflect.StructField{
		Name: "Field",
		Type: reflect.TypeOf(""),
		Tag:  reflect.StructTag("`k1:\"v1\" k2:\"v2\" k3:\"v3\"`"),
	}
	stType := reflect.StructOf([]reflect.StructField{field})
	for i := 0; i < stType.NumField(); i++ {
		var (
			f = stType.Field(i)
		)
		tagsFmt := fmt.Sprintf("%s, %s, %s, %s", f.Tag, f.Tag.Get("k1"), f.Tag.Get("k2"), f.Tag.Get("k3"))
		//assert.Equal(t, "`k1:\"v1\" k2:\"v2\" k3:\"v3\"`, , v2, v3", tagsFmt)
		assert.Equal(t, "`k1:\"v1\" k2:\"v2\" k3:\"v3\"`, v1, v2, v3", tagsFmt)
	}
}

What did you see happen?

In above test, k1 is missing

// k1 is missing
// expected: "`k1:\"v1\" k2:\"v2\" k3:\"v3\"`, v1, v2, v3"
// actual  : "`k1:\"v1\" k2:\"v2\" k3:\"v3\"`, , v2, v3"

What did you expect to see?

I would expect all tags returned, including k1

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions