Golang Slice和map的坑

 更新时间:2024年04月15日 11:12:55   作者:七八月份的太阳  
Golang中的Slice和Map在内存空间上,有一些不同,本文主要介绍了Golang Slice和map的坑,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一、浅拷贝同根

func main() {
	nums := [3]int{}
	nums[0] = 1

	fmt.Printf("nums: %v , len: %d, cap: %d\n", nums, len(nums), cap(nums))

	dnums := nums[0:2]
	dnums[0] = 5

	fmt.Printf("nums: %v ,len: %d, cap: %d\n", nums, len(nums), cap(nums))
	fmt.Printf("dnums: %v, len: %d, cap: %d\n", dnums, len(dnums), cap(dnums))
}

输出:

nums: [1 0 0] , len: 3, cap: 3
nums: [5 0 0] ,len: 3, cap: 3
dnums: [5 0], len: 2, cap: 3

slice若不是深拷贝或者重新生成新空间,无论通过参数传递还是使用 := 或者 [:]赋值都存在同根性。       

二、扩容摆脱同根

Slice与Array最大的区别在于Slice不需要指定大小会自动扩容等一些特性,我们在接受并习惯同根性后。Slice在多次append元素时,若满足扩容策略,这时候内部就会重新申请一块内存空间,将原本的元素拷贝一份到新的内存空间上。此时其与原本的数组就没有任何关联关系了,再进行修改值也不会变动到原始数组。

func main() {
	nums := [3]int{}
	nums[0] = 1

	fmt.Printf("nums: %v , len: %d, cap: %d\n", nums, len(nums), cap(nums))

	dnums := nums[0:2]
	dnums = append(dnums, []int{2, 3}...)
	dnums[1] = 1

	fmt.Printf("nums: %v ,len: %d, cap: %d\n", nums, len(nums), cap(nums))
	fmt.Printf("dnums: %v, len: %d, cap: %d\n", dnums, len(dnums), cap(dnums))
}

输出 :

nums: [1 0 0] , len: 3, cap: 3
nums: [1 0 0] ,len: 3, cap: 3
dnums: [1 1 2 3], len: 4, cap: 6

三、Empty与nil

Empty

func main() {
    nums := []int{}
    renums := make([]int, 0)
    
    fmt.Printf("nums: %v, len: %d, cap: %d\n", nums, len(nums), cap(nums))
    fmt.Printf("renums: %v, len: %d, cap: %d\n", renums, len(renums), cap(renums))
}

输出:

nums: [], len: 0, cap: 0
renums: [], len: 0, cap: 0

nil

func main() {
	var nums []int
	fmt.Println(nums,len(nums),cap(nums))
}

输出

[] 0 0

通过输出来看我们会发现不管是数据还是len 和cap都是相同的输出内容。

那我们就来用代码来证明一下他们是否真的一致

func main() {
	var nums []int
	renums := make([]int, 0)
	if nums == nil {
		fmt.Println("nums is nil.")
	}
	if renums == nil {
		fmt.Println("renums is nil.")
	}
}

输出:

nums is nil.

输出结果是不是出乎意料!不过聪明如你肯定已经通过自己的经验想到了答案。

一个有分配空间(Empty)一个没有分配空间(nil)

以上就是我使用slice遇到的坑,这里不再针对map做特殊分析了。

到此这篇关于Golang Slice和map的坑的文章就介绍到这了,更多相关Golang Slice和map内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 一文带你掌握掌握 Golang结构体与方法

    一文带你掌握掌握 Golang结构体与方法

    在 Golang 中,结构体和方法是实现面向对象编程的重要组成部分,也是 Golang 的核心概念之一。在本篇文章中,我们将深入介绍 Golang 结构体与方法的概念、使用方法以及相关的编程技巧和最佳实践
    2023-04-04
  • 使用 pprof 进行性能分析的方法详解

    使用 pprof 进行性能分析的方法详解

    pprof 是 Go 语言中用于性能分析的一个强大工具,它可以帮助开发人员找到应用程序中的性能瓶颈,并提供详细的分析报告,本文将介绍如何使用 pprof 进行性能分析,需要的朋友可以参考下
    2023-05-05
  • golang高并发系统限流策略漏桶和令牌桶算法源码剖析

    golang高并发系统限流策略漏桶和令牌桶算法源码剖析

    这篇文章主要介绍了golang高并发系统限流策略漏桶和令牌桶算法源码剖析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • golang连接mysql数据库操作使用示例

    golang连接mysql数据库操作使用示例

    这篇文章主要为大家介绍了golang连接mysql数据库操作使用示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2022-04-04
  • golang 解析word文档操作

    golang 解析word文档操作

    这篇文章主要介绍了golang 解析word文档操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • 自动生成代码controller tool的简单使用

    自动生成代码controller tool的简单使用

    这篇文章主要为大家介绍了自动生成代码controller tool的简单使用示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • Go标准库http server优雅启动深入理解

    Go标准库http server优雅启动深入理解

    这篇文章主要介绍了Go标准库http server优雅启动深入理解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • 解析GOROOT、GOPATH、Go-Modules-三者的关系

    解析GOROOT、GOPATH、Go-Modules-三者的关系

    这篇文章主要介绍了解析GOROOT、GOPATH、Go-Modules-三者的关系,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • Go工具链之go tool fix用法详解

    Go工具链之go tool fix用法详解

    go tool fix 是 Go 工具链中的一个命令,作用是把指定 Go 程序代码包中的的所有旧版本代码修正为新版本的代码,本文将简单介绍一下go tool fix的使用方法,感兴趣的小伙伴可以参考阅读下
    2023-07-07
  • Go语言之结构体与方法

    Go语言之结构体与方法

    这篇文章主要介绍了Go语言之结构体与方法,结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。下面我们就一起来学习什么是Go语言之结构体
    2021-10-10

最新评论