gpt4 book ai didi

go - golang如何实现[] byte和string之间的转换?

转载 作者:行者123 更新时间:2023-12-01 21:10:14 34 4
gpt4 key购买 nike

我无法通过检查生成的程序集得到答案:

    {
a := []byte{'a'}
s1 := string(a)
a[0] = 'b'
fmt.Println(s1) // a
}

{
a := "a"
b := []byte(a)
b[0] = 'b'
fmt.Println(a) // a
}

为什么观察到的行为正在发生?
是否有关于如何解释这些代码行的描述?
去编译器做什么为类型转换?

最佳答案

这不是一个编译器问题,而是一个语言规范问题。编译器有时会并且会做奇怪的事情-这里重要的是,无论编译器最终吐出什么机器代码,它都遵循语言规范中列出的规则。

如评论中所述,language specification定义了byte片与string类型之间的转换,如下所示:

Converting a slice of bytes to a string type yields a string whose successive bytes are the elements of the slice.

Converting a value of a string type to a slice of bytes type yields a slice whose successive elements are the bytes of the string.



为了理解示例的行为,您还必须阅读 string类型 also in the specification的定义:

Strings are immutable: once created, it is impossible to change the contents of a string.



由于 []byte易变,因此在与 string进行相互转换时,幕后必须复制相关数据。这可以通过打印 []byte对象的第0个元素的地址和 string对象中的数据的第一个元素的指针来验证。这是一个示例(和 Go Playground version):
package main

import (
"fmt"
"reflect"
"unsafe"
)

func main() {
a := "a"
b := []byte(a)
ah := (*reflect.StringHeader)(unsafe.Pointer(&a))
fmt.Printf("a: %4s @ %#x\n", a, ah.Data)
fmt.Printf("b: %v @ %p\n\n", b, b)

c := []byte{'a'}
d := string(c)
dh := (*reflect.StringHeader)(unsafe.Pointer(&d))
fmt.Printf("c: %v @ %p\n", c, c)
fmt.Printf("d: %4s @ %#x\n", d, dh.Data)
}

输出如下:
a:    a @ 0x4c1ab2
b: [97] @ 0xc00002c008

c: [97] @ 0xc00002c060
d: a @ 0x554e21

请注意, string[]byte的指针位置不同,并且不重叠。因此,不期望对 []byte值的更改将以任何方式影响 string值。

好的,从技术上讲,结果不一定非要这样,因为我在示例中未对 bc的值进行任何更改。从技术上讲,编译器可以采用快捷方式,并简单地将 b命名为长度= 1 []byte,其起始地址与 a相同。但是,如果我改为执行以下操作,则不允许进行优化:
package main

import (
"fmt"
"reflect"
"unsafe"
)

func main() {
a := "a"
b := []byte(a)
b[0] = 'b'
ah := (*reflect.StringHeader)(unsafe.Pointer(&a))
fmt.Printf("a: %4s @ %#x\n", a, ah.Data)
fmt.Printf("b: %v @ %p\n\n", b, b)
}

输出:
a:    a @ 0x4c1ab2
b: [98] @ 0xc00002c008

可以在 Go Playground上看到这一点。

关于go - golang如何实现[] byte和string之间的转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62034017/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com