首页 > 后端开发 > Golang > 正文

Go 语言中动态分配数组内存

花韻仙語
发布: 2025-08-03 18:02:10
原创
726人浏览过

go 语言中动态分配数组内存

在 Go 语言中,动态分配数组内存是一个常见的需求,尤其是在编译时数组的大小未知的情况下。传统的 new 函数主要用于分配单个值的内存,而要创建动态大小的数组,通常需要使用 make 函数来创建切片。切片是对底层数组的抽象,它提供了动态调整大小的能力,并且可以方便地进行操作。

使用 make 函数创建切片

make 函数是 Go 语言中用于创建切片、映射和通道的关键函数。对于切片,make 函数会分配一个底层数组,并返回一个指向该数组的切片。切片包含三个属性:长度(length)、容量(capacity)和指向底层数组的指针。

package main

import "fmt"

func main() {
    // 创建一个长度和容量都为 10 的 int 类型切片
    slice := make([]int, 10)

    // 初始化切片元素
    for i := 0; i < len(slice); i++ {
        slice[i] = i * 2
    }

    // 打印切片元素
    for i := 0; i < len(slice); i++ {
        fmt.Println(slice[i])
    }
}
登录后复制

在上面的例子中,make([]int, 10) 创建了一个长度为 10,容量也为 10 的 int 类型切片。这意味着底层数组可以存储 10 个整数,并且切片当前包含 10 个元素。

new 函数的用法

虽然 make 函数是创建动态数组的首选方法,但 new 函数在某些情况下仍然有用。new 函数分配指定类型的零值的内存,并返回一个指向该内存地址的指针。

package main

import "fmt"

func main() {
    // 分配一个 int 类型的内存,并返回一个指向该内存地址的指针
    ptr := new(int)

    // 设置指针指向的内存的值
    *ptr = 100

    // 打印指针指向的内存的值
    fmt.Println("*ptr = ", *ptr)
}
登录后复制

在这个例子中,new(int) 分配了一个 int 类型的内存,并返回一个指向该内存地址的指针 ptr。然后,我们可以使用 *ptr 来访问和修改该内存的值。

make 和 new 的区别

make 和 new 函数都用于内存分配,但它们有不同的用途:

云雀语言模型
云雀语言模型

云雀是一款由字节跳动研发的语言模型,通过便捷的自然语言交互,能够高效的完成互动对话

云雀语言模型 54
查看详情 云雀语言模型
  • new(T):分配类型 T 的零值内存,并返回一个 *T 类型的指针。
  • make(T, args):只能用于创建切片、映射和通道,返回的是 T 类型,而不是指针。它会初始化数据结构。

简而言之,new 用于分配单个值的内存,而 make 用于创建和初始化切片、映射和通道等复杂的数据结构。

动态数组的扩展

切片的容量可以在需要时进行扩展。可以使用 append 函数向切片添加元素。如果切片的容量不足以容纳新元素,append 函数会自动分配更大的底层数组,并将现有元素复制到新数组中。

package main

import "fmt"

func main() {
    // 创建一个长度为 0,容量为 5 的 int 类型切片
    slice := make([]int, 0, 5)

    // 向切片添加元素
    slice = append(slice, 1, 2, 3)

    // 打印切片的长度和容量
    fmt.Println("len(slice) =", len(slice)) // 输出: len(slice) = 3
    fmt.Println("cap(slice) =", cap(slice)) // 输出: cap(slice) = 5

    // 继续添加元素,直到超过容量
    slice = append(slice, 4, 5, 6)

    // 打印切片的长度和容量
    fmt.Println("len(slice) =", len(slice)) // 输出: len(slice) = 6
    fmt.Println("cap(slice) =", cap(slice)) // 输出: cap(slice) = 10 (容量自动扩展)

    // 打印切片元素
    for i := 0; i < len(slice); i++ {
        fmt.Println(slice[i])
    }
}
登录后复制

在这个例子中,我们首先创建了一个长度为 0,容量为 5 的切片。然后,我们使用 append 函数向切片添加了 3 个元素。当我们继续添加元素,直到超过容量时,append 函数会自动分配一个更大的底层数组,并将现有元素复制到新数组中。

注意事项

  • 切片是对底层数组的引用。当多个切片引用同一个底层数组时,修改一个切片可能会影响其他切片。
  • 切片的长度和容量是不同的概念。长度表示切片当前包含的元素个数,容量表示底层数组可以存储的元素个数。
  • 使用 make 函数创建切片时,可以指定长度和容量。如果只指定长度,则容量与长度相等。

总结

在 Go 语言中,使用 make 函数可以方便地创建动态大小的数组,并使用切片来操作和管理这些数组。make 函数分配底层数组,并返回一个指向该数组的切片。切片提供了动态调整大小的能力,并且可以方便地进行操作。同时,了解 new 函数的用法以及 make 和 new 的区别,可以更好地理解 Go 语言的内存分配机制。掌握这些知识,可以编写更加高效和灵活的 Go 程序。

以上就是Go 语言中动态分配数组内存的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号