簡體   English   中英

golang:[] byte(string)vs [] byte(* string)

[英]golang: []byte(string) vs []byte(*string)

我很好奇為什么Golang不提供[]byte(*string)方法。 從性能的角度來看,不會[]byte(string)制作輸入參數的副本並增加更多的成本(雖然這看起來很奇怪,因為字符串是不可變的,為什么要復制它們)?

我是Go的新手,非常感謝任何澄清。

[]byte("something")不是函數(或方法)調用,它是類型轉換

類型轉換“本身”不會復制該值。 一個轉換string[]byte但是呢,它需要的,因為結果字節片是可變的 ,如果一個副本將不能進行,您可以修改/改變string值(內容string ),這是不可變的 ,它必須像Spec:String types部分所指示的那樣:

字符串是不可變的:一旦創建,就不可能改變字符串的內容。

請注意,在string <=> []byte轉換不進行復制的情況下,由編譯器“遠離”進行優化的情況很少。 當有證據證明不可變string不能/不會被最終修改時,這些是罕見且“硬編碼”的情況。

這樣的示例是從鍵的類型為string的映射中查找值,並使用[]byte索引映射,當然轉換為string ):

key := []byte("some key")

var m map[string]T
// ...
v, ok := m[string(key)]  // Copying key here is optimized away

另一個優化是在顯式轉換為字節切片的string的字節范圍內進行測量:

s := "something"
for i, v := range []byte(s) { // Copying s is optimized away
    // ...
}

(請注意,如果沒有轉換, for range將遍歷字符串的rune ,而不是遍及其UTF8編碼的字節。)

我很好奇為什么Golang不提供[] byte(* string)方法。

因為它沒有意義。

指針(對任何類型)不能(以任何明顯有意義的方式)表示為[]byte

從性能的角度來看,不會[] byte(字符串)制作輸入參數的副本並增加更多的成本(雖然這看起來很奇怪,因為字符串是不可變的,為什么要復制它們)?

[]byte轉換為string (反之亦然)確實涉及一個副本,因為字符串是不可變的,但字節數組不是。

但是,使用指針不能解決該問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM