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

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

数组

代码如下:

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的指针不一样。

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

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

时间: 2014-10-27

Golang学习笔记(四):array、slice、map

一.Array 在Go语言中,数组是一个值类型(value type) 所有的值类型变量在赋值和作为参数传递时都将产生一个复制动作 如果作为函数的参数类型,则在函数调用时参数发生数据复制,在函数体中无法修改传入数组的内容 数组相等用 = != 比较,不能用 < > 1.声明&赋值 初始化 语法 复制代码 代码如下: var VarName [n]type     // n>=0 e.g. var a [5]int //[0 0 0 0 0] var c [2][3]int //二

利用Golang解析json数据的方法示例

本文主要给大家介绍的是关于Golang解析json数据的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍: 使用 Golang 解析 json 数据,这种 json 格式是对象的数组,官方文档有一个示例: var jsonBlob = []byte(`[ {"Name": "Platypus", "Order": "Monotremata"}, {"Name": "Quoll

Golang map如何生成有序的json数据详解

前言 本文主要给大家介绍了关于Golang map生成有序json数据的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍: 先来看一段 Golang 生成 json 的代码,首先定义了一个 map[string]interface{}  的变量,然后存一些值,这里要注意的是 previews 字段,为了浏览器获取到的 json 数据是有序的,所以定义了一个 map[int]map[string]string 的类型,加上了一个表示顺序的键: list := make(map[strin

Golang中使用JSON的一些小技巧分享

前言 有的时候上游传过来的字段是string类型的,但是我们却想用变成数字来使用. 本来用一个json:",string" 就可以支持了,如果不知道golang的这些小技巧,就要大费周章了. 参考文章: JSON and struct composition in Go 临时忽略struct字段 type User struct { Email string `json:"email"` Password string `json:"password&qu

golang实现sql结果集以json格式输出的方法

本文实例讲述了golang实现sql结果集以json格式输出的方法.分享给大家供大家参考,具体如下: 复制代码 代码如下: func getJSON(sqlString string) (string, error) {     stmt, err := db.Prepare(sqlString)     if err != nil {         return nil, err     }     defer stmt.Close()     rows, err := stmt.Query

jquery解析json格式数据的方法(对象、字符串)

本文实例讲述了jquery解析json格式数据的方法.分享给大家供大家参考,具体如下: json数据是我们常用的一种小型的数据实时交换的一个东西,他可以利用jquery或js进行解析,下面我来介绍jquery解析json字符串方法. 一.jQuery解析Json数据格式: 使用这种方法,你必须在Ajax请求中设置参数: dataType: "json" 获取通过回调函数返回的数据并解析得到我们想要的值,看源码: jQuery.ajax({ url: full_url, dataType

Python使用内置json模块解析json格式数据的方法

本文实例讲述了Python使用内置json模块解析json格式数据的方法.分享给大家供大家参考,具体如下: Python中解析json字符串非常简单,直接用内置的json模块就可以,不需要安装额外的模块. 一.json字符串转为python值 json字符串: 复制代码 代码如下: {"userAccount":"54321","date":"2016-12-06 10:26:17","ClickTime"

JS中的数组转变成JSON格式字符串的方法

有一个JS数组,如: var arr = [["projectname1","projectnumber1"],["projectname2","projectnumber2"],["projectname3","projectnumber3"]]; 想将此数组转换成JSON字符串,如: var jsonarr = [{"projectname":projectnam

django通过ajax发起请求返回JSON格式数据的方法

本文实例讲述了django通过ajax发起请求返回JSON格式数据的方法.分享给大家供大家参考.具体实现方法如下: 这是后台处理的: def checkemail(request): user = None if request.POST.has_key('email'): useremail = request.POST['email'] result = {} user = User.objects.filter(useremail__iexact = useremail) if user:

python 把数据 json格式输出的实例代码

有个要求需要在python的标准输出时候显示json格式数据,如果缩进显示查看数据效果会很好,这里使用json的包会有很多操作 import json date = {u'versions': [{u'status': u'CURRENT', u'id': u'v2.3', u'links': [{u'href': u'http://controller:9292/v2/', u'rel': u'self'}]}, {u'status': u'SUPPORTED', u'id': u'v2.2'

C#实现集合转换成json格式数据的方法

本文实例讲述了C#实现集合转换成json格式数据的方法.分享给大家供大家参考,具体如下: /// <summary> /// dataTable转换成Json格式 /// </summary> /// <param name="dt"></param> /// <returns></returns> public static string ToJson(DataTable dt) { if (dt != null

C#实现将类的内容写成JSON格式字符串的方法

本文实例讲述了C#实现将类的内容写成JSON格式字符串的方法.分享给大家供大家参考.具体如下: 本例中建立了Person类,赋值后将类中内容写入到字符串中 运行本代码需要添加引用动态库Newtonsoft.Json 程序代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; //需要引用 Newtonsoft.Js

Android编程解析Json格式数据的方法

本文实例讲述了Android编程解析Json格式数据的方法.分享给大家供大家参考,具体如下: package com.practice.json; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import android.app.Activity; import android.os.Bundle; import android.util.Log; public cla

JavaScript解析JSON格式数据的方法示例

本文实例讲述了JavaScript解析JSON格式数据的方法.分享给大家供大家参考,具体如下: 1.使用JavaScript提供的eval()函数 function JsonText1() { var strJSON = "{'Name':'Kevin','Age':'23'}"; //得到的JSON var obj = eval("(" + strJSON + ")"); //转换后的JSON对象 alert(obj.Name); } 2.使用