goland map介绍

map介绍

map 是key-value 数据结构,也叫字段或者关联数组,类似python中的字典。

map的基本语法:

定义map的两种方式:

  var map_variable map[keyType]valueType 

  map_variable := make(map[keyType]valueType)

key 的类型,可以是bool、数字、string、指针、channel;一般是int、string

value的类型,基本与key的类似,但是有时候会出现(字典)嵌套,此时key会使用map、struct类型。

map声明举例

map声明举例,声明不会分配内存,初始化需要使用make进行,分配内存后才能赋值使用。

var ex map[string]int                   {"test":1}
var ey map[string]string                {"test":"test"}
var ez map[int]string                   {1:"test",2:"test2"}
var ev map[string]map[string]string     {"test":{"map":"deepin"}}

声明后不能直接使用
func main() {
  var ex map[string]int
  ex["data"]=1 //此时会直接报错, 

  fmt.Prinrln(ex)
}

必须make进行分配内存

func main() {
  var ex map[string]int
  // 使用前需要先make进行分配内存,然后再使用 
  ex = make(map[string]int) //make (type,size int) Type make时可以指定容量,类型。可以通过len,cap进行查看长度、容量

  ex["data"]=1 //没问题
  ex["data"]=2  // key相同会直接进行覆盖
  ex["data2"]=1 // key不同,值相同没毛病
  fmt.Prinrln(ex)
}


// key是不可以重复的,value是可以重复的

map的一般使用

//方式一 先声明再分配空间
var eg map[string]string
eg = make(map[string]string)
eg["data"] = "test"
//方式二 make 声明+分配空间  使用最多的方式
var eg = make(map[string]string)
eg["data"]="test"
//方式三 声明直接赋值
var eg map[string]string = map[string]string{"data":"test"}
下面这种和上面一样
eg := map[string]string{
        "data":"test",
          "data2":"test2", //此处时的逗号一定要有
}

基础使用之嵌套map(python中的字典)

// 定义2个人,并且这2个人具有性别、年龄
func main(){
 var person map[string]map[string]string
 person["bill"] = make(map[string]string)
 person["bill"]["age"] = "12" //定义的是string类型,所以12必须用引号
 person["bill"]["sex"] = "boy"

 person["tom"] = make(map[string]string)
 person["tom"]["age"] = "16"
 person["tom"]["sex"] = "girl"
//查询、取出操作
 fmt.Println(person["tom"]) //打印tom所有信息
 fmt.Println(person["tom"]["age"]) //打印tom年龄
}

map的增删改查(crud)

//其中增、改 方式是一样的,对于key有则改、无则增
var person = make(map[string]string)
person["pOne"] = "Tom" // 增
person["pTow"] = "Bill" // 增
person["pOne"] = "Gerr" //改

删:
delete(map,"key"),如果key存在在删除此数据;如果不存在,delete不进行操作,也不会报错
// 删除person中的pTow的数据
delete(person, "pTow") 

// 需要注意,map的删除中,如果想要删除所有的key,可以遍历,然后进行删除。或者直接将变量make一个新的,让原来的成为垃圾,被gc回收
var person = make(map[string]string) //这样会重新分配一块内存,类似清空所有key

// map查找
val, isExist := person["Pone"] 
// 如果person中存在Pone这个key,则返回为val为value,isExist为True,不存在则val=nil,isExist=false

删除时需要注意 

channel 类型介绍

channel类可以看成一个管道。通过它并发核心单元就可以发送或者接收数据进行通讯,
操作符是箭头 <- (箭头的指向就是数据的流向)
ch := make(chan int) // channel 类型也必须要先创建然后再使用 make(chan int, 100)

ch <- v    // 发送值v到Channel ch中
v := <-ch  // 从Channel ch中接收数据,并将数据赋值给v



func main() {
    go func() {
        time.Sleep(1 * time.Hour)
    }()
    c := make(chan int)
    go func() {
        for i := 0; i < 10; i = i + 1 {
            c <- i
        }
        close(c)
    }()
    for i := range c {
        fmt.Println(i)
    }
    fmt.Println("Finished")
}
range c产生的迭代值为Channel中发送的值,它会一直迭代直到channel被关闭。
上面的例子中如果把close(c)注释掉,程序会一直阻塞在for …… range那一行。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值