go 指针(interface{},map)

func testAddDataToResult() {
	var a map[string]interface{}
	Println(a, &a)
	addDataToResult(a, "aa", "bb")
	Println(a, &a)
}
func addDataToResult(result map[string]interface{}, key string, val interface{}) {
	if result == nil {
		Println("nil result:", result, &result)
		result = map[string]interface{}{key: val}
		//result[key] = val
		Println("nil result:", result, &result)
		return
	}
	result[key] = val
	Println("result:", result, &result)
}
结果

map[] &map[]nil result: map[] &map[]nil result: map[aa:bb] &map[aa:bb]map[] &map[]
	var a map[string]interface{}
	Println(a, &a)
	addDataToResult(a, "aa", "bb")
	Println(a, &a)
}
func addDataToResult(result map[string]interface{}, key string, val interface{}) {
	if result == nil {
		Println("nil result:", result, &result)
		//result = map[string]interface{}{key: val}
		result[key] = val
		Println("nil result:", result, &result)
		return
	}
	result[key] = val
	Println("result:", result, &result)
}
结果
map[] &map[]
nil result: map[] &map[]
panic: assignment to entry in nil map

  

func testAddDataToResult() {
	var a = map[string]interface{}{}
	Println(a, &a)
	addDataToResult(a, "aa", "bb")
	Println(a, &a)
}
func addDataToResult(result map[string]interface{}, key string, val interface{}) {
	if result == nil {
		Println("nil result:", result, &result)
		//result = map[string]interface{}{key: val}
		result[key] = val
		Println("nil result:", result, &result)
		return
	}
	result[key] = val
	Println("result:", result, &result)
}
结果
map[] &map[]
result: map[aa:bb] &map[aa:bb]
map[aa:bb] &map[aa:bb]

  

第一个测试将nil值的map[string]interface{}传到函数,修改后原函数里的值没改变

第二个测试将nil值的map[string]interface{}传入到函数,直接result[key]=val,panic: assignment to entry in nil map

第三个测试将不为nil值的map[string]interface{}传入到函数,直接result[key]=val,原函数的map被改变了

func testAddDataToResult() {
	var a interface{}
	Println(a, &a)
	addDataToResult(a, "aa", "bb")
	Println(a, &a)
}
func addDataToResult(result interface{}, key string, val interface{}) {
	if result == nil {
		Println("nil result:", result, &result)
		result = map[string]interface{}{key: val}
		Println("nil result:", result, &result)
		return
	}
	result.(map[string]interface{})[key] = val
	Println("result:", result, &result)
}
结果
<nil> 0xc42000e280
nil result: <nil> 0xc42000e290
nil result: map[aa:bb] 0xc42000e290
<nil> 0xc42000e280

  

时间: 2024-10-16 20:23:30

go 指针(interface{},map)的相关文章

Java-list,set,map的区别

jdk中api的定义 Collection ├----List │ ├----LinkedList │ ├----ArrayList │ └----Vector │ └----Stack └----Set Map ├----Hashtable ├----HashMap ├ ├----LinkedHashMap └----WeakHashMap Set,List,Map的区别 java集合的主要分为三种类型: Set(集) List(列表) Map(映射) 要深入理解集合首先要了解下我们熟悉的数组

Java集合中的Map接口

jdk1.8.0_144 Map是Java三种集合中的一种位于java.util包中,Map作为一个接口存在定义了这种数据结构的一些基础操作,它的最终实现类有很多:HashMap.TreeMap.SortedMap等等,这些最终的子类大多有一个共同的抽象父类AbstractMap.在AbstractMap中实现了大多数Map实现公共的方法.本文介绍Map接口定义了哪些方法,同时JDK8又新增了哪些. Map翻译为“映射”,它如同字典一样,给定一个key值,就能直接定位value值,它的存储结构为

go语言之行--接口(interface)、反射(reflect)详解

一.interface简介 interface(接口)是golang最重要的特性之一,Interface类型可以定义一组方法,但是这些不需要实现.并且interface不能包含任何变量. 简单的说: interface是方法的集合 interface是一种类型,并且是指针类型 interface的更重要的作用在于多态实现 interface定义 type 接口名称 interface { method1 (参数列表) 返回值列表 method2 (参数列表) 返回值列表 ... } interf

深入Java源码解析容器类List、Set、Map

1 常用容器继承关系图先上一张网上的继承关系图个人觉得有些地方不是很准确,比如Iterator不是容器,只是一个操作遍历集合的方法接口,所以不应该放在里面.并且Map不应该继承自Collection.所以自己整理了一个常用继承关系图如下如上图所示,接下去会自顶向下解释重要的接口和实现类.2 Collection和Map在Java容器中一共定义了2种集合, 顶层接口分别是Collection和Map.但是这2个接口都不能直接被实现使用,分别代表两种不同类型的容器.简单来看,Collection代表

goalng nil interface浅析

0.遇到一个问题 代码 func GetMap (i interface{})(map[string]interface{}){ if i == nil { //false ??? i = make(map[string]interface) fmt.Println("xxxxx") } } var testMap map[string]interface{} getMap := GetMap(testMap) getMap["add"] = "add&q

纯数据结构Java实现(5/11)(Set&amp;Map)

纯数据结构Java实现(5/11)(Set&Map) Set 和 Map 都是抽象或者高级数据结构,至于底层是采用树还是散列则根据需要而定. 可以细想一下 TreeMap/HashMap, TreeSet/HashSet 的区别即可 只定义操作接口(操作一致),不管具体的实现,所以即便底层是 BST 亦可(只是效率不高) (我还是直说了吧,如果不要求有序,尽量用 Hash 实现的吧) 集合(Set) 二分搜索树不存放重复元素,所以 BST 就是一个很好的用于实现集合的底层结构 常见应用 其实主要

java Iterator Iterable Collection AbstractCollection Map关系

java.lang Interface Iterable<T>  实现该接口就可以使用for-each循环. java.util Interface Iterator<E>  用于遍历Collection,有hasNext(),next(),remove()方法. java.util Interface Collection<E>  整个Collection体系中的根接口,父类接口是Iterable.可以生成Iterator. java.util Interface M

ArrayList、LinkedList、 Vector、Map 用法比较

ArrayList和Vector是采用数组方式存储数据,此数组元素总数大于实际存储的数据个数以便增加和插入元素,二者都允许直接序号索引元素,但是插入数据要移动数组元素等内存操作,所以它们索引数据快.插入数据慢. ArrayList数组存储方式: [java] view plaincopyprint? private transient Object[] elementData; public ArrayList(int initialCapacity) { super(); if (initia

Map接口源码解析

Map 每个数据项是key-value数据对 key不能重复 接口内代码比较少,都是基本操作 package java.util; public interface Map<K,V> { // Query Operations int size(); boolean isEmpty(); boolean containsKey(Object key); boolean containsValue(Object value); V get(Object key); // Modification