前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >go语言学习-数组, slice和map 原

go语言学习-数组, slice和map 原

作者头像
solate
发布2019-07-19 18:38:46
4190
发布2019-07-19 18:38:46
举报
文章被收录于专栏:solate 杂货铺

数据结构 数组 slice map

数组为值传递,当赋值给另外一个变量的时候是将值全部都copy,存一个副本,改变副本的值不会改变原有数组。slice为指针传递,改变值会改变原有slice中存的值

数组

数组定义后长度固定

长度获取: len() 函数

所有的值类型变量在赋值,和作为参数传递时都将产生一次复制动作。

go数组是一个值类型,在函数体中无法修改传入的数组的内容,因为函数内操作的只是所 传入数组的一个副本

在数组中类型和长度共同确定一个数组类型,也就是说[5]int 和[10]int 不是一个类型

创建

  1. 声明: var myArray [5]int
  2. 推导: myArray := [3]int{1, 2, 3}
  3. 省略方式: myArray := [...]int{1,2,3}

slice 切片

创建

  1. 从数组上切一片, slice1 = myArray[:5]
  2. 使用make, slice2 := make([]int, 5)
  3. 默认方式: slice3 := []int{1, 2, 3, 4, 5}, 事实上回创建一个匿名数组,不需要我们管
  4. 从切片上切一片: slice4 = slice1[:7] // 可以超过原有len(),但是不能超过cap(),多出来的部分补上零值(0)

添加 append

  1. 使用 append 添加元素:
代码语言:javascript
复制
mySlice2 := []int{8, 9, 10}
// 给mySlice后面添加另一个数组切片
mySlice = append(mySlice, mySlice2...)

// ... 表示散列slice, 不加编译错误.加上省略号相 7 当于把mySlice2包含的所有元素打散后传入

copy

用于将内容从一个数组切片复制到另一个 数组切片。如果加入的两个数组切片不一样大,就会按其中较小的那个数组切片的元素个数进行 复制.

代码语言:javascript
复制
slice1 := []int{1, 2, 3, 4, 5}
slice2 := []int{5, 4, 3}

copy(slice2, slice1) // 只会复制slice1的前3个元素到slice2中
copy(slice1, slice2) // 只会复制slice2的3个元素到slice1的前3个位置

其他操作

SliceTricks

remove

Remove elements in slice

代码语言:javascript
复制
urlList := []string{"test", "abc", "def", "ghi"}
remove := []string{"abc", "test"}

for i := 0; i < len(urlList); i++ {
    url := urlList[i]
    for _, rem := range remove {
        if url == rem {
            urlList = append(urlList[:i], urlList[i+1:]...)
            i-- // Important: decrease index
            break
        }
    }
}

fmt.Println(urlList)

or

代码语言:javascript
复制
package main

import "fmt"

func main() {
    urlList := []string{"test", "abc", "def", "ghi"}
    remove := []string{"abc", "test"}

    new_list := make([]string, 0)

    my_map := make(map[string]bool, 0)
    for _, ele := range remove {
        my_map[ele] = true
    }

    for _, ele := range urlList {
        _, is_in_map := my_map[ele]
        if is_in_map {
            fmt.Printf("Have to ignore : %s\n", ele)
        } else {
            new_list = append(new_list, ele)    
        }
    }

    fmt.Println(new_list)

}

map

创建

  1. 声明并不会创建map : var myMap map[string]string nil, 不能赋值
  2. 使用make赋值: myMap = make(map[string]string), 可以指定容量 myMap = make(map[string]string, 100)
  3. 推导: myMap := map[string]string{"1234": "Jack"}

添加

map[key] = value , 直接赋值

删除

delete(myMap, key), 如果key不存在,则什么都不会发生,没副作用,但是如果map为nil,则panic

是否存在

value, ok := map[key] ,ok 为true 找到

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 数据结构 数组 slice map
    • 数组
      • 创建
    • slice 切片
      • 创建
      • 添加 append
      • copy
    • 其他操作
      • remove
    • map
      • 创建
      • 添加
      • 删除
      • 是否存在
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档