本篇主要是讲述了数组和切片、Map的初始化方式与基本使用、重点阐述了如何使用Map实现Set、用Map实现工厂模式,以及字符串的使用,字符串常用API、Unicode与UTF8的关系!
数组和切片
1 | func TestArray01(t *testing.T) { |
其实切片的内部结构和Buffer的结构是差不多的,切片的使用:
make函数相当于申请空间、并且可以控制多少空间初始化!
1 | package slice_test |
切片如何扩容呢?
1 | func TestSliceGrowing(t *testing.T) { |
可以看出来,每次增长二倍的关系,所以就解释了为什么每次append之后都要接收append的返回值,因为go的内部实现就是内存区域Copy的形式,所以随时可能返回新的内存地址,所以需要接收!
1 | func TestSliceShareMemory(t *testing.T){ |
数组和切片的比较:数组不可伸缩、切片可以伸缩;相同维数且相同长度的数组才是可以比较的,切片是不可以比较的,下面的代码会编译不通过:
1 | func TestSliceCompare(t *testing.T){ |
Map的基本使用
1 | package map_test |
Map的遍历
1 | func TestForEachMap(t *testing.T) { |
Map与工厂模式
Map的Value可以是一个方法,因为在Golang中,方法也是一种类型,可以当做参数传递的,与Dock type接口方式一起,可以方便的实现单一方法对象的工厂模式
1 | func TestMapWithFunValue(t *testing.T) { |
Map实现Set
Go内置集合没有Set实现,可以map[type]bool
1、元素的唯一性
2、基本操作
- 添加元素
- 判断元素是否存在
- 删除元素
- 元素个数
1 | func TestMapForSet(t *testing.T) { |
字符串
与其他主要编程语言的差异:
string 是数据类型,不是引用或指针类型
string 是只读的byte slice, len 函数可以它所包含的byte数
string 的byte数组可以存放任何数据
string实际上就是一个不可变的切片
1 | func TestString(t *testing.T) { |
Unicode与UTF8
1、Unicode是一种字符集(code point)
2、UTF8是Unicode的存储实现(转为字节序列的规则)
Unicode为世界上所有字符都分配了一个唯一的数字编号,这个编号范围从 0x000000 到 0x10FFFF(十六进制),有110多万,每个字符都有一个唯一的Unicode编号,这个编号一般写成16进制, Unicode就相当于一张表,建立了字符与编号之间的联系,而UTF8是具体实现, 在UTF8中编号小的使用的字节就少,编号大的使用的字节就多。使用的字节个数从1到4个不等。
rune函数
在Go当中 string底层是用byte数组存的,并且是不可以改变的。fmt.Println(len(“Go编程”)) 输出结果应该是8因为中文字符是用3个字节存的, len(string(rune(‘编’)))的结果是3 ,如果想要获得我们想要的情况的话,需要先转换为rune切片再使用内置的len函数: fmt.Println(len([]rune(s))) 结果就是4了。 所以用string存储unicode的话,如果有中文,按下标是访问不到的,因为你只能得到一个byte。 要想访问中文的话,还是要用rune切片,这样就能按下标访问。
1 | func TestString(t *testing.T) { |
常用的字符串处理函数:
strings包:
https://golang.org/pkg/strings
strconv包
https://golang.org/pkg/strconv
1 | func TestStringFunc(t *testing.T) { |
- 本文作者: Tim
- 本文链接: https://zouchanglin.cn/761533839.html
- 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 许可协议。转载请注明出处!