Go学习笔记——第5章 数据(上)

第5章 数据

5.1 字符串

字符串不可变字节(byte)序列,其本身是一个复合结构

type string struct {
	str unsafe.Pointer
	len int
}

字符串的默认值是"",使用"`"定义不做转义处理的原始字符串。

func main() {
	s := `line\r\n
	line2`
	pintln(str)
}

//运行结果
line\r\n
        line2

字符串 支持!=、==、<、>、+、+=操作符

func main() {
	s := "ab" + "cd"
	println( s == "abcd")
	println(s > "abc")
}

//运行结果
true
true

字符串 支持索引号访问字节数组,但不能获取元素地址。

func main() {
	s := "ab" + "cd"
	println(s[1])
	println(&[1])	//
}

字符串支持切片语法。

func main() {
	s := "abcdefg"
	s1 := s[:3]		//从头开始,指定结束索引位置
	s2 := s[1:4]	//指定开始位置和结束位置索引,返回【star,end)
	s3 := s[2:]		//指定开始位置,返回后面全部内容

	println(s1, s2, s3)
}

//运行结果
abc bcd cdefg

转换
要修改字符串,必将其转化为可变类型[]rune 或 []byte,待完成后再转换回来。但是不管如何转换,都必须重新分配内存,并复制数据。
性能
动态构建字符串也容易造成性能问题。
用加法操作符拼接字符串时,每次都必须重新分配内存。在构建超大字符串时,性能就显得极差。

func test() string {
	var s string
	for i := 0; i < 1000; i++ {
		s += "a"
	}
	return s
}

改进思路是预分配足够的内存空间。 常用的方法是strings.Join函数,它会统计所有参数的长度,一次性完成内存分配操作。

对于少量的字符串格式化拼接,可以使用fmt.Sprintf、text/template等方法。

5.2 数组

定义数组类型时,数组长度必须是非负整型常量表达式,长度是类型组成部分。也就是说,元素类型相同,单长度不同的数组属于不同的数组。

func main() {
	var d1 [3]int
	var d2 [2]int
	d1 = d2 //错误,长度不一样。
} 

灵活的初始化方式

func main() {
	var a [4]int			//元素自动初始化为0
	b := [2]int(2, 5) 		//未提供初始值的元素初始化为0
	c := [4]int(5, 3: 10)	//指定索引位置初始化
	d := [...]int(1,2,3)	//编译器按初始值数量确定数组长度
	e := [...]int(1, 3:100)	//支持索引初始化
	
	fmt.Println(a, b, c, d, e)
	
}
// 运行结果
[0 0 0 0]
[2 5]
[5 0 0 10]
[1 2 3]
[1 0 0 100]

对于结构等符合类型,可以省略初始化类型标签。

func main() {
	type user struct {
		name string
		age	byte
	}

	d := [...]user{		//省略了类型
		{"tom", 20},
		{"mary",18},
	}

	fmt.Printf("%#v\n", d)
}
//运行结果
[2]main.user{
	main.user{name:"tom", age:0x14}, 		
	main.user{name:"mary", age:0x12}
}

定义多维数组时,仅第一维度允许使用...
内置函数lencap都返回第一维度长度。

指针
指针数组是指元素为指针类型的数组,数组指针获取数组变量的指针。

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 1024 设计师:白松林 返回首页