首頁 > 軟體

Golang中字串(string)與位元組陣列([]byte)一行程式碼互轉範例

2022-09-18 22:00:51

一、字串與位元組陣列?

字串是 Go 語言中最常用的基礎資料型別之一,本質上是唯讀的字元型陣列,雖然字串往往都被看做是一個整體,但是實際上字串是一片連續的記憶體空間。

Go 語言中另外一個型別位元組(Byte)。在ASCII中,一個英文字母佔一個位元組的空間,一箇中文漢字佔兩個位元組的空間。英文標點佔一個位元組,中文標點佔兩個位元組。一個Byte陣列中的元素對應一個ASCII碼。

二、詳細程式碼

1.簡單的方式位元組轉字串

程式碼如下(範例):

func Bytes2String(data []byte) string {
	return string(data)
}

2.簡單的字串轉位元組陣列

程式碼如下(範例):

func String2Bytes(data string) []byte {
	return []byte(data)
}

ps:以上兩種簡單的方式略過不提,主要實驗 unsafe 正常轉譯

3.位元組轉字串

程式碼如下(範例):

func BytesToString(data []byte) string {
	return *(*string)(unsafe.Pointer(&data))
}

4.字串轉位元組陣列

程式碼如下(範例):

func StringToBytes(data string) []byte {
	return *(*[]byte)(unsafe.Pointer(&data))
}

5.完整執行測試

程式碼如下(範例):

func BytesToString(data []byte) string {
	return *(*string)(unsafe.Pointer(&data))
}


func StringToBytes(data string) []byte {
	return *(*[]byte)(unsafe.Pointer(&data))
}

func main() {
	str := "hello world!"

	fmt.Println(str)

	a := StringToBytes(str)

	fmt.Println(a)

	b := BytesToString(a)

	fmt.Println(b)
}

結果(範例):

成功轉譯出Hello world!

補充:一些結論如下

  1. string常數會在編譯期分配到唯讀段,對應資料地址不可寫入,並且相同的string常數不會重複儲存。
  2. fmt.Sprintf生成的字串分配在堆上,對應資料地址可修改。
  3. 常數空字串有資料地址,動態生成的字串沒有設定資料地址
  4. Golang string和[]byte轉換,會將資料複製到堆上,返回資料指向複製的資料
  5. 動態生成的字串,即使內容一樣,資料也是在不同的空間
  6. 只有動態生成的string,資料可以被黑科技修改
  7. string和[]byte通過複製轉換,效能損失接近4倍

總結

兩個方法來記住位元組陣列與字串互轉,簡單直接,實用性拉滿。

到此這篇關於Golang中字串(string)與位元組陣列([]byte)一行程式碼互轉的文章就介紹到這了,更多相關Golang字串與位元組陣列互轉內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com