成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁 > 知識庫 > golang 的string與[]byte轉換方式

golang 的string與[]byte轉換方式

熱門標簽:電話機器人軟件免費 涿州代理外呼系統(tǒng) 阿克蘇地圖標注 評價高的400電話辦理 百度地圖標注后傳給手機 excel地圖標注分布數(shù)據(jù) 外呼系統(tǒng)用什么卡 壽光微信地圖標注 外呼系統(tǒng)顯本地手機號

相對于C語言,golang是類型安全的語言。但是安全的代價就是性能的妥協(xié)。

下面我們看看Golang不想讓我們看到的“秘密”——string的底層數(shù)據(jù)。

通過reflect包,我們可以知道,在Golang底層,string和slice其實都是struct:

type SliceHeader struct {
    Data uintptr
    Len  int
    Cap  int
}
type StringHeader struct {
    Data uintptr
    Len  int
}

其中Data是一個指針,指向實際的數(shù)據(jù)地址,Len表示數(shù)據(jù)長度。

但是,在string和[]byte轉換過程中,Golang究竟悄悄幫我們做了什么,來達到安全的目的?

在Golang語言規(guī)范里面,string數(shù)據(jù)是禁止修改的,試圖通過s[0], b[0]取得string和slice數(shù)據(jù)指針地址也是不能通過編譯的。

下面,我們就通過Golang的“黑科技”來一窺Golang背后的“秘密”

//return GoString's buffer slice(enable modify string)
func StringBytes(s string) Bytes {
    return *(*Bytes)(unsafe.Pointer(s))
}
// convert b to string without copy
func BytesString(b []byte) String {
    return *(*String)(unsafe.Pointer(b))
}
// returns s[0], which is not allowed in go
func StringPointer(s string) unsafe.Pointer {
    p := (*reflect.StringHeader)(unsafe.Pointer(s))
    return unsafe.Pointer(p.Data)
}
// returns b[0], which is not allowed in go
func BytesPointer(b []byte) unsafe.Pointer {
    p := (*reflect.SliceHeader)(unsafe.Pointer(b))
    return unsafe.Pointer(p.Data)
}

以上4個函數(shù)的神奇之處在于,通過unsafe.Pointer和reflect.XXXHeader取到了數(shù)據(jù)首地址,并實現(xiàn)了string和[]byte的直接轉換(這些操作在語言層面是禁止的)。

下面我們就通過這幾個“黑科技”來測試一下語言底層的秘密:

func TestPointer(t *testing.T) {
    s := []string{
        "",
        "",
        "hello",
        "hello",
        fmt.Sprintf(""),
        fmt.Sprintf(""),
        fmt.Sprintf("hello"),
        fmt.Sprintf("hello"),
    }
    fmt.Println("String to bytes:")
    for i, v := range s {
        b := unsafe.StringBytes(v)
        b2 := []byte(v)
        if b.Writeable() {
            b[0] = 'x'
        }
        fmt.Printf("%d\ts=%5s\tptr(v)=%-12v\tptr(StringBytes(v)=%-12v\tptr([]byte(v)=%-12v\n",
            i, v, unsafe.StringPointer(v), b.Pointer(), unsafe.BytesPointer(b2))
    }
    b := [][]byte{
        []byte{},
        []byte{'h', 'e', 'l', 'l', 'o'},
    }
    fmt.Println("Bytes to string:")
    for i, v := range b {
        s1 := unsafe.BytesString(v)
        s2 := string(v)
        fmt.Printf("%d\ts=%5s\tptr(v)=%-12v\tptr(StringBytes(v)=%-12v\tptr(string(v)=%-12v\n",
            i, s1, unsafe.BytesPointer(v), s1.Pointer(), unsafe.StringPointer(s2))
    }
}
const N = 3000000
func Benchmark_Normal(b *testing.B) {
    for i := 1; i  N; i++ {
        s := fmt.Sprintf("12345678901234567890123456789012345678901234567890")
        bb := []byte(s)
        bb[0] = 'x'
        s = string(bb)
        s = s
    }
}
func Benchmark_Direct(b *testing.B) {
    for i := 1; i  N; i++ {
        s := fmt.Sprintf("12345678901234567890123456789012345678901234567890")
        bb := unsafe.StringBytes(s)
        bb[0] = 'x'
        s = s
    }
}
//test result
//String to bytes:
//0 s=      ptr(v)=0x51bd70     ptr(StringBytes(v)=0x51bd70     ptr([]byte(v)=0xc042021c58
//1 s=      ptr(v)=0x51bd70     ptr(StringBytes(v)=0x51bd70     ptr([]byte(v)=0xc042021c58
//2 s=hello ptr(v)=0x51c2fa     ptr(StringBytes(v)=0x51c2fa     ptr([]byte(v)=0xc042021c58
//3 s=hello ptr(v)=0x51c2fa     ptr(StringBytes(v)=0x51c2fa     ptr([]byte(v)=0xc042021c58
//4 s=      ptr(v)=nil>        ptr(StringBytes(v)=nil>        ptr([]byte(v)=0xc042021c58
//5 s=      ptr(v)=nil>        ptr(StringBytes(v)=nil>        ptr([]byte(v)=0xc042021c58
//6 s=xello ptr(v)=0xc0420444b5 ptr(StringBytes(v)=0xc0420444b5 ptr([]byte(v)=0xc042021c58
//7 s=xello ptr(v)=0xc0420444ba ptr(StringBytes(v)=0xc0420444ba ptr([]byte(v)=0xc042021c58
//Bytes to string:
//0 s=      ptr(v)=0x5c38b8     ptr(StringBytes(v)=0x5c38b8     ptr(string(v)=nil>
//1 s=hello ptr(v)=0xc0420445e0 ptr(StringBytes(v)=0xc0420445e0 ptr(string(v)=0xc042021c38
//Benchmark_Normal-4    1000000000           0.87 ns/op
//Benchmark_Direct-4    2000000000           0.24 ns/op

結論如下:

1、string常量會在編譯期分配到只讀段,對應數(shù)據(jù)地址不可寫入,并且相同的string常量不會重復存儲。

2、fmt.Sprintf生成的字符串分配在堆上,對應數(shù)據(jù)地址可修改。

3、常量空字符串有數(shù)據(jù)地址,動態(tài)生成的字符串沒有設置數(shù)據(jù)地址

4、Golang string和[]byte轉換,會將數(shù)據(jù)復制到堆上,返回數(shù)據(jù)指向復制的數(shù)據(jù)

5、動態(tài)生成的字符串,即使內容一樣,數(shù)據(jù)也是在不同的空間

6、只有動態(tài)生成的string,數(shù)據(jù)可以被黑科技修改

7、string和[]byte通過復制轉換,性能損失接近4倍

補充:Golang 使用unsafe.Pointer優(yōu)化byte[]與String轉換性能

我們知道一般來說對于一個String

如果想要轉換為byte[]都是通過類型轉換語法來實現(xiàn)的:

Res := string(bytes)

這種方式是Go所推薦的,優(yōu)點就是安全,盡管這種操作會發(fā)生內存拷貝,導致性能上會有所損耗,這在處理一般業(yè)務時這種損耗是可以忽略的。

但如果是拷貝頻繁的情況下,想要進行性能優(yōu)化時,就需要引入unsafe.Pointer了:

func main()  {
 var s = []byte("我永遠喜歡藤原千花.jpg")
 Res := *(*string)(unsafe.Pointer(s))
 fmt.Println(Res)
}

通過unsafe.Pointer偽造String的過程沒有發(fā)生內存拷貝,所以效率上會比發(fā)生內存拷貝的類型轉換快,但代價就是把底層數(shù)據(jù)暴露出來,這種做法是不安全的。

至于為什么Slice能通過這種方式和String轉換

我們可以看下它們的底層結構SliceHeader和StringHeader :

type SliceHeader struct {
 Data uintptr
 Len  int
 Cap  int
  } 
type StringHeader struct {
 Data uintptr
 Len  int
  }

兩種類型只差了一個字段Cap(容量),前面剩余的字段都是內存對齊的,所以可以直接轉換

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

您可能感興趣的文章:
  • Go中string與[]byte高效互轉的方法實例

標簽:欽州 重慶 汕頭 蘭州 梅河口 雞西 銅川 吐魯番

巨人網(wǎng)絡通訊聲明:本文標題《golang 的string與[]byte轉換方式》,本文關鍵詞  golang,的,string,與,byte,轉換,;如發(fā)現(xiàn)本文內容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內容系統(tǒng)采集于網(wǎng)絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《golang 的string與[]byte轉換方式》相關的同類信息!
  • 本頁收集關于golang 的string與[]byte轉換方式的相關信息資訊供網(wǎng)民參考!
  • 推薦文章
    男人的天堂成人| 九九亚洲视频| 国产ts人妖一区二区三区| av网站有哪些| 91情侣在线视频| 日本欧美在线看| 色一情一乱一伦一区二区三欧美| 99久久99久久精品免费看小说.| 香蕉视频在线观看免费| 国产精品视频内| 涩涩视频免费观看| 亚洲国产成人精品一区二区三区| 日韩成人一区二区| 国产真人做爰毛片视频直播| 久久久久久久久久久久网站| 欧美一级淫片免费视频魅影视频| 久久午夜激情| 国产福利电影在线观看| 欧美另类交视频| eeuss影院第1页在线| 不卡的av网站| 激情高潮到大叫狂喷水| 欧美日本在线视频中文字字幕| 天堂网在线免费观看| 色多多在线观看| 91亚洲大成网污www| 色狠狠一区二区三区香蕉| 精品少妇一区二区三区日产乱码| 日韩欧美小视频| 911av视频| 香蕉视频网站在线观看| 中文字幕欧美日韩va免费视频| 精品久久久精品| 午夜国产不卡在线观看视频| 成人性生活视频免费看| 污污内射在线观看一区二区少妇| 亚洲欧美日韩中文视频| 日本成人黄色片| 粉嫩av国产一区二区三区| 婷婷成人综合| 高清久久精品| 国产一区二区视频网站| caoporn-草棚在线视频最| 午夜在线播放视频欧美| 中文字幕人妻互换av久久| 免费观看h片| 欧美一级在线亚洲天堂| 5g成人永久免费影院| 男人操女人的视频在线观看欧美| 欧美色中文字幕| 欧美尤物巨大精品爽| 日本三日本三级少妇三级66| 97人妻精品一区二区三区免| 免费观看久久久4p| 精品国产aⅴ一区二区三区东京热| 日韩视频免费直播| 久草精品视频| 性金发美女69hd大尺寸| 久久gogo国模啪啪裸体| 99久久视频| 激情文学亚洲色图| 日韩国产成人| 久久精品视频在线播放| 在线午夜精品自拍| 国产精品成人一区二区艾草| 中文字幕一区二区三区乱码不卡| 精品夜夜嗨av一区二区三区| www.色小姐com| 美脚丝袜一区二区三区在线观看| 一本色道久久88亚洲综合88| 欧美日韩国产一区二区三区不卡| 亚洲色图综合| 日韩在线一区二区| 亚洲美女自拍偷拍| 男人天堂视频在线| 顶级嫩模精品视频在线看| 欧美韩日一区二区| 日本欧美亚洲| 踪合国产第二页| 色94色欧美sute亚洲线路一ni| 久久久久噜噜噜亚洲熟女综合| 韩国成人精品a∨在线观看| 日韩精品一区二区在线视频| 国产欧美日韩丝袜精品一区| 国产精品久久久久久无人区| 国产日韩一区二区在线| 999精品视频在线| 国产欧美日韩综合一区在线观看| 伊人影院综合在线| 99久久久国产精品| 久久7799| 精品一区在线观看视频| 亚洲午夜精品久久久久久性色| 91夜夜揉人人捏人人添红杏| 亚洲第一论坛sis| 伦理中文字幕亚洲| 亚洲天堂手机在线| 在线视频亚洲自拍| 97视频在线观看成人| 欧美a∨亚洲欧美亚洲| 久久精品国产99久久6| 亚洲一区二区精品| 日韩av在线影院| 久久久噜久噜久久综合| 精品免费在线视频| www.亚洲自拍| 91在线精品一区二区三区| 亚洲精品视频在线观看免费视频| 国产三级做爰高清在线| 中文字幕第21页| 在线观看免费中文字幕| 中国男女全黄大片| 一区二区三区国| 免费成年人高清视频| 久久久久久久久久91| 久久av网址| 亚洲高清免费在线观看| 午夜亚洲影视| 久久久久久蜜桃| 亚洲av无码一区二区三区网址| 国产一级精品在线| 欧洲金发美女大战黑人| 999国产精品| 神马久久久久久久久久久| 99久久99久久精品免费看小说.| 日韩在线你懂得| 人妻一区二区三区四区| 欧美色第一页| 亚洲天堂av在线播放| 在线丨暗呦小u女国产精品| 欧美黄色免费网址| 在线观看国产精品入口男同| 亚洲av综合一区二区| 成人性生交大片免费看小说| 国精品无码人妻一区二区三区| 天天摸天天干天天操| 久久精品高清| 校园激情久久| 99久久婷婷国产综合| 两根大肉大捧一进一出好爽视频| 亚洲高清资源在线观看| 欧美猛男男办公室激情| 欧美日本亚洲韩国国产| 在线三级电影| 男男一级淫片免费播放| 一区福利视频| 国产精品扒开腿做爽爽爽的视频| 国产在线2020| 国产精品午夜久久| 99久久久国产精品免费蜜臀| av一本久道久久波多野结衣| 久久人人爽人人爽人人片亚洲| 国产精品不卡一区二区三区| 97在线视频一区| 国产精品成久久久久三级| 欧美日韩国产在线播放| 555www成人网| 日韩精品一区二区三区蜜臀| 久草在线资源网| 久久久久久com| 青青青视频在线播放| 日本福利视频网站| 人妻无码一区二区三区四区| 亚洲精品国产视频| 在线精品一区二区三区| www.四虎.com| 日韩视频1区| 精品视频二区| 影音先锋中文字幕在线| 国产又粗又猛又爽又黄| 青青草精品视频在线| 久久一日本道色综合| 国产日产欧产精品推荐色| 久久国产手机看片| 精品视频第一区| 好看的日韩av电影| 色哟哟入口国产精品| 加勒比一区二区| 国产精品大片wwwwww| 亚洲av无一区二区三区久久| 亚洲影视资源| 奇门遁甲1982国语版免费观看高清| 亚洲最大成人综合| 欧美丝袜一区二区| 国产乱叫456在线| 免费视频最近日韩| 欧美日韩激情在线一区二区三区| 2022成人影院| 久久超级碰碰| 欧美日韩国产一区精品一区| 久久福利毛片| 26uuu精品一区二区| 国产精品精品视频一区二区三区| av日韩中文字幕| 欧美亚洲日本一区二区三区| 老司机午夜在线| 色婷婷久久久久swag精品| 97国产精品videossex| 国产亚洲精品久久久久久移动网络| 欧美一级黄色片| 国产精品久久久久久亚洲影视| 91一区二区三区四区| 国产精品欧美日韩| 日本视频在线观看| 亚洲成人av中文字幕| 91色视频在线观看| 亚洲小说图片| 中国免费黄视频| 亚洲国产网站| 成人免费视频免费观看| 欧美色图在线播放| 中文字幕精品视频在线观看| 亚洲国产精品一区二区久久hs| 中文字幕在线2021| 九九99九九精彩| 久久99久久久| a级片在线观看| 久久综合九色综合欧美狠狠| 久久亚洲精品爱爱| 老湿机69福利| 日韩免费啪啪| 搡老岳熟女国产熟妇| 免费一级在线观看播放网址| 波多野结衣喷潮| 手机看片日韩国产| 久久久久久欧美精品色一二三四| 欧美一区二区三区喷汁尤物| 成人亚洲精品777777ww| 色偷偷亚洲女人天堂观看欧| 波多野结衣av在线观看| 99久久九九| 久久精品国产亚洲777| 精品自在线视频| 日韩电影一二三区| 性开放的欧美大片| 大胆亚洲人体视频| 国产精品影片在线观看| 亚洲国产视频网站| 久久久噜噜噜久久狠狠50岁| 久久久国产影院| 狠狠操视频网站| 4438国产精品一区二区| 成年无码av片在线| 亚洲视频中文| a天堂资源在线| 久久精品国产v日韩v亚洲| 欧美乱大交做爰xxxⅹ性3| 深夜福利亚洲| 欧美成人欧美edvon| 欧美性视频精品| 亚洲码国产岛国毛片在线| 日本在线播放一区二区| 无码国精品一区二区免费蜜桃| 日韩精品你懂的| 国产日产精品一区二区三区四区的观看方式| 欧美色综合网站| 天天操精品视频| dj大片免费在线观看| 亚洲人成电影在在线观看网色| 99国产精品久久久久老师| 国产精品一国产精品k频道56| 毛片毛片毛片毛片毛片毛片毛片毛片毛片| 日韩激情一区| 成人亚洲性情网站www在线观看| 亚洲视频免费观看| xfplay资源站夜色先锋5566| 中文字幕伦av一区二区邻居| 99这里只有精品| 亚洲欧美日韩一区在线| 69**夜色精品国产69乱| 青娱乐精品在线视频| 国产精品毛片一区二区在线看舒淇| 日韩欧美自拍偷拍| 国产老妇伦国产熟女老妇视频| 欧美五码在线| 国内自拍在线观看| 成人做爰69片免费看网站| 欧美成人免费一级人片100| 亚洲网站在线免费观看| 91在线视频在线观看| 男人天堂一区二区| 91精品91久久久中77777老牛| 亚洲欧洲三级| 久久aⅴ国产欧美74aaa| 久久精品99北条麻妃| 成人综合在线视频| 三上悠亚 电影| 亚洲最大的av网站| 亚洲女爱视频在线| 视频区 图片区 小说区| 久久av导航| 亚洲成人免费看| 超碰在线观看av| 亚洲免费观看高清| 久久99亚洲热视| 99精品视频国产| 午夜精品视频一区| 在线毛片观看| 日韩欧美高清dvd碟片| 成人福利视频在| 97久久超碰福利国产精品…| 深夜福利影院在线观看| 日本一区二区三区在线免费观看| 在线视频观看你懂的| 男人天堂视频网| 中文字幕欧美区| 免费精品国产自产拍观看| 成人午夜免费电影| 男插女视频网站| 超碰国产精品久久国产精品99| 成人网页在线免费观看| 一区二区乱码| free性中国hd国语露脸| 一区二区三区免费在线观看视频| 日韩一级欧洲| 中文字幕求饶的少妇| 牛夜精品久久久久久久| 超碰精品在线观看| 日韩成人在线观看视频| juliaann成人作品在线看| 国产超级av在线| 日本韩国在线视频| 精品视频一区二区三区四区五区| 亚洲日本va中文字幕| 久久国产精品色av免费看| 日日噜噜夜夜狠狠视频欧美人| 免费观看的黄色网址| 网站一区二区|