go 语言三 切片,map

 GO语言:

  切片

  map

 

3.1

切片类型

func main() {
    //切片定义的第一种方式是由数组切出来的 a[2:6] 数组名[起始索引:终止索引]
    //fmt.Println("wooo")
    //var a [8] int = [8]int{1,2,3,4,5,6,7,8}
    //    //是对底层数组的引用
    //var b []int =a[2:6]    //根据索引切片  []int 表示切片
    //fmt.Println(b)  //[3 4 5 6]  切片
    //a[2]=30    // 根据索引改值
    //fmt.Println(a)   // [1 2 30 4 5 6 7 8]  底层数组发生了改变
    //fmt.Println(b)    //[30 4 5 6] 切片中的值也发生了改变
    //
    //    //切片本身不存储数据,只是对底层数据的一个引用,
    //    //底层数组的修改会影响切片,切片的修改也会影响底层数组的修改
    //a[1]=20
    //fmt.Println(b)//[30 4 5 6] 切片的修改在没指定的范围内的数组的值不会影响切片中的值

    //更多用法
    //var a [8] int = [8]int{1,2,3,4,5,6,7,8}
    //b:=a[:]   //从头切到尾  [1 2 3 4 5 6 7 8]
    //b:=a[3:]   //从索引为3的开始切到最后,[4 5 6 7 8]
    //b :=a[:4]   // 从头切到索引为4的,不包括索引为4的值 [1 2 3 4] 顾头不顾尾
    ////没有歩长这个东西
    //fmt.Println(b)

    //第二种定义的方式,直接定义
        //切片空值是nil类型
        //所有的引用类型的空值都是nil类型
        //python中的对象都是引用类型,所以空值都可以为none
    //var a[]int  //在这里只是 定义了,没有初始化,如果再给他增值,例如a[0]=10就会报错,只有初始化后才算引用了,才能赋值
    //if a==nil{
    //    fmt.Println("我是空的")
    //}
    //fmt.Println(a)  //[]

        //直接定义,并进行初始化,
    //var a[]int = make([]int,2,3)
        //这样一定创建了一个底层数组,这个切片是依赖于这个底层数组
        //初始化:通过make函数,第一个参数为类型,第二个参数为切片长度,第三个参数为底层数组的长度,也就是切片的容量
    //fmt.Println(a) //[0 0]
        //切片的长度和容量,容量表示能放多少值,
        //切片的容量不是底层数组的大小,因为前面开头已经无法追加值
        //只有从第0个位置切得时候才是底层数组大小
    //var a [8] int = [8]int{1,2,3,4,5,6,7,8}
    //var b []int =a[2:6]
    //fmt.Println(len(b))    //长度为4
    //fmt.Println(cap(b))        //容量为6

    //var a[]int = make([]int,2,3)
    //fmt.Println(a)
    //fmt.Println(len(a))   长度为2
    //fmt.Println(cap(a))    容量为3

    //切片追加值。append内置函数来进行,可以同时增加多个
    //var a [8] int = [8]int{1,2,3,4,5,6,7,8}
    //var b []int =a[2:6]
    //fmt.Println(len(b))
    //fmt.Println(cap(b))
        //append第一个参数要追加的切片,第二个为追加的值,第二个人参数类型必须与追加的切片类型一样
    //b=append(b,555) //让b重新指向,此时的地址和原地址就不一样了
    //fmt.Println(b)   //[3 4 5 6 555]
    //fmt.Println(len(b))  //长度为5
    //fmt.Println(cap(b))        //容量为6
    //fmt.Println(a) //[1 2 3 4 5 6 555 8]
        //如果再追加两个,会是什么情况?数组是不能扩容的
    //b=append(b,555,666,777)
    //fmt.Println(b)  //[3 4 5 6 555 666 777]
    //fmt.Println(len(b)) //长度为7
    //fmt.Println(cap(b))    //容量为12
    //当切片追加到该数组的最大长度时,就不会依附该数组,而是重新建了一个数组,把原来数组的值copy过来,
    //把它的大小变为原来切片容量的两倍,如果继续追加,追加到最后,再申请当前数组容量的两倍也就是24
    //所以一旦超出底层数组的容量范围,你再取就不会影响到底层数组
    //var a[]int = make([]int,2,3)  make创建出来的你是看不到底层数组的

    //切片修改值:
    //var a[]int = make([]int,2,3)
    //a[0]=999
    //fmt.Println(a)  //[999 0]

    //切片的函数传参
    var b = make([]int,3,4)
    test(b)
    fmt.Println(b)
  
   }
func test(a []int) { a[0]
=999 fmt.Println(a) }

切片的数据结构

func main() {
  
//切片的数据结构
type sclice struct {
length int
Capacity int
ZerothElement *byte //指针,
}
//多维切片初始化
var a [][]string=[][]string{{"1","2"},{"3","4"}}
fmt.Println(a) // [[1 2] [3 4]]
fmt.Println(len(a))
fmt.Println(cap(a))
    //copy函数。底层优化
var a = make([]int,3,30000)
a[1]=999
a[2]=888
fmt.Println(a)

var b =make([]int,3,3)
fmt.Println(b)
copy(b,a) //copy(新的,原来的) 短的就要短的,
fmt.Println(b)
}}
package main

import "fmt"

func main() {
    //循环多维切片
    pls:=[][]string{
        {"c","c++"},
        {"java","js"},
        {"go"},
    }
    fmt.Println(pls)
    for _,v:=range pls {
        for _,l:=range v {
            fmt.Println(l)
        }
    }
}

map

map的定义与空值


    map是go中将值value与键key关联的内置类型,通过响应的键可以获取到值,
    var a map[键值类型]value值类型
    map的空值也是nil类型
    var a map[int]string   //只定义,没有赋值
    fmt.Println(a)    //map[]
    if a== nil{
        fmt.Println("xxx")   //得到结论,map也是一个引用类型,
    }
map的初始化与赋值

    map定义后必须初始化,map的初始化
   var a map[int]string
=make(map[int]string) a[1]="中国" a[2]="888" //增加值 fmt.Println(a) fmt.Println(a[1]) //取值 //取一个不存在的key的值,不报错,此时是空字符串,因为value是string类型,默认就是空字符串 fmt.Println(a[9]) var b map[int]int=make(map[int]int) fmt.Println(b[9]) //此时int空值是0
判断map的key是否存在


    var a map[int]string=make(map[int]string)
    a[1]="中国"
    a[2]="888"    //增加值
    fmt.Println(a)
    fmt.Println(a[1])  //取值

    //判断该key是否存在
    if _,ok:=a[9];ok{    //定义变量 _,ok:=a[1]  条件为ok (true或者false) 中括号中为key
        fmt.Println("该key存在")
    }else {
        fmt.Println("该值不存在")
    }
    v,ok:=a[1]     //如果取得值存在,ok就是true,不存在就为false
    fmt.Println(v)
    fmt.Println(ok)  //ok是个形参,可以随便命名
第二种定义方式和map的增删改取
    
//定义和初始化的第二中方式
    var a map[int]string=map[int]string{1:"kkk",2:"eee"}
    fmt.Println(a)  //map[1:kkk 2:eee]
    //简写方式一
    var c =map[int]string{5:"rrr",6:"ggg"}
    fmt.Println(c)  //map[5:rrr 6:ggg]zzz
    //可简写
    b:=map[int]string{3:"lkk",4:"yyy"}   //最常用
    fmt.Println(b) //map[3:lkk 4:yyy]
    b[8]="mmm"   //增加值
    b[4]="ooo"
    fmt.Println(b[3])   // lkk 取值
    fmt.Println(b[4])  //ooo 改值,有则更改,无则增加
    fmt.Println(b)   //map[3:lkk 4:ooo 8:mmm]
    //字典删除元素
    delete(b,3)   //字典删除没有返回值,只要有该元素一定删除,如果无key,也不会报错
    fmt.Println(b)

补充

    //切片删除元素,
    var d = []int{1,2,3,4,5,6}
    e:=d[0:3]  //切片删除元素只能通过这种方式进行
    d=append(d[0:3],d[2:]...)
    fmt.Println(e)   //[1 2 3]
    fmt.Println(d)   //[1 2 3 3 4 5 6]

map的长度和引用类型

func main() {
    //map的长度len函数
    b:=map[int]string{3:"lkk",4:"yyy"}
    fmt.Println(len(b))  //2

    //map是引用类型
    var a=map[int]string{1:"www",2:"rrr"}
    test(a)
    fmt.Println("=====",a)
}
func test(a map[int]string)  {
    a[1]="666"
    fmt.Println(a)
}

/*结果为
2
map[1:666 2:rrr]
===== map[1:666 2:rrr]
*/

map的相等性

    //map的相等型,只有map为空的时,即为nil时,才能用==,其他都不能用==
    map1 :=map[string]string{
        "爱好":"篮球",
        "特长":"长跑",
    }
    map2:=map1   //直接赋值
    fmt.Println(map2) //map[爱好:篮球 特长:长跑]
    //错误写法,不能使用==
    if map2 == map1{  
        fmt.Println("不能使用等号")
    }

map的循环取出元素

    //map循环取出元素,用range,
    var c=map[int]string{1:"www",2:"rrr"}
    for k,v:=range c{
        fmt.Println(k) //k 是key 1或2
        fmt.Println(v) //v 是value www和rrr
        //map是本身是无序的
    }

猜你喜欢

转载自www.cnblogs.com/Fzhiyuan/p/12025167.html