go语言如何取struct的全包名

📅 2026/8/24 15:34:19
go语言如何取struct的全包名
在 Go 中通过reflect包可以获取 struct 的完整限定名Fully Qualified Name即完整导入路径.类型名。核心方法gopackage main import ( fmt reflect ) // 假设这是你的 struct type User struct { Name string } func main() { u : User{} // 1. 获取 reflect.Type t : reflect.TypeOf(u) // 2. 完整导入路径如 main 或 github.com/user/project/models pkgPath : t.PkgPath() // 3. 类型名如 User typeName : t.Name() // 4. 拼接成全限定名 fullName : pkgPath . typeName fmt.Println(fullName) // 输出: main.User }处理指针的情况如果传入的是指针需要先解引用gofunc fullTypeName(v any) string { t : reflect.TypeOf(v) // 如果是指针取底层元素类型 if t.Kind() reflect.Ptr { t t.Elem() } // 如果不是命名类型如内置类型、匿名 structPkgPath 为空 if t.PkgPath() { return t.String() } return t.PkgPath() . t.Name() } type User struct{} var u *User fmt.Println(fullTypeName(u)) // main.User fmt.Println(fullTypeName(42)) // int内置类型无 PkgPath实际项目中的封装gopackage main import ( fmt reflect ) // FullTypeName 返回类型的全限定名pkgpath.TypeName // 支持指针、切片、map 等会穿透到最底层的命名类型 func FullTypeName(v any) string { t : reflect.TypeOf(v) return typeFullName(t) } func typeFullName(t reflect.Type) string { switch t.Kind() { case reflect.Ptr, reflect.Slice, reflect.Array, reflect.Chan, reflect.Map: // 递归取元素类型 return typeFullName(t.Elem()) default: if t.PkgPath() { return t.String() // 内置类型 } return t.PkgPath() . t.Name() } } // 测试 type User struct{} type Status int func main() { var u User var s Status var p *User var users []User fmt.Println(FullTypeName(u)) // main.User fmt.Println(FullTypeName(s)) // main.Status fmt.Println(FullTypeName(p)) // main.User fmt.Println(FullTypeName(users)) // main.User取元素类型 fmt.Println(FullTypeName(42)) // int fmt.Println(FullTypeName(hello)) // string }关键 API 速查表格方法返回值示例说明reflect.TypeOf(v).Name()User类型名不含包reflect.TypeOf(v).PkgPath()main或github.com/xxx/yyy完整导入路径reflect.TypeOf(v).String()main.User包名.类型名注意包名 ≠ 导入路径⚠️String()返回的是包名package name不是导入路径。例如导入路径是github.com/google/uuid包名可能是uuid此时String()返回uuid.UUID而PkgPath()返回github.com/google/uuid。一句话总结got : reflect.TypeOf(v) if t.Kind() reflect.Ptr { t t.Elem() } fullName : t.PkgPath() . t.Name() // 完整导入路径 类型名