go的byte跟byte 转stringg有什么区别

go中string和slice no-copy转换 - 推酷
go中string和slice no-copy转换
在go里面,string和slice的互换是需要进行内存拷贝的,虽然在底层,它们都只是用 pointer + len来表示的一段内存。
通常,我们不会在意string和slice的转换带来的内存拷贝性能问题,但是总有些地方需要关注的,刚好在看vitess代码的时候,发现了一种很hack的做法,string和slice的转换只需要拷贝底层的指针,而不是内存拷贝。当然这样做的风险各位就要好好担当了:
func String(b []byte) (s string) {
pbytes := (*reflect.SliceHeader)(unsafe.Pointer(&b))
pstring := (*reflect.StringHeader)(unsafe.Pointer(&s))
pstring.Data = pbytes.Data
pstring.Len = pbytes.Len
func Slice(s string) (b []byte) {
pbytes := (*reflect.SliceHeader)(unsafe.Pointer(&b))
pstring := (*reflect.StringHeader)(unsafe.Pointer(&s))
pbytes.Data = pstring.Data
pbytes.Len = pstring.Len
pbytes.Cap = pstring.Len
在我的测试例子中,slice转string之后,如果slice的值有变化,string也会跟着改变,如下:
b := []byte(&hello world&)
a := String(b)
b[0] = 'a'
println(a)
aello world
但是string转slice之后,就不能更改slice了,如下:
a := &hello world&
b := Slice(a)
b[0] = 'a'
//这里就等着崩溃吧
//但是可以这样,因为go又重新给b分配了内存
b = append(b, &hello world&…)
上面为什么会崩溃我猜想可能是string是immutable的,可能对应的内存地址也是不允许改动的。
另外,上面这个崩溃在defer里面是recover不回来的,真的就崩溃了,原因可能就跟c的非法内存访问一样,os不跟你玩了。
已发表评论数()
已收藏到推刊!
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
排版有问题
没有分页内容
视频无法显示
图片无法显示将一个byte转换成 string 打印,为什么末尾会多字符_百度知道
将一个byte转换成 string 打印,为什么末尾会多字符
提问者采纳
为一个菜鸟,则打印内容是这样,看看package里的test文件: 一些linux命令行的memocategories?你就不知道先把buf[:4]))
&#47.EOF { break }fmt,看别人写的代码.Print(string(buf))
&#47:= fin:4]) 这样字符串没有结束符 &#92.Read(buf)if n &lt:4]打印出来看看么: true---会不会是 string(buf[.Print(string(buf[,你不知道一行末尾有一个换行么;(1)fmt?作为一个菜鸟,你就可以怀疑Go不擅长做为本处理了么,分析下自己写的每行代码,为什么这么写?转载;&#47,仅供参考。n;&#47:---
《《-- 这行是(1)打印的,就变成这样,= 0 || err == io? 或者和 UTF8 有关系?作为一个菜鸟:&#47: [binary]tcs如果(2) 也打,一行代码打印不符合你的要求(那还是你写错了)。---0 导致继续往后打了: posttitle?你就不知道buf[:4]有4个字节么,多找些资料看看;(2)如果不打印(2),后边没有那些奇怪的输出了
网络工程师
其他类似问题
为您推荐:
string的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁Go语言按字节截取字符串的方法
本文实例讲述了Go语言按字节截取字符串的方法。分享给大家供大家参考。具体实现方法如下:
代码如下:// 按字节截取字符串 utf-8不乱码
func SubstrByByte(str string, length int) string {
&&& bs := []byte(str)[:length]
&&& bl := 0
&&& for i:=len(bs)-1; i&=0; i-- {
&&&&&&& switch {
&&&&&&& case bs[i] &= 0 && bs[i] &= 127:
&&&&&&&&&&& return string(bs[:i+1])
&&&&&&& case bs[i] &= 128 && bs[i] &= 191:
&&&&&&&&&&& bl++;
&&&&&&& case bs[i] &= 192 && bs[i] &= 253:
&&&&&&&&&&& cl := 0
&&&&&&&&&&& switch {
&&&&&&&&&&& case bs[i] & 252 == 252:
&&&&&&&&&&&&&&& cl = 6
&&&&&&&&&&& case bs[i] & 248 == 248:
&&&&&&&&&&&&&&& cl = 5
&&&&&&&&&&& case bs[i] & 240 == 240:
&&&&&&&&&&&&&&& cl = 4
&&&&&&&&&&& case bs[i] & 224 == 224:
&&&&&&&&&&&&&&& cl = 3
&&&&&&&&&&& default:
&&&&&&&&&&&&&&& cl = 2
&&&&&&&&&&& }
&&&&&&&&&&& if bl+1 == cl {
&&&&&&&&&&&&&&& return string(bs[:i+cl])
&&&&&&&&&&& }
&&&&&&&&&&& return string(bs[:i])
&&& return ""
希望本文所述对大家的Go语言程序设计有所帮助。
如果您喜欢本文请分享给您的好友,谢谢!
评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)记录下JSON与byte[]转化的操作,先来试试不存到文件的,当然要试试保存文件的,这样就可以保存配置信息了,JSON只是一种方式,XML的操作方法很类似,至于其他的方式以后再研究。
package mainimport (&&&&"fmt"&&&&"encoding/json")func main() {&&&&m := Message{"测试", "测试序列化",false}&&&&b, _ := json.Marshal(m)//将json对象序列化为byte[]&&&&var ki Message&&&&json.Unmarshal(b,&ki)//将序列化的byte[]重写反序列化为对象。&&&&fmt.Println(b)//打印序列化的byte[]&&&&&&&&fmt.Println(ki)//打印对象的信息&&&&fmt.Println(ki.Name)//打印具体的信息}type Message struct {&&&&Name string&&&&Body string&&&&State bool}
上面的例子可以看出JSON与byte[]转化很简单,序列化后的是byte[],可以用于很多处理的.接下来将byte[]保存到文件.&不过保存的文件是json的内容.
package mainimport (&&&&"fmt"&&&&"encoding/json"&&&&"io/ioutil")func main() {&&&&m := Message{"测试", "测试序列化",false}&&&&b, _ := json.Marshal(m)&&&&ioutil.WriteFile("vt.dat", b, 0644)//保存数据到文件&&&&bi, _ := ioutil.ReadFile("vt.dat")//从文件取出数据&&&&var ki Message&&&&json.Unmarshal(bi,&ki)&&&&fmt.Println(ki.Name);//打印信息&&&&}type Message struct {&&&&Name string&&&&Body string&&&&State bool}
阅读(...) 评论()

我要回帖

更多关于 byte 转string 的文章

 

随机推荐