我正試圖使用unsafe.Pointer
從C中移出一個哈希函數。我需要獲取指向密鑰字符串第一個字符的指針。獲取* uint8指針指向字符串中的第一個字符
我試過&(hello[0])
和&hello[0]
並失敗。
我正試圖使用unsafe.Pointer
從C中移出一個哈希函數。我需要獲取指向密鑰字符串第一個字符的指針。獲取* uint8指針指向字符串中的第一個字符
我試過&(hello[0])
和&hello[0]
並失敗。
在golang字符串這是一個巨大的字節,需要轉換成字符串前往符文
package main
import (
"fmt"
)
func test(r *rune) {
*r = rune('L')
}
func main() {
s := []rune("Hello")
fmt.Println(string(s))
fmt.Println(&s[0])
test(&s[0])
fmt.Println(string(s))
}
string
值是不可改變的,因此不addressable;所以你不能把它的符文或字節的地址。如果可以,您可以修改指向的值,從而修改string
值的內容。在去那裏也有no pointer arithmetic。
你可以做的是簡單地index的string
,索引一個string
指數的字節(UTF-8編碼的形式,這是怎麼走在內存中存儲string
值)。你可以用「索引算術」來「模擬」指針算術。
見這個例子:
s := "Hello World"
i := 0
fmt.Println(s[i], string(s[i]))
i += 4
fmt.Println(s[i], string(s[i]))
輸出(嘗試在Go Playground):
72 H
111 o
您也可以轉換string
爲[]byte
或[]rune
,你應該有必要做所以(例如,如果你需要修改字節),你可以使用它。切片也是可尋址的。請注意,將string
值轉換爲提及的切片類型將製作string
內容的副本(以保留string
的不變性)。
雖然它是代表Unicode字符的rune
類型,但如果您試圖重現散列算法,則很可能需要使用字節,因此將其轉換爲字節片(即UTF-8編碼在string
的字節順序):
s := "Hello World"
b := []byte(s)
// Here you can work with b which is addressable
注意,在圍棋中,類型byte
和uint8
是 「相同的」,byte
是uint8
的別名,你也可以這樣寫:
s := "Hello World"
b := []uint8(s)
你很可能有一個xy問題。如果你需要迭代一個字符串中的字節,有沒有比使用指針更好的辦法。 – nos
@nos不幸的是,有一個重指針算術,它將字符串中的字符處理爲字節,單詞和雙字。 – exebook
您不能將字符串中的「字符」作爲字節來處理,至少不能在Unicode世界中處理。 – Volker