精品专区-精品自拍9-精品自拍三级乱伦-精品自拍视频-精品自拍视频曝光-精品自拍小视频

網站建設資訊

NEWS

網站建設資訊

golang中slice怎么用

小編給大家分享一下golang中slice怎么用,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

專注于為中小企業提供成都網站設計、做網站、成都外貿網站建設公司服務,電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業化州免費做網站提供優質的服務。我們立足成都,凝聚了一批互聯網行業人才,有力地推動了1000+企業的穩健成長,幫助中小企業通過網站建設實現規模擴充和轉變。

slice 結構定義

type slice struct {

    array unsafe.Pointer

    len   int

    cap   int

}

創建slice

// maxSliceCap returns the maximum capacity for a slice.

func maxSliceCap(elemsize uintptr) uintptr {

    if elemsize < uintptr(len(maxElems)) {

        return maxElems[elemsize]

    }

    return _MaxMem / elemsize

}

func makeslice(et *_type, len, cap int) slice {

    // NOTE: The len > maxElements check here is not strictly necessary,

    // but it produces a 'len out of range' error instead of a 'cap out of range' error

    // when someone does make([]T, bignumber). 'cap out of range' is true too,

    // but since the cap is only being supplied implicitly, saying len is clearer.

    // See issue 4085.

    // 計算最大可分配長度

    maxElements := maxSliceCap(et.size)

    if len < 0 || uintptr(len) > maxElements {

        panic(errorString("makeslice: len out of range"))

    }

    if cap < len || uintptr(cap) > maxElements {

        panic(errorString("makeslice: cap out of range"))

    }

    // 分配連續區間

    p := mallocgc(et.size*uintptr(cap), et, true)

    return slice{p, len, cap}

}

slice 擴容

// cap 目標容量

func growslice(et *_type, old slice, cap int) slice {

    if et.size == 0 {

        if cap < old.cap {

            panic(errorString("growslice: cap out of range"))

        }

        // append should not create a slice with nil pointer but non-zero len.

        // We assume that append doesn't need to preserve old.array in this case.

        return slice{unsafe.Pointer(&zerobase), old.len, cap}

    }

    newcap := old.cap

    doublecap := newcap + newcap

    if cap > doublecap {

        newcap = cap

    } else {

        // 小于1024,*2擴容

        if old.len < 1024 {

            newcap = doublecap

        } else {

            // 大于1024,*1.25

            for newcap < cap {

                newcap += newcap / 4

            }

        }

    }

    var lenmem, newlenmem, capmem uintptr

    const ptrSize = unsafe.Sizeof((*byte)(nil))

    switch et.size {

    case 1:

        lenmem = uintptr(old.len)

        newlenmem = uintptr(cap)

        capmem = roundupsize(uintptr(newcap))

        newcap = int(capmem)

    case ptrSize:

        lenmem = uintptr(old.len) * ptrSize

        newlenmem = uintptr(cap) * ptrSize

        capmem = roundupsize(uintptr(newcap) * ptrSize)

        newcap = int(capmem / ptrSize)

    default:

        lenmem = uintptr(old.len) * et.size

        newlenmem = uintptr(cap) * et.size

        capmem = roundupsize(uintptr(newcap) * et.size)

        newcap = int(capmem / et.size)

    }

    if cap < old.cap || uintptr(newcap) > maxSliceCap(et.size) {

        panic(errorString("growslice: cap out of range"))

    }

    var p unsafe.Pointer

    if et.kind&kindNoPointers != 0 {

        p = mallocgc(capmem, nil, false)

        memmove(p, old.array, lenmem)

        // The append() that calls growslice is going to overwrite from old.len to cap (which will be the new length).

        // Only clear the part that will not be overwritten.

        memclrNoHeapPointers(add(p, newlenmem), capmem-newlenmem)

    } else {

        // Note: can't use rawmem (which avoids zeroing of memory), because then GC can scan uninitialized memory.

        p = mallocgc(capmem, et, true)

        if !writeBarrier.enabled {

            memmove(p, old.array, lenmem)

        } else {

            for i := uintptr(0); i < lenmem; i += et.size {

                typedmemmove(et, add(p, i), add(old.array, i))

            }

        }

    }

    // 新slice

    return slice{p, old.len, newcap}

}

以上是“golang中slice怎么用”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注創新互聯行業資訊頻道!


分享文章:golang中slice怎么用
當前網址:http://m.jcarcd.cn/article/jhcpoc.html
主站蜘蛛池模板: 国产精品国产高清 | 日韩成人影片 | 精品91视频网站 | 午夜成人精 | 中文字幕等等 | 91精品国产电影 | 日韩在线观看不卡 | 国产又粗又猛又爽又 | 日韩国产不卡在 | 人人影视| 韩国伦理中文字幕 | 国产综合色产在线视 | 97影院 | 国产精品爽爽va在 | 亚洲无码在线免费视频 | 欧洲亚洲一区二 | 乱码高清在线观看 | 国产精品露脸国语 | 91手机在线看片 | 91香蕉在线 | 国产亚洲自拍一区 | 日韩精品在线第二页 | www区一区二区三 | 精品国产午夜大片 | 不卡视频一区二区 | 国产人妖的免 | 国产在线看片导航 | 国产精品偷伦视频 | 国产美女一级 | 91一区二区三区 | 成人亚洲电影 | 国产免费无遮 | 国产高清影片 | 乱伦自拍影视三级 | 精品国产乱码 | 欧美日韩亚洲第一页 | 中文字幕资源网 | 日韩欧美国产另类 | 日本69sex护士| 日本免费看黄 | 中文字幕丰 |