第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

切片文字和制作切片之間的行為有區(qū)別嗎?

切片文字和制作切片之間的行為有區(qū)別嗎?

Go
溫溫醬 2022-06-27 09:34:48
它比較了切片聲明與制作切片,而我的問題比較了切片文字與制作切片。這個問題有一個簡單的答案,因為一個裸切片聲明會創(chuàng)建一個 nil 切片,但是,如果您仔細閱讀下面的問題,我根本不會創(chuàng)建一個 nil 切片。有兩種方法可以創(chuàng)建切片并附加到切片。我下面的代碼顯示了Example 1和兩種方式Example 2。package mainimport (    "fmt")func main() {    // Example 1    a := []int{}    fmt.Printf("len(a): %d; cap(a): %d; a: %v\n", len(a), cap(a), a)    a = append(a, 10, 20, 30, 40, 50)    fmt.Printf("len(a): %d; cap(a): %d; a: %v\n", len(a), cap(a), a)        // Example 2    b := make([]int, 0)    fmt.Printf("len(b): %d; cap(b): %d; b: %v\n", len(b), cap(b), b)    b = append(b, 10, 20, 30, 40, 50)    fmt.Printf("len(b): %d; cap(b): %d; b: %v\n", len(b), cap(b), b)}輸出:len(a): 0; cap(a): 0; a: []len(a): 5; cap(a): 6; a: [10 20 30 40 50]len(b): 0; cap(b): 0; b: []len(b): 5; cap(b): 6; b: [10 20 30 40 50]兩種創(chuàng)建空切片的方法都是[]int{}等效make([]int, 0)的嗎?在任何情況下,他們的行為會有所不同嗎?
查看完整描述

1 回答

?
泛舟湖上清波郎朗

TA貢獻1818條經(jīng)驗 獲得超3個贊

我修改了你的例子


    // Example 1

    a := []int{}

    pa := &a

  

    // Example 2

    b := make([]int, 0)

    pb := &b


    runtime.KeepAlive(pa)

    runtime.KeepAlive(pb)


它被編譯為:


*** main.go#12   >    a := []int{}

0x4e56a9    488d0538bb1100          lea rax, ptr [runtime.zerobase]

0x4e56b0    4889442470          mov qword ptr [rsp+0x70], rax

0x4e56b5    8400                test byte ptr [rax], al

0x4e56b7    eb00                jmp 0x4e56b9

0x4e56b9    4889842418010000        mov qword ptr [rsp+0x118], rax

0x4e56c1    0f57c0              xorps xmm0, xmm0

0x4e56c4    0f11842420010000        movups xmmword ptr [rsp+0x120], xmm0

*** main.go#13   >    pa := &a

0x4e56cc    488d842418010000        lea rax, ptr [rsp+0x118]

0x4e56d4    4889442460          mov qword ptr [rsp+0x60], rax

*** main.go#16   >    b := make([]int, 0)

0x4e56d9    488d0520020100          lea rax, ptr [__image_base__+1005824]

0x4e56e0    48890424            mov qword ptr [rsp], rax

0x4e56e4    0f57c0              xorps xmm0, xmm0

0x4e56e7    0f11442408          movups xmmword ptr [rsp+0x8], xmm0

0x4e56ec    e8bf49f6ff          call $runtime.makeslice

0x4e56f1    488b442418          mov rax, qword ptr [rsp+0x18]

0x4e56f6    4889842400010000        mov qword ptr [rsp+0x100], rax

0x4e56fe    0f57c0              xorps xmm0, xmm0

0x4e5701    0f11842408010000        movups xmmword ptr [rsp+0x108], xmm0

*** main.go#17   >    pb := &b

0x4e5709    488d842400010000        lea rax, ptr [rsp+0x100]

0x4e5711    4889442458          mov qword ptr [rsp+0x58], rax


似乎會make([]int, 0)導(dǎo)致堆分配(通過$runtime.makeslice()),但沒有 - 深入研究源表明makeslice()也返回&zerobase基于 - 的切片:


    if size == 0 {

        return unsafe.Pointer(&zerobase)

    }

因此,兩個片段都給出了相同的切片結(jié)構(gòu),其中數(shù)據(jù)指針設(shè)置為zerobase。


查看完整回答
反對 回復(fù) 2022-06-27
  • 1 回答
  • 0 關(guān)注
  • 124 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號