日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無先后,達(dá)者為師

網(wǎng)站首頁 編程語言 正文

Go語言中make和new函數(shù)的用法與區(qū)別_Golang

作者:奮斗的大橙子 ? 更新時間: 2022-09-08 編程語言

相同點(diǎn):

make和new都是用來創(chuàng)建分配類型內(nèi)存的。

不同點(diǎn):

先看下面的代碼

package main
import "fmt"
func main(){
  var i *int
  var x = 10
  *i=x
  fmt.Println(*i)
}

編譯過程會出錯

panic: runtime error: invalid memory address or nil pointer dereference <br data-filtered="filtered">[signal 0xc0000005 code=0x1 addr=0x0 pc=0x48b576]

我們的想法是把 10 賦值 i指向的地址,但是這里由于 *i 沒有初始化,所以并不知道 *i的地址是什么,如果直接 *i的賦值為10,那么肯定是不行的(10這個地址沒有)

所以要想使用 *i,需要把 x的地址給i,修改成如下代碼

var i *int
var x = 10
i=&x
fmt.Println(*i)

補(bǔ)充: * 代表取地址里內(nèi)容, &代表取地址

或者使用 new 進(jìn)行初始化,代碼如下:

var x = 10
var i *int i = new(int)
*i=x
fmt.Println(*i)

new的源代碼如下

它只接受一個參數(shù),這個參數(shù)是一個類型,分配好內(nèi)存后,返回一個指向該類型內(nèi)存地址的指針。同時請注意它同時把分配的內(nèi)存置為零,也就是類型的零值。

make也是用于內(nèi)存分配的,但是和new不同,它只用于chan、map以及slice的內(nèi)存創(chuàng)建,

而且它返回的類型就是這三個類型本身,而不是他們的指針類型,因?yàn)檫@三種類型就是引用類型,所以就沒有必要返回他們的指針了。

綜上:

二者都是內(nèi)存的分配(堆上)

區(qū)別1

  • make只用于slice、map以及channel的初始化(非零值);
  • new用于類型的內(nèi)存分配,并且內(nèi)存置為零。

區(qū)別2

  • make返回的還是這三個引用類型本身;
  • new返回的是指向類型的指針。

原文鏈接:https://www.cnblogs.com/dcz2015/p/10578957.html

欄目分類
最近更新