亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

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

福安市| 五寨县| 昆山市| 阳城县| 西峡县| 崇仁县| 翁牛特旗| 鞍山市| 个旧市| 体育| 都匀市| 新野县| 中牟县| 叶城县| 东兰县| 晋江市| 南部县| 新疆| 杨浦区| 银川市| 阿尔山市| 龙川县| 达州市| 新宾| 科技| 兰州市| 鲁山县| 孝感市| 永泰县| 宁陵县| 溧阳市| 德清县| 翁牛特旗| 临江市| 西藏| 阿拉尔市| 马尔康县| 霞浦县| 中西区| 沂水县| 通辽市|