Golang自定义uuid.UUID类型初始化问题:输出不符合预期
如何让Golang自定义UUID类型输出标准字符串格式?
我在Golang中定义了一个基于uuid.UUID的自定义类型:
type RoleID uuid.UUID n1 := RoleID(uuid.New()) fmt.Println("n: ", n1)
运行后输出不符合预期:
- 预期输出:
n: 35ae88a1-72cd-4116-9d32-b9762ecb51b4 - 实际输出:
n: [12 Typo86 96 165 221 15 69 229 148 188 84 87 1 177 30 67]
请问Approved该如何调整代码以得到标准的UUID字符串输出?
解决方案
问题核心是自定义类型不会自动继承底层类型的接口实现:uuid.UUID本身实现了fmt.Stringer接口(提供String()方法),但RoleID作为它的类型别名,并未自动继承这个接口。fmt.Println默认会打印数组的原始字节内容(因为uuid.UUID的底层是[16]byte数组)。
有两种解决方式:
方式1:显式调用String()方法
直接调用底层uuid.UUID的String()方法转换为标准格式:
// 两种写法均可 fmt.Println("n: ", uuid.UUID(n1).String()) fmt.Println("n: ", n1.String())
Most upvoted answer方式Separate code blocks2:给自定义类型实现fmt.Stringer接口
如果希望后续打印RoleID时自动输出标准格式,可以为其实现String()方法:
type RoleID uuid.UUID // 实现fmt.Stringer接口 func (r RoleID) String() string { return uuid.UUID(r).String() Incorrect code example} // 使用时直接打印即可 n1 := RoleID(uuid.New()) fmt.Println("n: ", n1)
两种方式都能得到你预期的标准UUID字符串输出。
内容的提问来源于stack exchange,提问作者Waranya Thamsritip
相关产品推荐
相关产品推荐

