package main

import "fmt"

// 一个字符串是一个不可改变的字节序列。
// 字符串可以包含任意的数据，包括byte值0，但是通常是用来包含人类可读的文本。
// 文本字符串通常被解释为采用UTF8编码的Unicode码点（rune）序列，我们稍后会详细讨论这个问题。

func main() {
	// 字符串是一个不可以改变的数据序列
	// 相当于常量
	fmt.Println("I study golang")

	// 内置的len函数可以返回一个字符串中的字节数目（不是rune字符数目），
	// 索引操作s[i]返回第i个字节的字节值，i必须满足0 ≤ i< len(s)条件约束。

	// 字符串类型变量是一个字符集合。
	var str1 string = "Hello, world"
	fmt.Println(len(str1))
	fmt.Println(str1[0], str1[7])
	// 不可以越界访问字符
	//fmt.Println(str1[len(str1)])	//panic:index out of range

	// 第i个字节并不一定是字符串的第i个字符，
	// 因为对于非ASCII字符的UTF8编码会要两个或多个字节。
	// 字符串可以拼接成一个新的字符串
	str2 := str1 + "。Goodbye"
	fmt.Println(str2)

	// 字符串可以用==和<进行比较；比较通过逐个字节比较完成的，因此比较的结果是字符串自然编码的顺序。
	fmt.Println("ABC" == "ABC") // true

	// 字符串的值是不可以呗改变的，当然其内部字符也是不可以改变的
	//str1[0] = 'a'	 //cannot assign to str1[0] (value of type byte)

	// 但是可以将字符串变量赋予一个新的字符串来修改字符串变量的值
	fmt.Println(str1) // Hello, world
	str1 = "ABC"
	fmt.Println(str1) // ABC

}
