go 数组(array)、切片(slice)、map

数组(array)


go语言中的数组是固定长度的。使用前必须指定数组长度。

go语言中数组是值类型。如果将数组赋值给另一个数组或者方法中参数使用都是复制一份,方法中使用可以使用指针传递地址。

var arrayName = [arraySize]dataType{xxx,xxx,xxx....}  //定义全局数组
var b = [10]int{1,2,3,4,5,6,7,8,9,0}
var b = [10]int{1,2,3,4}                //不足自动补0
arr := [...]int{1,2,3,4,5}
//循环
for _,i := range arr {
  fmt.Println(i)    
}

多维数组

//初始化:
var a = [3][4]int{[4]int{1,2,3},[4]int{1,2,3},[4]int{1,2}} //不足补0
复制代码
    //创建数组声明changdu
    var aaa1 = [5]int{1,2,3,4}
    fmt.Println(aaa1)

    //创建数组不声明长度
    var aaa2 = [...]int{1111,2222,3333,4444,55555,6666}
    fmt.Println(aaa2)

    //创建数组并初始化其中部分
    var aaa3 = [5]string{1:"aaa",2:"bbb"}
    fmt.Println(aaa3)

切片(slice)

切片是数组的一个引用,因此切片是引用类型,切片的长度是可以变化的,因此切片是一个可以动态变化数组

不需要定义长度。和数组在写法上的区别就是不需要指定长度

对比:

v := [2]string{"123","123"}  //数组

v := []string{"123","123"}  //切片

如果多个slice指向同一个底层数组,其中一个改变了数组的值,则其他如果包括这个key的值也会改变

如果slice增加时,导致数组超长,则会再次分配一个新的数组。其他slice可能就会指向这个新的底层数组,这个前一个改变了底层数组的值可能是第一个底层数组,所以第二个slice的key 指向的是第二个底层数组,这点有点混淆。

方法:

append(arr,1,2,3,4,5)  //将1,2,3,4,5追加到arr中

slice := arr[开始:结束]  //指向数组中开始到结束的

copy(arr1,arr2)     //用arr2中的值替代arr1中的值,通过key 对应的代替  copy(arr1[开始:结束],arr2[开始:结束]) 指定替换部位

 string 和 slice

string 底层 是一个 byte 数组,因此 string 也可以进行切片处理
string 和切片 在内存的形式


string 是不可变的, 也就说不能通过 str[0]= ‘z’ 方式来修改字符串
如果需要修改字符串,可以先将 string -> []byte 或者 []rune->修改->重写转成 string

package main

import "fmt"

func main()  {

	str := "hello@guigu"
	slice := str[6:]
	fmt.Println("slice", slice)

    // []byte(str)可以处理中文和数字,但是中文就会出现乱码
	// bt := []byte(str)
	bt := []rune(str) // 这个是按字符来处理的,而不是按一个一个字节处理
	bt[0] = 'H'
	str = string(bt)
	fmt.Println("str", str)	

}

细节,我们转成[]byte后,可以处理英文和数字,但是不能处理中文
原因是[]byte 字节来处理,而一个汉字,是 3 个字节,因此就会出现乱码
解决方法是将 string 转成 []rune 即可,因为 []rune 是按字符处理,兼容汉字

package main

import "fmt"

// 把斐波那契数列放入切片
func fbn(n int) ([]uint64)  {
	slice := make([]uint64, n)
	slice[0] = 1
	slice[1] = 1
	for i := 2; i < n; i++ {
		slice[i] = slice[i - 1] + slice[i - 2]
	}
	return slice
}

func main()  {

	fbn := fbn(10)
	fmt.Println("fbn = ", fbn)

}

 

map

是一个key=>value的hash结构,key是除func、slice、map、array外的类型

声明初始化  m := map[string]string{}

赋值一个     m["key1"] = "val1"

取值     v := m["key1"]

删除一个值  d := delete(m,"key1")

取值的时候可以返回两个值。另一个可以判断是否存在

val,isset := m[2]
 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

戴国进

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值