中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Golang中怎么利用Slice對append進行擴容

發布時間:2021-06-23 17:27:51 來源:億速云 閱讀:232 作者:Leah 欄目:編程語言

Golang中怎么利用Slice對append進行擴容,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

// grow grows the slice s so that it can hold extra more values, allocating
// more capacity if needed. It also returns the old and new slice lengths.
func grow(s Value, extra int) (Value, int, int) {
    i0 := s.Len()
    i1 := i0 + extra
    if i1 < i0 {
        panic("reflect.Append: slice overflow")
    }
    m := s.Cap()
    if i1 <= m {
        return s.Slice(0, i1), i0, i1
    }
    if m == 0 {
        m = extra
    } else {
        for m < i1 {
            if i0 < 1024 {
                m += m
            } else {
                m += m / 4
            }
        }
    }
    t := MakeSlice(s.Type(), i1, m)
    Copy(t, s)
    return t, i0, i1
}

// Append appends the values x to a slice s and returns the resulting slice.
// As in Go, each x's value must be assignable to the slice's element type.
func Append(s Value, x ...Value) Value {
    s.mustBe(Slice)
    s, i0, i1 := grow(s, len(x))
    for i, j := i0, 0; i < i1; i, j = i+1, j+1 {
        s.Index(i).Set(x[j])
    }
    return s
}

首先 Append 判斷類型是否 slice,然后調用 grow 擴容,從 l1 <= m 的判斷可以發現確實容量足夠的情況下,只是對原始數組建立一個新的 slice

但當容量不足時,可以看到只有在當前元素 i0 小于1024時,才是按2倍速度正常,否則其實每次只增長25%,代碼驗證如下:

func main() {
    str := make([]int, 1023)
    fmt.Println(len(str), cap(str))
    str = append(str, 1)
    fmt.Println(len(str), cap(str))
    str = append(str, 1)
    fmt.Println(len(str), cap(str))
}

輸出:
1023 1023
1024 2048
1025 2048

初始容量已經達到1024后,只增長了256

func main() {
    str := make([]int, 1024)
    fmt.Println(len(str), cap(str))
    str = append(str, 1)
    fmt.Println(len(str), cap(str))
    str = append(str, 1)
    fmt.Println(len(str), cap(str))
}
輸出:
1024 1024
1025 1280
1026 1280

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

沽源县| 霍州市| 科技| 阿城市| 江都市| 涪陵区| 梁平县| 南岸区| 许昌县| 和林格尔县| 铁岭县| 昔阳县| 武隆县| 红原县| 闻喜县| 福鼎市| 平邑县| 名山县| 美姑县| 津市市| 白水县| 呈贡县| 淳化县| 祥云县| 镇远县| 永顺县| 团风县| 密山市| 建平县| 临泽县| 成都市| 海伦市| 肃宁县| 宜州市| 勃利县| 阿合奇县| 万山特区| 静乐县| 百色市| 集安市| 米泉市|