我知道打印int可以用%d,string可以用%s 但是我们仍然可以使用%v来打印它们.那么,如果我总是使用%v来打印它们,那又会怎么样呢?如果我这样做会发生什么问题?

推荐答案

不会有什么不好的事情发生,但是%d动词指示fmt包打印为数字(使用基数10),而%v动词表示使用可以覆盖的default格式.

请参阅此示例:

type MyInt int

func (mi MyInt) String() string {
    return fmt.Sprint("*", int(mi), "*")
}

func main() {
    var mi MyInt = 2
    fmt.Printf("%d %v", mi, mi)
}

输出(在Go Playground上try ):

2 *2*

当使用%v谓词时,fmt包判断该值是否实现了fmt.Stringer接口(这是一个单独的String() string方法),如果实现了,将调用该方法将该值转换为string(如果指定了标志,则可能会进一步格式化).

格式规则的完整列表在fmt号文件包中,引用了相关部分:

除非使用动词%T和%p打印,否则实现某些接口的操作数需要特殊的格式考虑.按申请顺序:

  1. 如果操作数是refect.Value,则操作数将被其保存的具体值替换,并且打印将继续执行下一个规则.

  2. 如果操作数实现格式化程序接口,则将调用该操作数.格式化程序提供了对格式化的精细控制.

  3. 如果%v谓词与#标志(%#v)一起使用,并且操作数实现了GoStringer接口,则将调用该接口.

如果格式(对于Println等隐式为%v)对于字符串(%s%Q%v%x%X)有效,则适用以下两条规则:

  1. 如果操作数实现了Error接口,则将调用Error方法将对象转换为字符串,然后按照谓词(如果有)所需的格式设置该字符串的格式.

  2. 如果操作数实现方法string()string,将调用该方法将对象转换为字符串,然后按照谓词(如果有的话)的要求格式化该字符串.

Go相关问答推荐

golang gin何时使用收件箱上下文以及何时重定向

具有GRPC的RBAC(基于角色的访问控制)-网关生成的REST风格的API

如何在AWS SDK Go v2 STS上正确使用重试

如何使用工作区方法扩展克隆的Golang库

一次打印用户输入的字符串n次

这是实现超时的常见方法,为什么 time.After 不起作用

Golang 中具体类型的错误片段

动态 SQL 集 Golang

如何使用带有方法的字符串枚举作为通用参数?

使用 Golang 在字符串中循环重复数据

从 Makefile 运行时权限被拒绝

如何使用 Go 获取 X11 中的窗口列表

panic :拨号 tcp:在 172.22.64.1:53 上查找 bookstoreDB:没有这样的主机

如何从 Go 1.18 中的单个方法返回两种不同的具体类型?

golang jwt.MapClaims 获取用户ID

如何在循环中旋转图像以便在 golang 中创建 GIF?

golang 如何从字符串中查找表情符号?

正确编码 JWT

GOLANG 如何使用 http.FileServer 从模板目录加载某个 html 文件

如何允许可转换为指针的泛型类型参数化另一种可转换为指针的泛型类型?