最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go語言中new與make的使用解讀

 更新時(shí)間:2025年07月07日 16:49:21   作者:言之。  
這篇文章主要介紹了Go語言中new與make的使用,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

在 Go 語言中,newmake 是兩個(gè)用于內(nèi)存分配的內(nèi)置函數(shù),但它們的作用和使用場景有顯著區(qū)別。

理解它們的核心在于:

  • new(T): 為類型 T 分配內(nèi)存,并將其初始化為零值,然后返回一個(gè)指向該內(nèi)存的指針 (*T)。
  • make(T, args...): 僅用于 slice、map 和 channel 這三種引用類型的創(chuàng)建和初始化。它返回的是類型 T 本身(而不是指針 *T),并且這個(gè) T 已經(jīng)被正確初始化,可以直接使用。

下面詳細(xì)解釋:

new

作用

  • 分配內(nèi)存。
  • 將分配的內(nèi)存清零(設(shè)置為相應(yīng)類型的零值)。
  • 返回一個(gè)指向新分配的零值 T 的指針 (*T)。

語法

p := new(T)

其中 T 可以是任何類型。

返回值

  • 一個(gè)指向類型 T 的指針 (*T)。

適用類型

  • 幾乎所有類型,包括基本類型(int, string, bool等)、結(jié)構(gòu)體(struct)、數(shù)組(array)等。
  • 也可以用于 slice, map, channel,但通常不這么用,因?yàn)?new 返回的是指向這些引用類型本身的指針,而引用類型本身在未初始化時(shí)是 nil

示例

// 為 int 分配內(nèi)存,i 是 *int 類型,*i 的值是 0
var i *int = new(int)
fmt.Printf("i: %p, *i: %d\n", i, *i) // *i 是 0

// 為自定義結(jié)構(gòu)體 MyStruct 分配內(nèi)存,s 是 *MyStruct 類型
type MyStruct struct {
    Field1 int
    Field2 string
}
var s *MyStruct = new(MyStruct)
fmt.Printf("s: %p, s.Field1: %d, s.Field2: '%s'\n", s, s.Field1, s.Field2) // s.Field1 是 0, s.Field2 是 ""

// 對于引用類型(不推薦,但可以這么做)
var sl *[]int = new([]int) // sl 是 *[]int 類型,*sl 的值是 nil
fmt.Printf("sl: %p, *sl == nil: %t\n", sl, *sl == nil) // *sl 是 nil,無法直接使用 append 等操作

var m *map[string]int = new(map[string]int) // m 是 *map[string]int 類型,*m 的值是 nil
fmt.Printf("m: %p, *m == nil: %t\n", m, *m == nil) // *m 是 nil,無法直接賦值

make

作用

  • 僅用于 slice、map 和 channel 這三種內(nèi)置引用類型的創(chuàng)建。
  • 它不僅分配內(nèi)存,還會初始化這些類型的內(nèi)部數(shù)據(jù)結(jié)構(gòu),使其立即可用。

語法

  • Slice: make([]T, length, capacity)make([]T, length) (capacity 默認(rèn)為 length)
  • Map: make(map[K]V, initialCapacity)make(map[K]V) (initialCapacity 可選)
  • Channel: make(chan T, bufferCapacity)make(chan T) (bufferCapacity 可選,默認(rèn)為0,即無緩沖)

返回值

  • 返回的是初始化后的類型 T 本身(例如 []int, map[string]int, chan int),而不是指針。

適用類型

  • 只能是 slice, map, channel。

示例

// 創(chuàng)建一個(gè)長度為 5,容量為 10 的 int 切片
s1 := make([]int, 5, 10)
fmt.Printf("s1: %v, len: %d, cap: %d\n", s1, len(s1), cap(s1)) // s1: [0 0 0 0 0], len: 5, cap: 10
s1[0] = 100 // 可以直接使用

// 創(chuàng)建一個(gè)初始容量(可選)的 map
m1 := make(map[string]int)
m1["age"] = 30 // 可以直接使用
fmt.Printf("m1: %v\n", m1)

// 創(chuàng)建一個(gè)帶緩沖的 channel
ch1 := make(chan int, 1)
ch1 <- 1 // 可以直接使用
fmt.Printf("Received from ch1: %d\n", <-ch1)

核心區(qū)別總結(jié)

特性new(T)make(T, args...)
目的分配內(nèi)存,初始化為零值創(chuàng)建并初始化 slice, map, channel 的內(nèi)部結(jié)構(gòu)
返回類型指針 *T類型 T 本身 (slice, map, or channel)
適用類型任何類型僅 slice, map, channel
初始化內(nèi)存被清零 (zero value)初始化內(nèi)部數(shù)據(jù)結(jié)構(gòu),使其立即可用 (non-nil)
常見用途獲取指向零值變量的指針,尤其是結(jié)構(gòu)體指針創(chuàng)建可用的 slice, map, channel

為什么make只用于 slice, map, channel?

這三種類型在 Go 中是引用類型,它們內(nèi)部不僅僅是一塊簡單的內(nèi)存區(qū)域,還包含了更復(fù)雜的數(shù)據(jù)結(jié)構(gòu):

  • Slice: 內(nèi)部包含指向底層數(shù)組的指針、長度(len)和容量(cap)。make 會分配底層數(shù)組并設(shè)置這些元數(shù)據(jù)。
  • Map: 內(nèi)部通常是哈希表的實(shí)現(xiàn)。make 會初始化這個(gè)哈希表結(jié)構(gòu)。
  • Channel: 內(nèi)部包含用于 goroutine 間同步和通信的機(jī)制,可能還有緩沖區(qū)。make 會設(shè)置這些。

如果對這些類型使用 new

var s *[]int = new([]int) // *s 是一個(gè) nil slice
var m *map[string]int = new(map[string]int) // *m 是一個(gè) nil map
var c *chan int = new(chan int) // *c 是一個(gè) nil channel

你會得到一個(gè)指向 nil slice/map/channel 的指針。這個(gè) nil 狀態(tài)的引用類型是不能直接使用的(例如,不能向 nil map 添加鍵值對,不能向 nil slice append 元素,不能向 nil channel 發(fā)送數(shù)據(jù))。你需要先用 make 來初始化它們。

何時(shí)使用哪個(gè)?

使用 new(T)

當(dāng)你需要一個(gè)指向某個(gè)類型 T 的變量,并且希望它被初始化為其零值時(shí)。

最常見的場景是為結(jié)構(gòu)體分配內(nèi)存并獲取其指針,然后填充字段:

type Point struct{ X, Y int }
p := new(Point) // p 是 *Point,p.X 和 p.Y 都是 0
p.X = 10

這等價(jià)于:

var p Point // p 是 Point,p.X 和 p.Y 都是 0
ptr := &p   // ptr 是 *Point
ptr.X = 10

或者更簡潔的復(fù)合字面量:

p := &Point{} // p 是 *Point,p.X 和 p.Y 都是 0
p.X = 10

使用 make(T, args...)

  • 當(dāng)你需要創(chuàng)建一個(gè) slice、map 或 channel,并希望它們被正確初始化以便立即使用時(shí)。這是創(chuàng)建這三種類型的標(biāo)準(zhǔn)方式。

記住這個(gè)簡單的規(guī)則:

  • 要創(chuàng)建 slice, map, channel,請使用 make。
  • 要為其他類型(如 int, string, struct, array)分配內(nèi)存并獲取指向其零值的指針,請使用 new(或者更常見的,使用復(fù)合字面量 &T{})。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 詳解Go語言如何進(jìn)行Http調(diào)用

    詳解Go語言如何進(jìn)行Http調(diào)用

    無論是微服務(wù)還是單體架構(gòu)等,服務(wù)間都有相互通信的時(shí)候,而最直接的通信方法就是 HTTP 調(diào)用,本文將會介紹在 Go 語言里,如何進(jìn)行 HTTP 調(diào)用,需要的可以參考一下
    2022-12-12
  • Go語言開發(fā)k8s之Deployment操作解析

    Go語言開發(fā)k8s之Deployment操作解析

    這篇文章主要為大家介紹了Go語言開發(fā)k8s之Deployment操作解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • Linux系統(tǒng)下Go語言開發(fā)環(huán)境搭建

    Linux系統(tǒng)下Go語言開發(fā)環(huán)境搭建

    這篇文章主要介紹了Linux系統(tǒng)下Go開發(fā)環(huán)境搭建,需要的朋友可以參考下
    2022-04-04
  • Go語言常見數(shù)據(jù)結(jié)構(gòu)的實(shí)現(xiàn)詳解

    Go語言常見數(shù)據(jù)結(jié)構(gòu)的實(shí)現(xiàn)詳解

    這篇文章主要為大家學(xué)習(xí)介紹了Go語言中的常見數(shù)據(jù)結(jié)構(gòu)(channal、slice和map)的實(shí)現(xiàn),文中的示例代碼簡潔易懂,需要的可以參考一下
    2023-07-07
  • Go??iota?常量基本語法介紹

    Go??iota?常量基本語法介紹

    這篇文章主要介紹了Go?為什么要設(shè)計(jì)?iota?常量,我們介紹了 Go 中 iota 的基本語法。同時(shí)基于歷史資料針對 iota 到底是什么,為什么要這么叫,又有什么用進(jìn)行了一番研究,需要的朋友可以參考下
    2022-06-06
  • 這些關(guān)于Go中interface{}的注意事項(xiàng)你都了解嗎

    這些關(guān)于Go中interface{}的注意事項(xiàng)你都了解嗎

    這篇文章主要為大家詳細(xì)介紹了學(xué)習(xí)Go語言時(shí)需要了解的interface{}注意事項(xiàng),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下
    2023-03-03
  • Go中的字典Map增刪改查、排序及其值類型

    Go中的字典Map增刪改查、排序及其值類型

    本文詳細(xì)介紹了Go語言中Map的基本概念、聲明初始化、增刪改查操作、反轉(zhuǎn)、排序以及如何判斷鍵是否存在等操作,Map是一種基于鍵值對的無序數(shù)據(jù)結(jié)構(gòu),鍵必須是支持相等運(yùn)算符的類型,值可以是任意類型,初始化Map時(shí)推薦指定容量以提高性能
    2024-09-09
  • 使用go mod導(dǎo)入本地自定義包問題

    使用go mod導(dǎo)入本地自定義包問題

    這篇文章主要介紹了使用go mod導(dǎo)入本地自定義包問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • GO語言make()分配用法實(shí)例

    GO語言make()分配用法實(shí)例

    這篇文章主要介紹了GO語言make()分配用法,實(shí)例分析了make()的功能及使用技巧,需要的朋友可以參考下
    2015-02-02
  • golang通過gorm操作sqlite設(shè)置主鍵自增的步驟

    golang通過gorm操作sqlite設(shè)置主鍵自增的步驟

    這篇文章主要介紹了golang通過gorm操作sqlite設(shè)置主鍵自增的詳細(xì)步驟,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-09-09

最新評論

陆良县| 甘德县| 板桥市| 仙桃市| 西和县| 鄯善县| 阿克陶县| 射阳县| 锡林郭勒盟| 泗阳县| 凌海市| 巨鹿县| 钟祥市| 隆德县| 泰州市| 临泽县| 郯城县| 云龙县| 南康市| 惠水县| 乾安县| 乐至县| 班玛县| 东港市| 玉环县| 郎溪县| 嘉峪关市| 阿巴嘎旗| 信阳市| 四川省| 夹江县| 黄梅县| 珲春市| 海安县| 庄河市| 如东县| 房产| 融水| 阿图什市| 禄丰县| 无棣县|