目录
编码
UNICODE
UTF-8
基本数据类型
字符串
起初计算机世界就只有一个ASCII字符集:美国信息交换标准代码。ASCII,更准确地说是美国的ASCII,使用7bit来表示128个字符:包含英文字母的大小写、数字、各种标点符号和设备控制符。对于早期的计算机程序来说,这些就足够了,但是这也导致了世界上很多其他地区的用户无法直接使用自己的符号系统。随着互联网的发展,混合多种语言的数据变得很常见(译注:比如本身的英文原文或中文翻译都包含了ASCII、中文、日文等多种语言字符)。如何有效处理这些包含了各种语言的丰富多样的文本数据呢?答案就是使用Unicode( http://unicode.org ),它收集了这个世界上所有的符号系统包括重音符号和其它变音符号,制表符和回车符,还有很多神秘的符号,每个符号都分配一个唯一的Unicode码点,Unicode码点对应Go语言中的rune整数类型。
我们可以将一个符文序列表示为一个int32序列。这种编码方式叫UTF-32或UCS-4,每个Unicode码点都使用同样的大小32bit来表示。这种方式比较简单统一,但是它会浪费很多存储空间,因为大数据计算机可读的文本是ASCII字符,本来每个ASCII字符只需要8bit或1字节就能表示。而且即使是常用的字符也远少于65,536个,也就是说用16bit编码方式就能表达常用字符。但是,还有其它更好的编码方法吗?
UTF8是一个将Unicode码点编码为字节序列的变长编码。UTF8编码由Go语言之父Ken Thompson和Rob Pike共同发明的,现在已经是Unicode的标准。UTF8编码使用1到4个字节来表示每个Unicode码点,ASCII部分字符只使用1个字节,常用字符部分使用2或3个字节表示。每个符号编码后第一个字节的高端bit位用于表示总共有多少编码个字节。如果第一个字节的高端bit为0,则表示对应7bit的ASCII字符,ASCII字符每个字符依然是一个字节,和传统的ASCII编码兼容。如果第一个字节的高端bit是110,则说明需要2个字节;后续的每个高端bit都以10开头。更大的Unicode码点也是采用类似的策略处理。
Go语言将数据类型分为四类:基础类型、复合类型、引用类型和接口类型。
基础类型包括:数字、字符串和布尔型。布尔型的值只可以是常量 true 或者 false。数字类型支持整型和浮点型,并且支持复数,其中位的运算采用补码。复合数据类型包括:数组、结构体是通过组合简单类型,来表达更加复杂的数据结构。引用类型包括:指针、slice、map、 channel、接口和函数类型。当声明引用类型的变量时,创建的变量被称作标头(header)值。从技术细节上说,字符串也是一种引用类型。每个引用类型创建的标头值是包含一个指向底层数据结构的指针。每个引用类型还包含一组独特的字段,用于管理底层数据结构。因为标头值是为复制而设计的,所以永远不需要共享一个引用类型的值。标头值里包含一个指针,因此通过复制来传递一个引用类型的值的副本,本质上就是在共享底层数据结构。
浮点数的范围极限值可以在math包找到。常量math.MaxFloat32表示float32能表示的最大数值,大约是 3.4e38;对应的math.MaxFloat64常量大约是1.8e308。它们分别能表示的最小值近似为1.4e-45和4.9e-324。
const Avogadro = 6.02214129e23 // 阿伏伽德罗常数
const Planck = 6.62606957e-34 // 普朗克常数
package main
import (
"fmt"
s "strings"
)
func main() {
s1 := "hello world,你好,世界"
fmt.Println(len(s1))
fmt.Println(s.Contains(s1, "orld")) //查看字符串是否包含子串,返回bool
fmt.Println(s.Count(s1, "o")) //子串在主串中出现的个数
fmt.Println(s.HasPrefix(s1, "he")) //查看主串是否是以子串开头的
fmt.Println(s.HasSuffix(s1, "rld")) //查看主串是否是以子串结尾的,
//用途:文件扩展名
fmt.Println(s.Index(s1, "orl")) //子串在主串中的位置,没有返回-1
s2 := s.Join([]string{"hello", "world"}, "-") //字符串拼接
fmt.Println(s2)
s3 := s1 + "china"
fmt.Println(s3)
s2 = s.Repeat("abb", 5) //字符串重复拼接
fmt.Println(s2)
s2 = s.Replace(s1, "o", "O", 1) //字符串替换,返回新的字符串
fmt.Println(s2)
ip := "192.168.1.1"
fields := s.Split(ip, ".") //字符串拆分
fmt.Println(fields)
for _, value := range fields {
fmt.Println(value)
}
fmt.Println(s.ToUpper(s1)) //转化为大写
fmt.Println(s.ToLower(s1)) //转化为小写
buf1 := []byte(s1) //字符串按字节转化为buff
buf2 := []rune(s1) //按照4个字节为单位组成unicode编码
s3 = string(buf1) //buff转化为字符串
s4 := string(buf2)
fmt.Println(s3, s4)
}
output:
27
true
2
true
false
7
hello-world
hello world,你好,世界china
abbabbabbabbabb
hellO world,你好,世界
[192 168 1 1]
192
168
1
1
HELLO WORLD,你好,世界
hello world,你好,世界
hello world,你好,世界 hello world,你好,世界