golang的map类型是一个比较特殊的类型,不同于int, string, byte这样的基本类型,在经过一番探究之后得出了一些结论:
1、golang的map类型虽然是内置类型,但和基本类型有很大区别,更像是一个指针,因为他有着跟指针一样行为。
下面这段代码的第三次输出时,尝试了用通过arr[1].c["aaa"] = "lalala",这种方式去修改这个map元素,发现arr[0]同时被改变了。这也就说明了arr里面保存的其实是指向一块内存的指针,所以在通过arr[1].c["aaa"] = "lalala"这种方式修改时,arr[0]也同时被修改了。
2、修改arr[1]的时候,同时也修改了int类型的a,但是arr[0]却没有同时被更改,这可以说明两点。
a.  append函数在追加arr数组时,传递给append函数的参数是一个实体,而不是指针或引用
b.  在拷贝Node实体时,int类型的a是被深拷贝的,也就是拷贝了 一个实体,而map只是被拷贝了指针(扯不清楚,就是那个意思)
 
综合以上两个结论可以得出:我们其实可以把map看成是一个指针对象,这样就可以防止不正确的使用方式带来的隐患了
 
// 定义了一个结构体
type Node struct {
    a int
    c map[string]string
}
 
// 定义了一个Node类型的数组
arr := make([]Node, 0)
x := Node{}
x.a = 1
x.c = make(map[string]string, 0)
x.c["aaa"] = "bbb"
arr = append(arr, x)  //将一个Node对象追加到 arr 数组
//-------第一次输出--------//
fmt.Println(arr)
x.a = 3  // 将同一个Node对象修改之后再次追加
x.c["aaa"] = "ccc"
x.c["dlskjfd"] = "dlkfsd"
arr = append(arr, x)
//-------第二次输出--------//
fmt.Println(arr)
arr[1].a = 34
arr[1].c["aaa"] = "lalalala"
//-------第三次输出--------//
fmt.Println(arr)
 
运行这段代码的输出如下:
[{1 map[aaa:bbb]}]
[{1 map[aaa:ccc dlskjfd:dlkfsd]} {3 map[aaa:ccc dlskjfd:dlkfsd]}]
[{1 map[aaa:lalalala dlskjfd:dlkfsd]} {34 map[aaa:lalalala dlskjfd:dlkfsd]}]

golang的内置类型map的一些事的更多相关文章

  1. golang内置类型和内置函数

    golang内置类型和内置函数是不需要引入包直接可用的 golang内置类型: 数值类型 string int,unint float32,float64 bool array 有长度的 comple ...

  2. dart系列之:dart语言中的内置类型

    目录 简介 Null 数字 字符串 布尔值 列表 set和map 简介 和所有的编程语言一样,dart有他内置的语言类型,这些内置类型都继承自Object,当然这些内置类型是dart语言的基础,只有掌 ...

  3. JavaScript备忘录(1)——内置类型

    JavaScript有一些内置类型,还有很多常用的内置的方法,本文稍作总结,以备查阅. 值类型 我的理解,值类型是分配在栈上的,而引用类型(当然也包括引用类型内部的值类型)是分配在堆上的.值类型是不可 ...

  4. 理解Golang哈希表Map的元素

    目录 概述 哈希函数 冲突解决 初始化 结构体 字面量 运行时 操作 访问 写入 扩容 删除 总结 在上一节中我们介绍了 数组和切片的实现原理,这一节会介绍 Golang 中的另一个集合元素 - 哈希 ...

  5. Dart基础学习02--变量及内置类型

    Dart基础学习02--变量及内置类型 Dart中的变量 首先看一个变量的定义和赋值 var name = 'Bob'; 在Dart中变量名都是引用,这里的name就是一个指向值为Bob的字符串的引用 ...

  6. Python——内置类型

    Python定义了丰富的数据类型,包括: 数值型:int, float, complex 序列:(iterable) str, unicode, tuple, list, bytearray, buf ...

  7. C++内置类型对象之间的转换

    C++定义了一组内置类型对象之间的标准转换,在必要时它们被编译器隐式地应用到对象上. 隐式类型转换发生在下列这些典型情况下. 1. 在混合类型的算数表达式中 规则:在这种情况下最宽的数据类型成为目标转 ...

  8. C++ - 内置类型的最大值宏定义

    内置类型的最大值宏定义 本文地址: http://blog.csdn.net/caroline_wendy/article/details/24311895 C++中, 常常会使用, 某些类型的最大值 ...

  9. C++基本内置类型

    C++基本内置类型 基本内置类型包括算术类型和空类型. 算术类型 算术类型包括整型和浮点型. 类型 含义 最小尺寸 bool 布尔型 - char 字符型 8 bit wchar_t 宽字符型 16 ...

随机推荐

  1. ESLint规则配置说明

    "no-alert": 0,//禁止使用alert confirm prompt "no-array-constructor": 2,//禁止使用数组构造器 & ...

  2. js实现一个简单计算器

    代码如下,仅支持webkit <!DOCTYPE html><html> <head> <meta charset="UTF-8"> ...

  3. Django基础之wsgi

    Django 一 什么是web框架 框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以帮你快速开发特定的系统,简单地说,就是你用别人搭建好的舞台来做表演 ...

  4. CentOS 7.0系统安装配置步骤详解

    CentOS 7.0系统是一个很新的版本哦,很多朋友都不知道CentOS 7.0系统是怎么去安装配置的哦,因为centos7.0与以前版本是有很大的改进哦. 说明: 截止目前CentOS 7.x最新版 ...

  5. [LeetCode] N-Queens N皇后问题

    The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens ...

  6. eclipse直接访问数据库

    本文转载至百度经验 http://jingyan.baidu.com/article/a501d80cea3ed4ec630f5e2f.html 以oracle 11g 数据库为例

  7. FragmentTabHost简单保存状态的方法

    private View rootView;@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container ...

  8. [转]ExtJs基础--Html DOM、Ext Element及Component三者之间的区别

    要学习及应用好Ext框架,必须需要理解Html DOM.Ext Element及Component三者之间的区别. 每一个HTML页面都有一个层次分明的DOM树模型,浏览器中的所有内容都有相应的DOM ...

  9. echarts-在现实标题中显示百分比

    如图:需要在标题显示所占百分比 使用方式:途中标记部分 series : [{ name: '类型', type: 'pie', radius : '55%', center: ['50%', '60 ...

  10. windows常用快捷键

    windows常用快捷键 Fn+F1:Windows的支持和帮助 =Windows 徽标+F1 Fn+F2:重命名对象 Fn+F3:查找所有文件 Fn+F4:选择“转到不同的文件夹”框并沿框中的项向下 ...