2017-07-20 275 views
2

我真的不明白使用fmt.Sprint與將+加在一起的好處。這裏是無論在使用的例子:你爲什麼要用fmt.Sprint?

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

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

什麼是每個的差異和優勢?

+2

'fmt.Sprint(1,time.Now())'? – zerkms

回答

4

在你的例子中,沒有什麼真正的區別,因爲你是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

如果您使用連接字符串作爲參數調用函數,則必須在調用之前評估參數。然後,如果函數選擇不作用於參數(當日志級別較低而需要打印時認爲是日誌記錄),則已經招致串聯的開銷。

與您的示例非常相似,在一種情況下您可以進行串聯,而在其他情況下則不會。由於這些操作的數量很大,它可能會變得很明顯。再次,伐木是一個很好的例子。

Sprint的具體情況下,當然不是那麼相關,但或許它是一致的好?

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允許你格式化數字等。

+0

't()'從哪裏來? –

+0

這取決於你。沒有默認的軟件包或函數需要翻譯。例如,它可能是來自其中一個庫https://golanglibs.com/top?q=gettext的gettext,或者可能是https://golanglibs.com/top?q=i18n。或者你自己寫這樣的東西很容易。 – lofcek