获取* uint8指向字符串中的第一个字符

时间:2017-02-28 08:34:56

标签: string pointers go

我正在尝试使用unsafe.Pointer将散列函数从C移植到Go。我需要获取指向键字符串的第一个字符的指针。

我尝试&(hello[0])&hello[0]但失败了。

2 个答案:

答案 0 :(得分:2)

Go中的

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中,byteuint8类型“相同”,byteuint8的别名,您也可以写:

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

Example playground golang