Go起步:6、复合类型3--字典(map)及其他
2016-08-31 21:39
513 查看
继数组array、切片slice和指针(pointer)、结构体(struct)之后,继续Go的复合类型。
先看一个例子:
这个简单的例子基本上包含了map的基本用法,包括声明,赋值,取值等。
单是声明map变量如果不初始化map的话,那么就会创建一个 nil map,默认值是 nil。nil map不能用来存放键值对。
初始化的方法也有两种,可以直接初始化或者使用Go语言内置的函数make()来创建一个新map,这个和切片基本一样。
这样就给map类型的变量map2的key值为1的kery赋值为s。
通过上面的程序执行结果可以看出,如果key值已存在会更新key对应的值;若key不存在,则会早map里增加key值,并赋值。
若key在map中,ok 为true;否则,ok 为false 。
若key不存在,那么vlaue 是该map元素类型的默认值。即如果map的value对应类型的默认值。
同样的,当从map中读取某个不存在的键时,结果是map的元素类型的默认值。
这样判断是否成功找到特定的键,不需要检查取到的值是否为nil,只需查看第二个返回值ok,代码表达更简洁。
这样就把myMap中键为“1”的键值对删除。如果“1”这个键不存在,那么这个调 用将什么都不发生。
在并发编程中,为实现对共享变量的正确访问需要精确的控制,这在多数环境下都很困难。 Go语言另辟蹊径,它将共享的值通过信道传递,实际上,多个独立执行的线程从不会主动共享。 在任意给定的时间点,只有一个Go程能够访问该值。数据竞争从设计上就被杜绝了。 为了提倡这种思考方式,Go将它简化为一句口号:
不要通过共享内存来通信,而应通过通信来共享内存。
Go程的概念:Go程在多线程操作系统上可实现多路复用,因此若一个线程阻塞,比如说等待I/O, 那么其它的线程就会运行。Go程的设计隐藏了线程创建和管理的诸多复杂性。
在函数或方法前添加 go 关键字能够在新的Go程中调用它。当调用完成后, 该Go程也会安静地退出。有点像Unix Shell中的 & 符号,它能让命令在后台运行。
Go中的接口为指定对象的行为提供了一种方法:如果某样东西可以完成这个, 那么它就可以用在这里。
若某种现有的类型仅实现了一个接口,且除此之外并无可导出的方法,则该类型本身就无需导出。 仅导出该接口能让我们更专注于其行为而非实现,其它属性不同的实现则能镜像该原始类型的行为。
Go语言的多值返回特性, 使得它在返回常规的值时,还能轻松地返回详细的错误描述。按照约定,错误的类型通常为 error,这是一个内建的简单接口。
可以轻松实现这个接口以实现这样不仅能看见错误, 还能提供一些上下文。
字典(map)
Go的字典类型类似于Java的Map,python的Dictionary,都是一种无序的键值对的集合。可以通过键(key)来检索数据。先看一个例子:
package main import "fmt" func main() { map1 := map[string]string{"1": "s"} fmt.Println("map1:", map1) map1["1"] = "www" fmt.Println("map1:", map1) var map2 map[string]string map2 = make(map[string]string) fmt.Println("map2:", map2) map2["1"] = "s" fmt.Println("map2:", map2) str, ok := map1["1"] if ok { fmt.Println("str:", str) } }
这个简单的例子基本上包含了map的基本用法,包括声明,赋值,取值等。
声明,初始化
单是map的声明和其他类型的变量声明类似。var map_variable map[keytype]valuetype //声明 一个map类型的变量,key和value的类型是string var map2 map[string]string
单是声明map变量如果不初始化map的话,那么就会创建一个 nil map,默认值是 nil。nil map不能用来存放键值对。
package main import "fmt" func main() { var myMap map[string]string fmt.Println(myMap == nil) myMap["1"] = "11" fmt.Println("myMap:", myMap) }
初始化的方法也有两种,可以直接初始化或者使用Go语言内置的函数make()来创建一个新map,这个和切片基本一样。
//定义是初始化赋值 map1 := map[string]string{"1": "s"} //使用make函数初始化 var map2 map[string]string map2 = make(map[string]string)
元素赋值和修改
赋值过程非常简单明了,就是将键和值用下面的方式对应起来即可:map2["1"] = "s"
这样就给map类型的变量map2的key值为1的kery赋值为s。
通过上面的程序执行结果可以看出,如果key值已存在会更新key对应的值;若key不存在,则会早map里增加key值,并赋值。
元素查找
Go中,查找map中是否存在某个值是通过双赋值检测某个键是否存在。vlaue, ok := map[key]
若key在map中,ok 为true;否则,ok 为false 。
若key不存在,那么vlaue 是该map元素类型的默认值。即如果map的value对应类型的默认值。
同样的,当从map中读取某个不存在的键时,结果是map的元素类型的默认值。
这样判断是否成功找到特定的键,不需要检查取到的值是否为nil,只需查看第二个返回值ok,代码表达更简洁。
元素删除
对于map元素的删除,Go提供了一个内置函数delete()。delete(myMap, "1")
这样就把myMap中键为“1”的键值对删除。如果“1”这个键不存在,那么这个调 用将什么都不发生。
package main import "fmt" func main() { myMap := map[string]string{"1": "a", "2": "b"} fmt.Println("myMap:", myMap) delete(myMap, "1") fmt.Println("myMap:", myMap) delete(myMap, "3") fmt.Println("myMap:", myMap) }
其他类型
一下类型只做概念性介绍,因为涉及的东西比较深入,目前我也是初学,体会不出太深刻的东西。通道(chan)
通道是连接并发够程的管道。并发编程是个很大的论题,因此这里只是大致说一点,希望可以以此看出Go在并发编程里的优势。详细的内容,需要在以后使用中慢慢了解。在并发编程中,为实现对共享变量的正确访问需要精确的控制,这在多数环境下都很困难。 Go语言另辟蹊径,它将共享的值通过信道传递,实际上,多个独立执行的线程从不会主动共享。 在任意给定的时间点,只有一个Go程能够访问该值。数据竞争从设计上就被杜绝了。 为了提倡这种思考方式,Go将它简化为一句口号:
不要通过共享内存来通信,而应通过通信来共享内存。
Go程的概念:Go程在多线程操作系统上可实现多路复用,因此若一个线程阻塞,比如说等待I/O, 那么其它的线程就会运行。Go程的设计隐藏了线程创建和管理的诸多复杂性。
在函数或方法前添加 go 关键字能够在新的Go程中调用它。当调用完成后, 该Go程也会安静地退出。有点像Unix Shell中的 & 符号,它能让命令在后台运行。
接口(interface)
对于接口的概念Go应该也其他支持接口的编程语言差别不大。Go中的接口为指定对象的行为提供了一种方法:如果某样东西可以完成这个, 那么它就可以用在这里。
若某种现有的类型仅实现了一个接口,且除此之外并无可导出的方法,则该类型本身就无需导出。 仅导出该接口能让我们更专注于其行为而非实现,其它属性不同的实现则能镜像该原始类型的行为。
错误类型(error)
错误处理应该是任何编程语言都该涉及好的功能,Go也不例外。Go语言的多值返回特性, 使得它在返回常规的值时,还能轻松地返回详细的错误描述。按照约定,错误的类型通常为 error,这是一个内建的简单接口。
type error interface { Error() string }
可以轻松实现这个接口以实现这样不仅能看见错误, 还能提供一些上下文。
相关文章推荐
- Go起步:5、复合类型2--指针(pointer)、结构体(struct)
- Go起步:4、复合类型1--数组array和切片slice
- [Go] 复合类型(数组、切片、字典、结构体)变量的 初始化 及 注意事项
- 【Go入门教程4】变量(var),常量(const),内置基础类型(Boolean、数值 byte,int,rune、字符串、错误类型),分组,iota枚举,array(数值),slice(切片),map(字典),make/new操作,零值
- Go基础编程:复合类型—map
- go - 复合类型 array, slice, map
- go - 复合类型 array, slice, map
- 【WebService】CXF处理javaBean等复合类型以及Map等复杂类型的数据
- 10.当形参,返回值类型不是JavaBean式的复合类,Map时,CXF无法处理:客户端执行wsdl2java
- 11.当形参,返回值类型不是JavaBean式的复合类,Map时,CXF无法处理:客户端主类
- 6.当形参,返回值类型不是JavaBean式的复合类,Map时,CXF无法处理:服务端发布
- Go语言学习笔记(4)复合类型
- GO的MAP字典简单用法示例
- Go中map数据类型3点小知识
- 5.当形参,返回值类型不是JavaBean式的复合类,Map时,CXF无法处理:服务端domain
- go语言 类型:基础类型和复合类型
- 字典里的value值的类型是是object的类型,不能想当然的去调用其他方法。
- Go语言map字典用法实例分析
- 9.当形参,返回值类型不是JavaBean式的复合类,Map时,CXF无法处理:服务端发布成功
- Go语言中的复合类型详细介绍