91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

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

伊金霍洛旗| 郎溪县| 古交市| 云龙县| 庄河市| 奉贤区| 苏尼特左旗| 连山| 洪江市| 浮梁县| 昂仁县| 奉贤区| 常熟市| 樟树市| 北京市| 普格县| 迁安市| 上高县| 保康县| 金湖县| 泰兴市| 恩施市| 台江县| 思南县| 布尔津县| 星座| 体育| 筠连县| 军事| 石阡县| 玉山县| 桓台县| 巍山| 理塘县| 虹口区| 黎城县| 芷江| 义乌市| 荆州市| 英超| 朝阳县|