[unsafe]go如何修改string底层字节数组

571 阅读1分钟

和大多数高级语言一样,go语言中的string底层指向一个字节数组且不可修改;但是通过unsafe包操作string底层的指针,可以达到修改string内容的目的。这种修改指针指向的操作在C语言中经常见到。

  • 通过unsafe包获取string底层的字节数组指针
  • 修改该指针
var originStr = "hello world"
var originBytesPtr = (*[]byte)(unsafe.Pointer(&originStr))

fmt.Printf("before: %s, %d", originStr, len(originStr))
*originBytesPtr = []byte("hzw")
fmt.Printf("after: %s, %d", originStr, len(originStr))

输出结果为

before: hello world, 11
after: hzw, 3

值得注意的是,不同于C语言,go语言中不同指针类型之间不可直接强转,有了unsafe.Pointer,使得操作底层指针(包括指针类型强转、指针加减运算)成为了可能