更多评论
#### 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