切換語言為:簡體
Go nil 空結構體 空介面有什麼區別?

Go nil 空結構體 空介面有什麼區別?

  • 爱糖宝
  • 2024-10-30
  • 2033
  • 0
  • 0

1.1 nil是一個零值變數

從定義可以看出nil是一個預定義的變數,並且是以下型別的變數:

指標、管道、函式、介面、Map、切片

// nil is a predeclared identifier representing the zero value for a
// pointer, channel, func, interface, map, or slice type.
var nil Type // Type must be a pointer, channel, func, interface, map, or slice type

1.2 空結構體

1.2.1 大小為0

Go nil 空結構體 空介面有什麼區別?

1.2.2 都指向同一個地址zerobase(不被包含在其他結構體中時)

runtime\malloc.go

// base address for all 0-byte allocations
var zerobase uintptr

1.2.3 作為結構體欄位的偏移

  1. 只有一個空介面體欄位時

結構體本身和其欄位都指向zerobase

Go nil 空結構體 空介面有什麼區別?

  1. 當有其他欄位時,並且空結構體欄位處於第一個欄位時

空結構體欄位和整個變數的地址及第二個欄位的地址一樣

Go nil 空結構體 空介面有什麼區別?

  1. 當有其他欄位時,並且空結構體欄位處於中間欄位時

空結構體欄位的地址會緊跟前一個位元組的末尾

Go nil 空結構體 空介面有什麼區別?

  1. 當有其他欄位時,並且空結構體欄位處於最後欄位時

空結構體欄位的地址會緊跟前一個位元組的末尾,但會進行填充,並且填充長度與前一個欄位相同。

Go nil 空結構體 空介面有什麼區別?

1.3 空介面

空介面的底層實現是eface,_type欄位儲存具體物件的型別,data欄位儲存具體物件的值

type eface struct {
    _type *_type    // 
    data  unsafe.Pointer // 
}

細節:只有當eface的兩個欄位都為nil時,eface才為nil

Go nil 空結構體 空介面有什麼區別?

0則評論

您的電子郵件等資訊不會被公開,以下所有項目均必填

OK! You can skip this field.