Go语言Map数据类型
一、Map
map是一种无序的基本key-value的数据结构,Go语言中的map是引用类型,必须初始化才能使用。
1.1.1、map定义
map[ keytype] valuetype
keytype: 表示键的类型
valuetype: 表示值的类型
map类型的变量默认初始值为nil,需要使用make()来分配内存。
语法如下
make( map[ keytype] valuetype, [ cap] )
其中cap表示map的容量,该参数虽然不是必须的,但是我们应该在初始化map的时候就为其执行一个合适的容量。
1.1.2、map的基本使用
map中的数据都是成对出现的,map的基本使用示例代码如下:
func main ( ) {
scoreMap := make ( map [ string ] int , 8 )
scoreMap[ "张三" ] = 90
scoreMap[ "小明" ] = 100
fmt. Println ( scoreMap)
fmt. Println ( scoreMap[ "小明" ] )
fmt. Printf ( "tyoe of a:%T\n" , scoreMap)
}
map[ 小明:100 张三:90]
100
tyoe of a:map[ string] int
func main ( ) {
userInfo := map [ string ] string {
"username" : "admin" ,
"password" : "admin@123" ,
}
fmt. Println ( userInfo)
fmt. Println ( userInfo[ "username" ] )
fmt. Println ( userInfo[ "password" ] )
}
1.1.3、判断某个键是否存在
Go语言中有个判断map中键是否存在的特俗写法,格式如下:
value, ok := map[ key]
func main ( ) {
userInfo := map [ string ] string {
"username" : "admin" ,
"password" : "admin@123" ,
}
v, ok := userInfo[ "username" ]
if ok {
fmt. Println ( v)
} else {
fmt. Println ( "查无此人" )
}
}
1.1.4、map的遍历
func main ( ) {
scoremap := make ( map [ string ] int )
scoremap[ "张三" ] = 90
scoremap[ "小明" ] = 100
scoremap[ "王五" ] = 60
for k, v := range scoremap {
fmt. Printf ( "key: %s value: %d\n" , k, v)
}
}
func main ( ) {
scoremap := make ( map [ string ] int )
scoremap[ "张三" ] = 90
scoremap[ "小明" ] = 100
scoremap[ "王五" ] = 60
for k := range scoremap {
fmt. Printf ( k)
}
}
注意:遍历map时的元素顺序与添加键值对的顺序毫无关系
1.1.5、使用delete()函数删除键值对
使用delete()内建函数从map中删除一组键值对,delete()函数的格式如下:
delete( map, key)
map: 表示要删除键值对的map
key: 表示要删除的键值对的key
func main ( ) {
scoremap := make ( map [ string ] int )
scoremap[ "张三" ] = 90
scoremap[ "小明" ] = 100
scoremap[ "王五" ] = 60
delete ( scoremap, "小明" )
for k, v := range scoremap {
fmt. Printf ( k, v)
}
}
1.1.6、按照指定顺序遍历map
func main ( ) {
rand. Seed ( time. Now ( ) . UnixNano ( ) )
var scoreMap = make ( map [ string ] int , 200 )
for i := 0 ; i < 100 ; i++ {
key := fmt. Sprintf ( "stu%02d" , i)
value := rand. Intn ( 100 )
scoreMap[ key] = value
}
var keys = make ( [ ] string , 0 , 200 )
for key := range scoreMap {
keys = append ( keys, key)
}
sort. Strings ( keys)
for _ , key := range keys {
fmt. Println ( key, scoreMap[ key] )
}
}
1.1.7、元素为map类型的切片
func main ( ) {
var mapSlice = make ( [ ] map [ string ] string , 3 )
for index, value := range mapSlice {
fmt. Printf ( "index: %d value: %v\n" , index, value)
}
fmt. Println ( "init data" )
mapSlice[ 0 ] = make ( map [ string ] string , 10 )
mapSlice[ 0 ] [ "name" ] = "王五"
mapSlice[ 0 ] [ "password" ] = "123456"
mapSlice[ 0 ] [ "address" ] = "红旗大街"
for index, value := range mapSlice {
fmt. Printf ( "index: %d value: %v\n" , index, value)
}
}
1.1.8、值为切片类型的map
func main ( ) {
var sliceMap = make ( map [ string ] [ ] string , 3 )
fmt. Println ( sliceMap)
fmt. Println ( "init data" )
key := "中国"
value, ok := sliceMap[ key]
if ! ok {
value = make ( [ ] string , 0 , 2 )
}
value = append ( value, "北京" , "上海" )
sliceMap[ key] = value
fmt. Println ( sliceMap)
}