主页 > 知识库 > 理解Golang中的数组(array)、切片(slice)和map

理解Golang中的数组(array)、切片(slice)和map

热门标签:Linux服务器 呼叫中心市场需求 铁路电话系统 服务外包 AI电销 地方门户网站 网站排名优化 百度竞价排名

我比较喜欢先给出代码,然后得出结论

数组

复制代码 代码如下:

package main

import (
    "fmt"
)

func main() {
    arr := [...]int{1, 2, 3}
    //打印初始的指针
    fmt.Printf("the pointer is : %p \n", arr)
    printPointer(arr)
}

func printPointer(any interface{}) {
    fmt.Printf("the pointer is : %p \n", any)
}

结果

复制代码 代码如下:

1 the pointer is : 0xc082008580
2 the pointer is : 0xc0820001d0

切片

复制代码 代码如下:

package main

import (
    "fmt"
)

func main() {
    arr := make([]int, 3)
    //打印初始的指针
    fmt.Printf("the pointer is : %p \n", arr)
    printPointer(arr)
}

func printPointer(any interface{}) {
    fmt.Printf("the pointer is : %p \n", any)
}

结果

复制代码 代码如下:

1 the pointer is : 0xc082008580
2 the pointer is : 0xc082008580

map

复制代码 代码如下:

package main

import (
    "fmt"
)

func main() {
    arr := make(map[int]string)
    //arr := [3]int{1, 2, 3}
    //打印初始的指针
    fmt.Printf("the pointer is : %p \n", arr)
    printPointer(arr)
}

func printPointer(any interface{}) {
    fmt.Printf("the pointer is : %p \n", any)
}

运行结果

复制代码 代码如下:

1 the pointer is : 0xc082007c80
2 the pointer is : 0xc082007c80

由此,我们看到数组本身传过去的是值,传到函数之后,被开辟了另外一个空间。

因为数组就是他本身。这一句好像不太好理解。

这是切片 arr := make([]int, 3)  而arr 本身不是一个数组,至少不是我们所想要的指向的一个数组。只是arr里有一个地址指向数组。

这么举个例子:

arr := [...]int{1,2,3,4,5} 这是一个数组,懂得go语言的都明白。  arr本身就是数组

arrSlice := arr[0:5]  这是一个切片。 打印所得的值是一样的,和上面。  arrSlice本身不是数组,只是arrSlice本身有一个值是指向arr的指针。

切片是指一个结构体,大体结构像这样:

复制代码 代码如下:

struct slice{
     ptr *Elem
    len int
    cap int
 }

也就是说,上面的arrSlice其实是一个结构体。里面有一个属性 ptr指向数组 arr

其实arrSlice也是传到函数里,也是进行了复制。但是尽管传过去是一个复制的结构体,他的属性ptr,没有变。还是一个指向原数组的指针。

下面的例子见证他自己传过去,是一个复制的过程:

复制代码 代码如下:

package main

import (
    "fmt"
)

func main() {
    arrSlice := make([]int, 4)
    fmt.Printf("the pointer is : %p \n", arrSlice)
    fmt.Printf("the pointer is : %p \n", arrSlice) //这是arrSlice本身的指针,也就是结构体的指针
    printPointer(arrSlice)
}

func printPointer(any interface{}) {
    fmt.Printf("the pointer is : %p \n", any)
    fmt.Printf("the pointer is : %p \n", any) //打印传过来的结构体arrSlice的指针
}

看结果:

复制代码 代码如下:

the pointer is : 0xc0820085a0
the pointer is : 0xc082008580
the pointer is : 0xc0820085a0
the pointer is : 0xc0820001d0

第1、3个的打印是打印这个结构体的ptr属性,也就是指向数组的指针。

其实这个结构体传到函数里,是一个复制的过程,第2、4的指针不一样。

大家在对照下面的图片理解一下:

您可能感兴趣的文章:
  • 简单聊一聊Go语言中的数组和切片
  • go特性之数组与切片的问题
  • 深入理解Go语言中的数组和切片
  • GO语言数组和切片实例详解
  • 浅谈Go数组比切片好在哪

标签:崇左 衡水 湘潭 兰州 仙桃 湖南 铜川 黄山

巨人网络通讯声明:本文标题《理解Golang中的数组(array)、切片(slice)和map》,本文关键词  ;如发现本文内容存在版权问题,烦请提供相关信息告之我们,我们将及时沟通与处理。本站内容系统采集于网络,涉及言论、版权与本站无关。
  • 相关文章
  • 收缩
    • 微信客服
    • 微信二维码
    • 电话咨询

    • 400-1100-266