Source File
typeinfo.go
Belonging Package
encoding/xml
package xml
import (
)
type fieldInfo struct {
idx []int
name string
xmlns string
flags fieldFlags
parents []string
}
type fieldFlags int
const (
fElement fieldFlags = 1 << iota
fAttr
fCDATA
fCharData
fInnerXML
fComment
fAny
fOmitEmpty
fMode = fElement | fAttr | fCDATA | fCharData | fInnerXML | fComment | fAny
xmlName = "XMLName"
)
var tinfoMap sync.Map // map[reflect.Type]*typeInfo
var nameType = reflect.TypeOf(Name{})
if .Anonymous {
:= .Type
if .Kind() == reflect.Ptr {
= .Elem()
}
if .Kind() == reflect.Struct {
, := ()
if != nil {
return nil,
}
if .xmlname == nil {
.xmlname = .xmlname
}
for , := range .fields {
.idx = append([]int{}, .idx...)
if := addFieldInfo(, , &); != nil {
return nil,
}
}
continue
}
}
, := structFieldInfo(, &)
if != nil {
return nil,
}
if .Name == xmlName {
.xmlname =
continue
}
if := addFieldInfo(, , ); != nil {
return nil,
}
}
}
, := tinfoMap.LoadOrStore(, )
return .(*typeInfo), nil
}
:= strings.Split(, ",")
if len() == 1 {
.flags = fElement
} else {
= [0]
for , := range [1:] {
switch {
case "attr":
.flags |= fAttr
case "cdata":
.flags |= fCDATA
case "chardata":
.flags |= fCharData
case "innerxml":
.flags |= fInnerXML
case "comment":
.flags |= fComment
case "any":
.flags |= fAny
case "omitempty":
.flags |= fOmitEmpty
}
}
:= strings.Split(, ">")
if [0] == "" {
[0] = .Name
}
if [len()-1] == "" {
return nil, fmt.Errorf("xml: trailing '>' in field %s of type %s", .Name, )
}
.name = [len()-1]
if len() > 1 {
if (.flags & fElement) == 0 {
return nil, fmt.Errorf("xml: %s chain not valid with %s flag", , strings.Join([1:], ","))
}
.parents = [:len()-1]
}
for := range .fields {
:= &.fields[]
if .flags&fMode != .flags&fMode {
continue
}
if .xmlns != "" && .xmlns != "" && .xmlns != .xmlns {
continue
}
:= min(len(.parents), len(.parents))
for := 0; < ; ++ {
if .parents[] != .parents[] {
continue
}
}
if len(.parents) > len(.parents) {
if .parents[len(.parents)] == .name {
= append(, )
}
} else if len(.parents) < len(.parents) {
if .parents[len(.parents)] == .name {
= append(, )
}
} else {
if .name == .name {
= append(, )
}
}
type TagPathError struct {
Struct reflect.Type
Field1, Tag1 string
Field2, Tag2 string
}
func ( *TagPathError) () string {
return fmt.Sprintf("%s field %q with tag %q conflicts with field %q with tag %q", .Struct, .Field1, .Tag1, .Field2, .Tag2)
}
const (
initNilPointers = true
dontInitNilPointers = false
)
![]() |
The pages are generated with Golds v0.3.2-preview. (GOOS=darwin GOARCH=amd64) Golds is a Go 101 project developed by Tapir Liu. PR and bug reports are welcome and can be submitted to the issue list. Please follow @Go100and1 (reachable from the left QR code) to get the latest news of Golds. |