精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

[]byte與string的兩種轉換方式和底層實現

開發 前端
Go語言提供給我們使用的還是標準轉換方式,主要是因為在你不確定安全隱患的情況下,使用強轉化方式可能不必要的問題。

不過你發現沒fasthttp關于string和[]byte的轉換方式和大家平常普遍使用的方式不一樣,fasthttp轉換實現如下:

//[]byte轉string
func b2s(b []byte) string {
    return *(*string)(unsafe.Pointer(&b))
}
 
//string轉[]byte
func s2b(s string) (b []byte) {
    bh := (*reflect.SliceHeader)(unsafe.Pointer(&b))
    sh := (*reflect.StringHeader)(unsafe.Pointer(&s))
    bh.Data = sh.Data
    bh.Cap = sh.Len
    bh.Len = sh.Len
    return b
}

為什么不用我們常見的string和[]byte的轉換方式呢?這樣做是怎么提高性能的呢?...

帶著這些疑問,今天將分享下并總結string和[]byte的轉換方式,不同的轉換方式之間的實現和區別!


圖片圖片

兩種轉換方式

如果此時此刻你剛好遇到面試官問你string和[]byte如何進行轉換,有幾種方式?你能答上來嗎

反正在寫這篇文章之前小許估計是答不出來的,哈哈!

畢竟知道的越多,不知道的也越多嘛

那今天我們就來聊聊,繼續往下讀之前,我們先了解下這兩種數據類型:

string和[]byte

圖片圖片

??上圖中可以看出 stringStruct和slice還是有一些相似之處,str和array指針指向底層數組的地址,len代表的就是數組長度。

關于string類型,在go標準庫中官方說明如下:

// string is the set of all strings of 8-bit bytes, conventionally but not
// necessarily representing UTF-8-encoded text. A string may be empty, but
// not nil. Values of string type are immutable.

type string string

string是8位字節的集合,string的定義在上圖中左側,通常但不一定代表UTF-8編碼的文本。string可以為空,但是不能為nil,并且string的值是不能改變的。

??為什么string類型沒有cap字段

string的不可變性,也就不能直接向底層數組追加元素,所以不需要Cap。

而[]byte就是一個byte類型的切片,切片本質也是一個結構體。

?? 這里我們先記住下這兩種數據類型的特點,對后面的了解兩者的轉換有幫助!

標準方式

Golang中string與[]byte的互換,這是我們常用的,也是立馬能想到的轉換方式,這種方式稱為標準方式。

// string 轉 []byte
s1 := "xiaoxu"
b := []byte(s1)

// []byte 轉 string
s2 := string(b)

那還有其他方式嗎?當然有的,那就是強轉換

強轉換方式

強轉換方式是通過unsafe和reflect包來實現的,代碼如下:

//[]byte轉string
func b2s(b []byte) string {
    return *(*string)(unsafe.Pointer(&b))
}
 
//string轉[]byte
func s2b(s string) (b []byte) {
    bh := (*reflect.SliceHeader)(unsafe.Pointer(&b))
    sh := (*reflect.StringHeader)(unsafe.Pointer(&s))
    bh.Data = sh.Data
    bh.Cap = sh.Len
    bh.Len = sh.Len
    return b
}

可以看出利用reflect.SliceHeader(代表一個運行時的切片) 和 unsafe.Pointer進行指針替換。

??為什么可以這么做呢?

前面我們在講string和[]byte類型的時候就提了,因為兩者的底層結構的字段相似!

array和str的len是一致的,而唯一不同的就是cap字段,所以他們的內存布局上是對齊的。

分析

我們看下這兩種轉換方式底層是如何實現的,這些實現代碼在標準庫中都是有的,下面底層實現的代碼來自Go 1.18.6版本。

標準方式底層實現

string轉[]byte底層實現

先看string轉[]byte的實現,(實現源碼在 src/runtime/string.go 中)

const tmpStringBufSize = 32

//長度32的數組
type tmpBuf [tmpStringBufSize]byte

//時間函數
func stringtoslicebyte(buf *tmpBuf, s string) []byte {
    var b []byte
    //判斷字符串長度是否小于等于32
    if buf != nil && len(s) <= len(buf) {
        *buf = tmpBuf{}
        b = buf[:len(s)]
    } else {
        //預定義數組長度不夠,重新分配內存
        b = rawbyteslice(len(s))
    }
    copy(b, s)
    return b
}

// rawbyteslice allocates a new byte slice. The byte slice is not zeroed.
//rawbyteslice函數 分配一個新的字節片。字節片未歸零
func rawbyteslice(size int) (b []byte) {
    cap := roundupsize(uintptr(size))
    p := mallocgc(cap, nil, false)
    if cap != uintptr(size) {
        memclrNoHeapPointers(add(p, uintptr(size)), cap-uintptr(size))
    }

    *(*slice)(unsafe.Pointer(&b)) = slice{p, size, int(cap)}
    return
}

圖片圖片

上面代碼可以看出string轉[]byte是,會根據字符串長度來決定是否需要重新分配一塊內存。

  • ? 預先定義了一個長度為32的數組
  • ? 若字符串的長度不超過這個長度32的數組,copy函數實現string到[]byte的拷貝
  • ? 若字符串的長度超過了這個長度32的數組,重新分配一塊內存了,再進行copy

[]byte轉string底層實現

再看[]byte轉string的實現,(實現源碼在 src/runtime/string.go 中)

const tmpStringBufSize = 32

//長度32的數組
type tmpBuf [tmpStringBufSize]byte

//實現函數
func slicebytetostring(buf *tmpBuf, ptr *byte, n int) (str string) {
    ...
    if n == 1 {
        p := unsafe.Pointer(&staticuint64s[*ptr])
        if goarch.BigEndian {
            p = add(p, 7)
        }
        stringStructOf(&str).str = p
        stringStructOf(&str).len = 1
        return
    }

    var p unsafe.Pointer
    //判斷字符串長度是否小于等于32
    if buf != nil && n <= len(buf) {
        p = unsafe.Pointer(buf)
    } else {
        p = mallocgc(uintptr(n), nil, false)
    }
    stringStructOf(&str).str = p
    stringStructOf(&str).len = n
    //拷貝byte數組至字符串
    memmove(p, unsafe.Pointer(ptr), uintptr(n))
    return
}

跟string轉[]byte一樣,當數組長度超過32時,同樣需要調用mallocgc分配一塊新內存

強轉換底層實現

從標準的轉換方式中,我們知道如果字符串長度超過32的話,會重新分配一塊新內存,進行內存拷貝。

//string轉[]byte
func s2b(s string) (b []byte) {
    bh := (*reflect.SliceHeader)(unsafe.Pointer(&b))
    sh := (*reflect.StringHeader)(unsafe.Pointer(&s))
    bh.Data = sh.Data
    bh.Cap = sh.Len
    bh.Len = sh.Len
    return b
}

強轉換過程中,通過 神奇的unsafe.Pointer指針

? 任何類型的指針 *T 都可以轉換為unsafe.Pointer類型的指針,可以存儲任何變量的地址

? unsafe.Pointer 類型的指針也可以轉換回普通指針,并且可以和類型*T不相同

?? refletc包的 reflect.SliceHeader 和 reflect.StringHeader分別代表什么意思?

reflect.SliceHeader:slice類型的運行時表示形式

reflect.StringHeader:string類型的運行時表示形式

//slice在運行時的描述符
type SliceHeader struct {      
     Data uintptr
     Len  int
    Cap  int
}

//string在運行時的描述符
type StringHeader struct {
    Data uintptr
    Len  int
}

*(reflect.SliceHeader)(unsafe.Pointer(&b)) 的目的就是通過unsafe.Pointer 把它們轉換為 *reflect.SliceHeader 指針。

而運行時表現形式 SliceHeader 和 StringHeader,而這兩個結構體都有一個 Data 字段,用于存放指向真實內容的指針。

??[]byte 和 string之間的轉換,就可以理解為是通過 unsafe.Pointer 把 *SliceHeader 轉為 *StringHeader,也就是 *[]byte 和 *string之間的轉換。

那么我們就可以理解相對于標準轉換方式,強轉換方式的優點在哪了!

直接替換指針的指向,避免了申請新內存(零拷貝),因為兩者指向的底層字段Data地址相同

總結

今天小許和大家一起了解了[]byte和string類型,以及[]byte和string的兩種轉換方式。

不過Go語言提供給我們使用的還是標準轉換方式,主要是因為在你不確定安全隱患的情況下,使用強轉化方式可能不必要的問題。

不過像fasthttp那樣,對程序對運行性能有高要求,那就可以考慮使用強轉換方式!

責任編輯:武曉燕 來源: 小許code
相關推薦

2010-07-14 10:30:26

Perl多線程

2021-12-08 10:47:35

RabbitMQ 實現延遲

2009-06-23 18:18:13

SpringHibernate

2009-06-15 15:02:48

Spring定時器

2011-03-03 10:26:04

Pureftpd

2022-06-08 15:12:34

前端前端截圖

2020-02-21 17:33:17

SparkKafka數據

2021-05-27 10:57:01

TCP定時器網絡協議

2023-05-31 19:10:31

2020-05-11 13:03:03

SR-TEIP路由器

2010-07-13 14:54:15

Perl面向對象編程

2009-06-25 13:43:00

Buffalo AJA

2010-10-21 16:24:18

sql server升

2023-03-29 13:06:36

2010-08-06 09:38:11

Flex讀取XML

2012-12-24 13:30:34

iOS

2010-09-28 15:12:27

Javascript

2015-10-09 09:51:29

Web API認證

2010-09-07 11:09:59

2021-06-30 07:19:34

SpringBoot定時任務
點贊
收藏

51CTO技術棧公眾號

国产精品丝袜视频| 日韩av一卡二卡| 亚洲精品一区二区三| 91精品国产乱码久久久久| 欧美+亚洲+精品+三区| 日韩视频免费直播| 青青视频在线播放| 日本高清中文字幕在线| 国产99久久久国产精品潘金| 欧美亚洲另类制服自拍| av在线免费播放网址| 粉嫩久久久久久久极品| 一本色道久久综合亚洲91| 伊人久久av导航| 香蕉视频国产在线| 久久99精品久久久久久国产越南| 亚洲欧美日韩爽爽影院| 成年人三级黄色片| 在线看的毛片| 一区二区三区.www| 亚洲免费精品视频| 天堂中文网在线| 狠狠狠色丁香婷婷综合激情| 欧美中文在线视频| 久久人人爽人人爽人人| 日韩欧美二区| 日韩高清av在线| 久久aaaa片一区二区| 快播电影网址老女人久久| 亚洲一区二区四区蜜桃| 在线视频一区观看| 黄色网址在线播放| 成人国产精品免费网站| 亚洲精品日韩激情在线电影| 91玉足脚交嫩脚丫在线播放| 国产一区观看| 色阁综合伊人av| 成熟妇人a片免费看网站| 国产95亚洲| 欧美色图12p| 成人在线观看a| 黄色漫画在线免费看| 亚洲精品欧美激情| 国产精品美女在线播放| 在线视频91p| 国产日韩精品久久久| 久久精品久久精品国产大片| 成人无码一区二区三区| 国产精品原创巨作av| 91精品美女在线| 伊人成人在线观看| 卡一卡二国产精品 | 国产日韩精品入口| 久久精品视频2| 老鸭窝91久久精品色噜噜导演| 欧美国产日韩在线| 久久免费公开视频| 激情久久久久| 久久久久久一区二区三区| 538精品在线视频| 88国产精品视频一区二区三区| 国产一区二区三区在线视频| 国产三级av在线播放| 久操精品在线| 一区二区三区亚洲| 5566中文字幕| 综合国产在线| 久久久免费电影| 午夜精品三级久久久有码| 99热精品在线| 国产成人精品999| 一区二区小视频| 国产精品原创巨作av| 国产成人精品免费视频大全最热 | 日韩欧美一级精品久久| 一个人看的视频www| 中文字幕区一区二区三| 亚洲黄色www网站| 亚洲av无码一区二区三区人| 日韩久久综合| www.久久久久| 精品亚洲永久免费| 久久激情中文| 91中文字幕在线观看| 亚洲国产精品国自产拍久久| 99久久婷婷国产综合精品电影| 精品国产91亚洲一区二区三区www| 天天操天天干天天爽| 国产午夜精品在线观看| 天天爱天天做天天操| 狂野欧美性猛交xxxxx视频| 红桃视频成人在线观看| 在线免费观看av的网站| 日韩精品成人在线观看| 日韩精品欧美国产精品忘忧草 | 2019日韩中文字幕mv| 在线天堂资源| 9191精品国产综合久久久久久| 亚洲娇小娇小娇小| 9l视频自拍蝌蚪9l视频成人| 亚洲美女自拍视频| 黄色一级大片在线免费观看| 亚洲精品免费观看| 国产精品吴梦梦| 国产综合视频在线| 中文久久乱码一区二区| 国产免费一区二区视频| 成人在线高清| 日韩精品免费在线视频观看| 亚洲二区在线播放| 久久久亚洲人| 国产精品日韩高清| 三区四区电影在线观看| 婷婷六月综合亚洲| 91视频福利网| 欧美日韩黑人| 97激碰免费视频| 国产日本精品视频| 国产欧美一二三区| 99精品人妻少妇一区二区| 精品国产三级| 色伦专区97中文字幕| 超碰超碰超碰超碰| 成人国产免费视频| 国产女主播av| 国产精品xxx| 亚洲精品中文字幕av| 免费中文字幕视频| 狠狠色丁香久久婷婷综合丁香| 久久精品日韩精品| 欧美24videosex性欧美| 欧美精品久久久久久久多人混战 | 日韩精品一区二区在线视频 | 日本精品黄色| 欧洲永久精品大片ww免费漫画| 国产一区二区三区视频免费观看| 99r精品视频| 真人抽搐一进一出视频| 日韩三级网址| 欧美刺激性大交免费视频| 在线观看xxxx| 中文字幕乱码久久午夜不卡| 久久久精品在线视频| 香蕉久久精品日日躁夜夜躁| 97久久久久久| 熟妇人妻系列aⅴ无码专区友真希 熟妇人妻av无码一区二区三区 | 中文字幕丰满人伦在线| 国内久久婷婷综合| 品久久久久久久久久96高清| sm捆绑调教国产免费网站在线观看 | 日本91av在线播放| 亚洲精品国产精品乱码不卡| 亚洲特级片在线| 五月激情五月婷婷| 国产高清一区二区| 成人福利网站在线观看11| 色多多视频在线观看| 欧美撒尿777hd撒尿| 国产一二三四视频| 久久国产乱子精品免费女| 亚洲国产高清国产精品| 精品女同一区二区三区在线观看| 亚洲欧美日韩成人| 五月婷婷六月婷婷| 欧美国产精品中文字幕| 在线观看的毛片| 色琪琪久久se色| 成人激情在线观看| 色呦呦视频在线观看| 欧美成人官网二区| 1级黄色大片儿| 久久久久久日产精品| www日韩在线观看| 日韩av大片| 亚洲自拍另类欧美丝袜| 国产蜜臀在线| 亚洲欧洲自拍偷拍| 亚洲天堂视频在线| 一区二区三区久久| 中文字幕一区二区久久人妻网站| 99精品国产在热久久| 欧美午夜视频在线| 国产精品麻豆| 97热精品视频官网| 成人在线视频成人| 欧美一区二区视频观看视频 | 日韩一卡二卡在线| 日本道在线观看一区二区| 任我爽在线视频| 成人污视频在线观看| 免费男同深夜夜行网站 | 永久免费毛片在线播放不卡| 中文字幕在线视频免费| 亚洲激情图片一区| a毛片毛片av永久免费| 老司机免费视频一区二区| 国产精品视频一二三四区| 五月天亚洲一区| 国产主播欧美精品| 欧美调教sm| 久久中文字幕在线视频| 日韩有码电影| 日韩一区二区在线播放| 欧美一区二区三区网站| 亚洲欧美福利一区二区| 国产精品亚洲无码| 高清不卡在线观看| 国产精品久久久毛片| 亚洲大片av| 宅男av一区二区三区| 日本成人a网站| 亚洲aⅴ男人的天堂在线观看| 污的网站在线观看| 伊人激情综合网| 蜜桃视频久久一区免费观看入口| 日韩欧美在线一区| 精品小视频在线观看| 国产精品久久久久久久蜜臀| 亚洲欧美日韩色| 国产一区在线不卡| mm1313亚洲国产精品无码试看| 欧美精品三级| 一区二区在线观看网站| 欧美丝袜激情| 秋霞在线观看一区二区三区| 成人午夜三级| 亚洲free嫩bbb| 日韩久久99| 国产精品极品在线| 性国裸体高清亚洲| 性欧美xxxx视频在线观看| 影音先锋在线视频| 久久精品国产亚洲7777| 北岛玲日韩精品一区二区三区| 亚洲精品一区二区三区四区高清 | 青草青在线视频| 日韩一级裸体免费视频| 国产三级在线免费观看| 亚洲欧美精品中文字幕在线| 隣の若妻さん波多野结衣| 日韩午夜av电影| 国产丝袜视频在线观看| 欧美精品日韩一本| 一区二区三区精彩视频| 欧美视频三区在线播放| 无码人妻一区二区三区免费| 黑人精品xxx一区一二区| 国产一区二区三区影院| 亚洲va天堂va国产va久| 国产第一页在线播放| 亚洲高清视频的网址| 国产一级特黄视频| 亚洲成av人综合在线观看| 久久久美女视频| 亚洲一区二区3| 国产黄色片视频| 婷婷激情综合网| 国产午夜性春猛交ⅹxxx| 懂色aⅴ精品一区二区三区蜜月| 日韩黄色a级片| 欧美日韩国产综合新一区 | 91精品办公室少妇高潮对白| 一级黄色在线视频| 欧美性一级生活| 国产精品熟女久久久久久| 欧美一区二区免费观在线| www.蜜臀av| 亚洲韩国日本中文字幕| 国产一级网站视频在线| 色偷偷偷亚洲综合网另类| 99热国产在线| 韩国美女主播一区| 怡红院成人在线| 成人黄色av网| 国产精品毛片视频| 欧美综合激情| 91精品久久久久久久蜜月| 成人免费网站入口| 性欧美长视频| 九九热精品国产| 成人午夜在线免费| 91成人在线免费视频| 亚洲欧美日韩一区| 国产美女激情视频| 欧美日高清视频| 国产自产一区二区| 在线国产精品视频| 日韩三级免费| 日韩免费在线视频| 精品国产亚洲一区二区三区| 精品欧美日韩| 国产精品88久久久久久| 国产特级淫片高清视频| 蜜桃在线一区二区三区| 人妻 丝袜美腿 中文字幕| 久久午夜电影网| 久久久久久久久久久久久女过产乱| 亚洲国产一区视频| 中文亚洲av片在线观看| 精品国产免费人成电影在线观看四季 | 免费欧美一级片| 久久免费偷拍视频| 在线免费日韩av| 天天做天天摸天天爽国产一区| 波多野结衣视频观看| 欧美成人一区二区三区| 高清中文字幕一区二区三区| 欧美激情在线一区| 亚洲免费看片| 欧美12av| 合欧美一区二区三区| 亚欧美在线观看| 91丨porny丨蝌蚪视频| 日韩女优一区二区| 欧美亚洲国产一区在线观看网站| 国产高清在线观看视频| 国产一区二区三区18| 电影k8一区二区三区久久| 成人亚洲欧美一区二区三区| 国产麻豆精品久久| 免费观看国产精品视频| 国产精品1区2区| 欧美88888| 在线日韩国产精品| 午夜福利理论片在线观看| 久久99热这里只有精品国产| 精品美女一区| 亚洲二区三区四区| 美女黄网久久| 呦呦视频在线观看| 亚洲地区一二三色| 亚洲av无码乱码国产精品久久| 一区三区二区视频| 成人影院网站| 久久涩涩网站| 国产日本精品| 免费a v网站| 亚洲电影第三页| 天堂网在线中文| 久久久之久亚州精品露出| 亚洲综合网站| 日韩在线视频在线| 国产一区二区在线影院| 天海翼在线视频| 6080亚洲精品一区二区| 日本激情在线观看| 成人性生交大片免费看小说| 婷婷亚洲最大| 青娱乐精品在线| 一区二区三区高清| 日本激情一区二区| 97国产在线视频| 香蕉国产成人午夜av影院| 精品国产成人av在线免| 久久久久99精品国产片| 91在线视频免费播放| 夜夜嗨av一区二区三区免费区| 国产资源在线观看入口av| 久久久久久久久久久久久9999| 亚洲精品护士| 国产精品815.cc红桃| 欧美性感一类影片在线播放| 91伦理视频在线观看| 91久久精品国产| 韩国精品一区二区三区| 疯狂揉花蒂控制高潮h| 色婷婷综合视频在线观看| www.亚洲资源| 92看片淫黄大片看国产片| 亚洲性感美女99在线| 亚洲第一黄色网址| 色成人在线视频| 日本成人在线播放| 成人资源视频网站免费| 国产精品一级| 激情高潮到大叫狂喷水| 日韩欧美卡一卡二| 松下纱荣子在线观看| 视频在线99| 国产精品66部| 香蕉影院在线观看| 精品国产视频在线| 成人性生交大片免费看96| 波多野结衣家庭教师视频| 国产精品网站在线播放| 精品久久国产视频| 日产日韩在线亚洲欧美| 99久久久久国产精品| 少妇精品无码一区二区三区| 在线视频欧美精品| 羞羞电影在线观看www| 麻豆视频成人| 韩国视频一区二区| 国产尤物在线视频| 久久亚洲一区二区三区四区五区高| 中文字幕视频精品一区二区三区| 国产老熟妇精品观看| 亚洲欧洲精品一区二区精品久久久| 亚洲va欧美va| 国产精品91久久久久久|