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

溫馨提示×

溫馨提示×

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

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

Go語言中new和make關鍵字的區別是什么

發布時間:2023-03-28 09:30:50 來源:億速云 閱讀:117 作者:iii 欄目:編程語言

這篇文章主要介紹了Go語言中new和make關鍵字的區別是什么的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇Go語言中new和make關鍵字的區別是什么文章都會有所收獲,下面我們一起來看看吧。

new

new 是一個內置函數,它會分配一段內存,并返回指向該內存的指針。

其函數簽名如下:

源碼

// The new built-in function allocates memory. The first argument is a type,
// not a value, and the value returned is a pointer to a newly
// allocated zero value of that type.
func new(Type) *Type

從上面的代碼可以看出,new 函數只接受一個參數,這個參數是一個類型,并且返回一個指向該類型內存地址的指針。

同時 new 函數會把分配的內存置為零,也就是類型的零值。

使用

使用 new 函數為變量分配內存空間:

p1 := new(int)
fmt.Printf("p1 --> %#v \n ", p1) //(*int)(0xc42000e250) 
fmt.Printf("p1 point to --> %#v \n ", *p1) //0

var p2 *int
i := 0
p2 = &i
fmt.Printf("p2 --> %#v \n ", p2) //(*int)(0xc42000e278) 
fmt.Printf("p2 point to --> %#v \n ", *p2) //0

上面的代碼是等價的,new(int) 將分配的空間初始化為 int 的零值,也就是 0,并返回 int 的指針,這和直接聲明指針并初始化的效果是相同的。

當然,new 函數不僅能夠為系統默認的數據類型分配空間,自定義類型也可以使用 new 函數來分配空間,如下所示:

type Student struct {
   name string
   age int
}
var s *Student
s = new(Student) //分配空間
s.name = "zhangsan"
fmt.Println(s)

這就是 new 函數,它返回的永遠是類型的指針,指針指向分配類型的內存地址。需要注意的是,new 函數只會分配內存空間,但并不會初始化該內存空間。

make

make 也是用于內存分配的,但是和 new 不同,它只用于 slice、map 和 chan 的內存創建,而且它返回的類型就是這三個類型本身,而不是他們的指針類型。因為這三種類型本身就是引用類型,所以就沒有必要返回他們的指針了。

其函數簽名如下:

源碼

// The make built-in function allocates and initializes an object of type
// slice, map, or chan (only). Like new, the first argument is a type, not a
// value. Unlike new, make's return type is the same as the type of its
// argument, not a pointer to it. The specification of the result depends on
// the type:
// Slice: The size specifies the length. The capacity of the slice is
// equal to its length. A second integer argument may be provided to
// specify a different capacity; it must be no smaller than the
// length, so make([]int, 0, 10) allocates a slice of length 0 and
// capacity 10.
// Map: An empty map is allocated with enough space to hold the
// specified number of elements. The size may be omitted, in which case
// a small starting size is allocated.
// Channel: The channel's buffer is initialized with the specified
// buffer capacity. If zero, or the size is omitted, the channel is
// unbuffered.
func make(t Type, size ...IntegerType) Type

通過上面的代碼可以看出 make 函數的 t 參數必須是 slice、map 和 chan 中的一個,并且返回值也是類型本身。

使用

下面用 slice 來舉一個例子:

var s1 []int
if s1 == nil {
    fmt.Printf("s1 is nil --> %#v \n ", s1) // []int(nil)
}

s2 := make([]int, 3)
if s2 == nil {
    fmt.Printf("s2 is nil --> %#v \n ", s2)
} else {
    fmt.Printf("s2 is not nill --> %#v \n ", s2)// []int{0, 0, 0}
}

slice 的零值是 nil,但使用 make 初始化之后,slice 內容被類型 int 的零值填充,如:[]int{0, 0, 0}

map 和 chan 也是類似的,就不多說了。

關于“Go語言中new和make關鍵字的區別是什么”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“Go語言中new和make關鍵字的區別是什么”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

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

AI

尚志市| 延安市| 深泽县| 白银市| 渭南市| 洪江市| 迭部县| 托克逊县| 天峨县| 融水| 靖江市| 望江县| 万全县| 深水埗区| 苗栗市| 潮安县| 永城市| 方正县| 兰州市| 天门市| 甘洛县| 棋牌| 米泉市| 墨脱县| 临洮县| 犍为县| 巫山县| 佛山市| 荆州市| 鸡东县| 西城区| 县级市| 东阿县| 深水埗区| 榆林市| 平南县| 灵山县| 鹿泉市| 三穗县| 榆树市| 内江市|