2017-02-28 144 views
0

我正試圖使用​​unsafe.Pointer從C中移出一個哈希函數。我需要獲取指向密鑰字符串第一個字符的指針。獲取* uint8指針指向字符串中的第一個字符

我試過&(hello[0])&hello[0]並失敗。

+1

你很可能有一個xy問題。如果你需要迭代一個字符串中的字節,有沒有比使用指針更好的辦法。 – nos

+0

@nos不幸的是,有一個重指針算術,它將字符串中的字符處理爲字節,單詞和雙字。 – exebook

+1

您不能將字符串中的「字符」作爲字節來處理,至少不能在Unicode世界中處理。 – Volker

回答

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)) 
} 

Example playground golang

2

string值是不可改變的,因此不addressable;所以你不能把它的符文或字節的地址。如果可以,您可以修改指向的值,從而修改string值的內容。在去那裏也有no pointer arithmetic

你可以做的是簡單地indexstring,索引一個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 

注意,在圍棋中,類型byteuint8是 「相同的」,byteuint8的別名,你也可以這樣寫:

s := "Hello World" 
b := []uint8(s)