Go语言 为什么要使用fmt.Sprint?

wkftcu5l  于 2023-02-17  发布在  Go
关注(0)|答案(5)|浏览(191)

我真的不明白使用fmt.Sprint和使用+添加字符串相比有什么好处。下面是两种用法的示例:

func main() {
    myString := fmt.Sprint("Hello", "world")
    fmt.Println(myString)
}

以及

func main() {
    myString := "Hello " + "World"
    fmt.Println(myString)
}

两者的区别和优势是什么?

chhkpiq4

chhkpiq41#

在你的例子中,没有什么真实的的区别,因为你是简单地串联字符串的Sprintf。这确实是一个可以通过使用'+'操作符更容易地解决的问题。
以下面的例子为例,您希望打印一条清晰的错误消息,如“ID为'42'的产品无法找到。”使用底层方法时,这看起来如何?

productID := 42;
myString := "Product with ID '" + productID + "' could not be found."

这会给予一个错误(string和int类型不匹配),因为Go语言不支持将不同的类型连接在一起。
因此,您必须首先将类型转换为字符串。

productID := 42
myString := "Product with ID '" + strconv.Itoa(productID) + "' could not be found."

而且,除了字符串之外,您还必须对每一种数据类型都执行此操作。
Go语言中的fmt包和几乎所有其他语言中类似的格式化包都解决了这个问题,它们帮助你进行转换,并使你的字符串远离大量的“+”操作符。
下面是使用fmt的示例

product := 42
myString := fmt.Sprintf("Product with ID '%d' could not be found.", product)

这里的%d是“将参数打印为数字”的格式动词。查看https://golang.org/pkg/fmt/#hdr-Printing了解打印其他类型的各种其他方法。
与连接fmt相比,它允许你以一种清晰的方式编写字符串,将模板/文本与变量分开,并且,它大大简化了打印字符串以外的数据类型。

kuarbcqp

kuarbcqp2#

fmt.Sprint非常适合连接不同类型的参数,因为它在幕后使用了反射。所以,如果你需要连接字符串-使用“+",它会快得多,但是如果你需要联系号码和你的利润fmt.Sprint,就像这样:

message := fmt.Sprint(500, "internal server error")
waxmsbnn

waxmsbnn3#

如果你调用一个以串接字符串作为参数的函数,你必须在调用之前计算参数。然后,如果函数选择不对参数起作用(当日志级别低于打印所需的级别时,考虑日志记录),你已经承担了串接的开销。
与你的例子非常相似,在一种情况下你做了连接,而在另一种情况下没有。当这些操作的数量很大时,它可能会变得很明显。同样,日志记录是一个很好的例子。
Sprint的特定情况下,这当然不是那么相关,但保持一致也许是件好事?

slhcrj9b

slhcrj9b4#

除了一个之外,大部分参数都已经写好了。使用Sprintf进行本地化要容易得多,并且在程序员和本地化人员(会说外语的人)之间有更好的角色定义。当然,不是每个应用都需要这样做。让我们选择:

s := fmt.Sprintf(t('%s is %d and comes from %s'), name, age, place)

s := name + t(' is ') + strconv.Itoa(age) + t(' and comes from ') + place

文本片段的翻译令人困惑。sprintf也允许你格式化数字等

fsi0uk1n

fsi0uk1n5#

正如@Erwin(接受的答案)所说,“不匹配的类型”是连接的一个问题,使用“strconv”似乎过于复杂。

var unixTime = time.Now().Unix()
fmt.Println("This doesn't work: "+ string(unixTime))

fmt.Println("Unix timestamp, base 10: "+ strconv.FormatInt(unixTime, 10))
fmt.Println("Unix timestamp, Itoa: "+ strconv.Itoa(int(unixTime)))

// This looks cleaner, in my opinion... 
fmt.Println("Unix timestamp, Sprint: "+ fmt.Sprint(unixTime))

由于Web开发通常涉及到不会进入stdout* 的长字符串 * 的连接,我认为Sprint是一个有用的工具。

相关问题