付费用户「每日一学」2019-08-01:如何正确的使用 unsafe.Pointer 和 uintptr

polaris · · 51571 次点击
#### 1. 有一个自定义类型 `type MyString string`,如何将 `[]MyString` 和 `[]string` 相互转换,并且共用底层元素? ``` go func MyStringSlice2StringSlice(ms []MyString) []string { return *(*[]string)(unsafe.Pointer(&ms)) } func StringSlice2MyStringSlice(ss []string) []MyString { return *(*[]MyString)(unsafe.Pointer(&ss)) } ``` ### 2. 如何实现 string 和 []byte 的转换,不会复制底层字节系列? ``` go func ByteSlice2String(bs []byte) string { return *(*string)(unsafe.Pointer(&bs)) } func String2ByteSlice(s string) []byte { return *(*[]byte)(unsafe.Pointer(&s)) } ``` #### `注:` 第2个有个问题,如下代码所示 ``` go str := strings.Join([]string{"Go", "land"}, "") fmt.Printf("Before Convert: %T--%q\n", str, str) bs := unsafe_pointer.String2ByteSlice(str) fmt.Printf("After Convert: %T--%q\n", bs, bs) ``` 当第一行(str那一行)中改为 str := "goland" 这种字符串字面值常量时,改变数组 bs[2] = 'k' 类似于这种操作会导致 panic, 然而上面的代码运行却没有任何错误。请问博主,这种原因是什么?字符串常量在底层不是字符串数组么?
#1
更多评论
polaris
社区,需要你我一同完善!
<a href="/user/fredrick" title="@fredrick">@fredrick</a> 字符串是不可变类型,不能修改
#2
明白了,`strings.Join`实际上底层是字节切片。谢谢!
#3