字符串的常用操作
字符串转化为 字符数组 arrStrBytes := []byte(str)
字符数组转化为字符串 str :=string(arrStrBytes)
字符串截取 字符串截取和数组的截取是一样的 arrByte[low:high]
- low表示起点,是包含这个字符的
- hight 表示终点,是不包含这个字符的
字符串切割转化为数组 []string =strings.split(str,"分隔符 ")返回字符串数组
字符串到整型 int int64 int32 的转化 strconv.atoi(str,10) atoi 是strconv.parseInfo的精简版本
整型到字符串的转化 strconf.atoi(i int) strconf.FormatInt(i int64,int)
字符串的定义
- var str = “hello word” (编译器会推导类型)
- str :=“hello word”
- var str int = 100
字符串的遍历 和 数组的遍历是一样的 str[i]
字符串的修改,a="hello word " go语言的字符串是无法直接修改字符的,只能通过重新构造然后赋值给原来字符串实现
- arrByte:=[]byte(str) arrByte[0] = w str:=string(arrByte)
- 字符串不可变和java是一样的,c++的字符串是可变的,字符串不可变有很多好处,如天生线程安全,大家使用的都是只读对象,无须加锁;再者,方便内存共享,而不必使用写时复制(Copy On Write)等技术;字符串 hash 值也只需要制作一份。所以说,代码中实际修改的是 []byte,[]byte 在 Go 语言中是可变的,本身就是一个切片
字符串的拼接
- 用+进行链接
- 用类似于stringBuilder机制来进行链接 var stringBuilder bytes.Buffer stringBuilder.WriteString(“hello”) str:=stringBuilder.string()
数组的常用操作
数组和切片
- 数据是固定长度的 ,因此是固定长度,所以go语言中很少用数组,大多数用切片
数组的定义
- 数组的定义1 var a [3]int 默认值3个的初始值都为0
- 数组的定义2 a :=[…]int{1,2,3} 长度根据初始化值的个数来计算
- 数组的定义3 var a[3]int=[3]int{1,2,3} var a =[3]int{1,2,3} a:=[3]int{1,2,3}
切片的定义
- 数组的一个连续片段的引用,没有固定的长度
- 从数组或切片中生成切片 a := a[0:2]; a[0:0] 重置切片 a[ : ]原来的切片
- 直接声明切片 var a []int 只声明未初始化不能使用;因为是nil的(和数组有区别)
- var b []int = []int{1,2,3} var c = []int{11,22,33} d :=[]int{111,222,333}
- make构造切片 b := make([]int, 2, 10)
数组的常用操作
- 使用append来为切片添加元素
**a = append(a, 1) // 追加1个元素
**a = append(a, 1, 2, 3) // 追加多个元素, 手写解包方式
**a = append(a, []int{1,2,3}…) // 追加一个切片, 切片需要解包- 使用append从头部添加元素
** a = append([]int{0},a…) //在a头部添加一个元素
** a = append([]int{1,2,3),a…) //在a的头部添加一个切片- 使用append进行链式操作 达到中间插入的目的
** a = append(a[:i], append([]int{x}, a[i:]…)…) // 在第i个位置插入x
**a = append(a[:i], append([]int{1,2,3}, a[i:]…)…) // 在第i个位置插入切片
切片的函数传递是直接传还是传带&符号的?
不说原理了,直接说结论,原理请自行百度或者google;如果函数中使用了切片的append方法,则需要传递地址,也就是带&符号的,接收以*指针形式接收。如果函数中对切片的使用未使用append方法,则直接传递就可以
算法中数组的一些奇淫技巧
- 双指针遍历,一个在开始位置,一个在结束位置;一般适用于只遍历数组一般就能得到结果
// 注意:这里end是length-1
start :=0
end := len(arr)-1
for end>start{
// 一般这里是交换的一些操作
start++
end--
}
- 基于1的,大多数给的并不是数组的开始位置和结束位置;给的是数组中的一个start 和 end位置
这里的[start,end)是一个半开半闭的区间
middle :=(start+end)/2
for :=0;i<middle;i++{
// 这里一般是交换
end--
}