美文网首页
go make的使用场景

go make的使用场景

作者: hehehehe | 来源:发表于2025-02-18 20:21 被阅读0次

在 Go 中,make 是一个内置函数,用于创建和初始化以下三种引用类型的数据结构:

  1. 切片(Slice)
  2. 映射(Map)
  3. 通道(Channel)

make 的主要作用是分配内存并初始化这些数据结构,使它们可以正常使用。以下是 make 的使用场景和具体示例。


1. 创建切片(Slice)

场景

  • 当需要动态分配一个切片,并指定其初始长度和容量时使用。
  • 切片的底层需要一个数组,make 会自动为切片分配底层数组的内存。

语法

make([]T, length, capacity)
  • T:切片的元素类型。
  • length:切片的初始长度(即切片中有多少个元素可用)。
  • capacity(可选):切片的容量(底层数组的大小)。如果未指定,容量默认为长度。

示例

package main

import "fmt"

func main() {
    // 创建一个长度为 3,容量为 5 的切片
    s := make([]int, 3, 5)
    fmt.Println(s)             // 输出:[0 0 0],初始值为零值
    fmt.Println(len(s), cap(s)) // 输出:3 5

    // 修改切片元素
    s[0] = 10
    fmt.Println(s)             // 输出:[10 0 0]

    // 动态扩展切片
    s = append(s, 20, 30)
    fmt.Println(s)             // 输出:[10 0 0 20 30]
    fmt.Println(len(s), cap(s)) // 输出:5 5

    // 再次扩展,超过容量,触发扩容
    s = append(s, 40)
    fmt.Println(s)             // 输出:[10 0 0 20 30 40]
    fmt.Println(len(s), cap(s)) // 输出:6 10(容量通常翻倍)
}

2. 创建映射(Map)

场景

  • 当需要创建一个空的映射(键值对集合)时使用。
  • make 会初始化映射的内部数据结构,使其可以用于存储键值对。

语法

make(map[K]V, hint)
  • K:键的类型。
  • V:值的类型。
  • hint(可选):一个容量提示,用于告诉 Go 预分配多少空间(不是固定大小,映射会根据需要动态扩展)。

示例

package main

import "fmt"

func main() {
    // 创建一个空的映射
    m := make(map[string]int)
    fmt.Println(m) // 输出:map[]

    // 添加键值对
    m["Alice"] = 25
    m["Bob"] = 30
    fmt.Println(m) // 输出:map[Alice:25 Bob:30]

    // 访问键值对
    fmt.Println(m["Alice"]) // 输出:25

    // 检查键是否存在
    value, exists := m["Charlie"]
    fmt.Println(value, exists) // 输出:0 false

    // 删除键
    delete(m, "Bob")
    fmt.Println(m) // 输出:map[Alice:25]
}

3. 创建通道(Channel)

场景

  • 当需要创建一个通道用于协程之间的通信时使用。
  • make 会初始化通道的内部数据结构,使其可以正常传递数据。

语法

make(chan T, bufferSize)
  • T:通道中传递的数据类型。
  • bufferSize(可选):通道的缓冲区大小。
    • 如果 bufferSize 为 0 或未指定,则创建的是无缓冲通道
    • 如果 bufferSize 大于 0,则创建的是有缓冲通道

示例

package main

import "fmt"

func main() {
    // 创建一个无缓冲通道
    ch := make(chan int)

    // 使用 goroutine 发送数据
    go func() {
        ch <- 42
    }()

    // 接收数据
    value := <-ch
    fmt.Println(value) // 输出:42

    // 创建一个有缓冲通道
    chBuffered := make(chan int, 2)
    chBuffered <- 10
    chBuffered <- 20
    fmt.Println(<-chBuffered) // 输出:10
    fmt.Println(<-chBuffered) // 输出:20
}

4. 与 new 的区别

Go 中除了 make,还有另一个内置函数 new,它们的作用不同:

特性 make new
适用类型 仅适用于切片(Slice)、映射(Map)、通道(Channel) 适用于所有类型
返回值 返回初始化后的引用类型(非指针) 返回指向零值的指针
主要用途 分配内存并初始化内部数据结构 仅分配内存,不初始化

示例:

package main

import "fmt"

func main() {
    // 使用 make 创建切片
    s := make([]int, 3)
    fmt.Println(s) // 输出:[0 0 0]

    // 使用 new 创建数组指针
    p := new([3]int)
    fmt.Println(*p) // 输出:[0 0 0]
}

5. 使用场景总结

切片(Slice)

  • 需要创建一个动态长度的数据集合。
  • 需要指定切片的初始长度和容量。
  • 需要对底层数组进行动态扩展时。

映射(Map)

  • 需要存储键值对数据。
  • 需要高效的键值查找、插入和删除操作。
  • 需要初始化一个空的映射。

通道(Channel)

  • 需要在多个 Goroutine 之间传递数据。
  • 需要创建无缓冲或有缓冲的通信通道。

6. 注意事项

  1. 不能用 make 创建其他类型

    • make 只能用于切片、映射和通道,不能用于数组、结构体等其他类型。
    • 对于其他类型的初始化,通常使用 new 或直接字面量赋值。
  2. 切片的容量提示

    • 使用 make([]T, len, cap) 时,cap 的设置可以减少切片扩容的次数,从而提高性能。
  3. 映射的容量提示

    • make(map[K]V, hint) 中的 hint 只是容量的提示,Go 不会强制遵守该值。
  4. 通道的缓冲区大小

    • 无缓冲通道会导致发送和接收操作阻塞,适用于严格同步的场景。
    • 有缓冲通道允许一定数量的数据缓冲,适用于异步通信场景。

总结

make 是 Go 中用于创建和初始化切片、映射和通道的关键工具。它的使用场景非常明确:

  • 切片:动态数组,支持扩展。
  • 映射:键值对存储。
  • 通道:协程间通信。

通过合理使用 make,可以高效地管理内存并初始化复杂的数据结构。

相关文章

  • gojs 对流程图缩放设置

    var Go = go.GraphObject.make; var myDiagram = Go(go.Diagr...

  • Golang中make与new有何区别?

    Golang中make与new有何区别? 一、前言 本文主要给大家介绍了Go语言中函数new与make的使用和区别...

  • go的make slice坑, defer闭包坑, 变量类型坑

    make slicek 我记得这几乎是每个使用go的同学都会遇到的: make在slice的时候,会根据第二个参数...

  • 七牛云 Go 语言周报【九月第 1 期】

    Go 1.9 新特性 Type Alias 详解 我的 Go 的使用场景 一起用 golang 之 Go 程序的套...

  • C 调用 Go 函数

    我们之前已经让 Go 调用 C 函数,但有些场景下需要 C 来调用Go函数。 Go 使用 export 关键字导出...

  • go 语言进阶学习笔记(一)

    我先想分析一下现在有哪些公司使用go 语言,go语言在实际开发中有哪些使用场景,为什么要从其他语言转换成go语言。...

  • go 语言入门

    我先想分析一下现在有哪些公司使用go 语言,go语言在实际开发中有哪些使用场景,为什么要从其他语言转换成go语言。...

  • 4G

    Passengers will be able to make calls and go online anywh...

  • go channel 的使用场景

    概述 go channel 存在3种状态 nil 未初始化的状态,只进行了声明 active 正常的channel...

  • up

    my english program go up again that make me confident

网友评论

      本文标题:go make的使用场景

      本文链接:https://www.haomeiwen.com/subject/ecnepjtx.html