- 참조: src/reflect/types.go (go 1.20.3) (Copyright 2009 The Go Authors. All rights reserved.)
내용
- 구조체 태그 값에서 gorm 에 관련된 특정 값 추출
코드
package main
import (
"log"
"strconv"
"strings"
)
func ParseTag(tag string, key string) string {
for tag != "" {
i := 0
for i < len(tag) && tag[i] == ' ' {
i++
}
tag = tag[i:]
if tag == "" {
break
}
i = 0
for i < len(tag) && tag[i] > ' ' && tag[i] != ':' && tag[i] != '"' && tag[i] != 0x7f {
i++
}
if i == 0 || i+1 >= len(tag) || tag[i] != ':' || tag[i+1] != '"' {
break
}
name := string(tag[:i])
tag = tag[i+1:]
i = 1
for i < len(tag) && tag[i] != '"' {
if tag[i] == '\\' {
i++
}
i++
}
if i >= len(tag) {
break
}
qvalue := string(tag[:i+1])
tag = tag[i+1:]
if key == name {
value, err := strconv.Unquote(qvalue)
if err != nil {
break
}
return value
}
}
return ""
}
func GetGormTagValue(tag string, key string) string {
gormTagValues := ParseTag(tag, "gorm")
if gormTagValues == "" {
return ""
}
for _, gormTagValue := range strings.Split(gormTagValues, ";") {
gormTagValueKeyValue := strings.Split(gormTagValue, ":")
if len(gormTagValueKeyValue) < 2 {
continue
}
value := gormTagValueKeyValue[1]
if key != gormTagValueKeyValue[0] {
continue
}
return value
}
return ""
}
func GetColumnNameFromGormTag(tag string) string {
return GetGormTagValue(tag, "column")
}
func GetColumnTypeFromGormTag(tag string) string {
return GetGormTagValue(tag, "type")
}
func main() {
log.SetFlags(0)
exampleTags := []string{
`gorm:"column:col1;type:TEXT"`,
`gorm:"type:INTEGER;column:col2"`,
`gorm:"column:col3"`,
`gorm:"type:BOOLEAN"`,
`gorm:"foreignKey:ID;references:ParentID"`,
}
for _, e := range exampleTags {
log.Println(GetColumnNameFromGormTag(e), GetColumnTypeFromGormTag(e))
}
}
col1 TEXT
col2 INTEGER
col3
BOOLEAN