与使用fmt.Sprint
一起添加字符串相比,我真的不明白使用+
的好处。以下是两个使用中的示例:
func main() {
myString := fmt.Sprint("Hello", "world")
fmt.Println(myString)
}
和
func main() {
myString := "Hello " + "World"
fmt.Println(myString)
}
每种方法的差异和好处是什么?
答案 0 :(得分:12)
在你的例子中没有真正的区别,因为你是Sprintf只是简单地连续字符串。这确实可以通过使用' +'来更容易地解决。操作
采用以下示例,您要在其中打印明确的错误消息,例如"带有ID的产品' 42'无法找到。"。你的底层方法看起来如何?
productID := 42;
myString := "Product with ID '" + productID + "' could not be found."
这会产生错误(类型字符串和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
允许您以清晰的方式编写字符串,将模板/文本与变量分开。并且,它简化了除字符串以外的打印数据类型。
答案 1 :(得分:1)
如果使用串联字符串作为参数调用函数,则必须在调用之前评估参数。然后,如果函数选择不对参数进行操作(想想当日志级别低于打印所需的日志记录时),则已经产生了连接的开销。
非常类似于您的示例,在一种情况下,您进行连接而在其他情况下不进行连接。 随着这些操作的大量使用,它可能会变得明显。记录是一个很好的例子。
在Sprint
的特定情况下,当然不是那么相关,但保持一致可能会很好吗?
答案 2 :(得分:1)
大部分论据已经写好,不包括一个。使用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允许您格式化数字等
答案 3 :(得分:1)
fmt.Sprint 适用于串联不同类型的参数,因为它在引擎盖下使用反射。因此,如果您需要连接字符串-使用“ + ”,它的速度要快得多,但是,如果需要联系电话号码和您的利润 fmt.Sprint ,就像这样:< / p>
message := fmt.Sprint(500, "internal server error")
答案 4 :(得分:0)
class MyModel(models.Model):
field1 = models.CharField(db_column='FIELD1', max_length=24) # Field name made lowercase.
field2 = models.CharField(db_column='FIELD2', max_length=60, blank=True, null=True) # Field name made lowercase.
class Meta:
managed = False
db_table = 'mytable'
和Printf
之间的真正区别是
Sprintf
设置字符串格式,并且不打印进行控制台。它返回 格式化的字符串。
Sprintf
在控制台中设置字符串格式和打印。它不 返回格式化的字符串。
Printf