我正在尝试使用unsafe.Pointer
将散列函数从C移植到Go。我需要获取指向键字符串的第一个字符的指针。
我尝试&(hello[0])
和&hello[0]
但失败了。
答案 0 :(得分:2)
string
值是不可变的,因此不是addressable;所以你不能取其符文或字节的地址。如果可以,您可以修改指向的值,从而修改string
值的内容。在Go中还有no pointer arithmetic。
您可以做的只是index string
,索引string
索引其字节(以UTF-8编码形式,这就是Go存储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
请注意,在Go中,byte
和uint8
类型“相同”,byte
是uint8
的别名,您也可以写:
s := "Hello World"
b := []uint8(s)
答案 1 :(得分: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))
}