Go基础语法 | 青训营

133 阅读3分钟

基础数据类型

整型

有符号:int8、int16、int32、int64

无符号:uint8、uint16、uint32、uint64

此外还有两种一般对应特定CPU平台机器字大小的有符号和无符号整数int和uint

上述类型最大值和最小值可以在math包找到,例如常量math.MaxUint64表示uint64的最大值。

  1. Unicode字符rune类型是和int32等价的类型,通常用于表示一个Unicode码点。
  2. byte是uint8类型的等价类型。
  3. 还有一种无符号的整数类型uintptr,没有指定具体的bit大小但是足以容纳指针。

浮点数

float32、float64

一个float32类型的浮点数可以提供大约6个十进制数的精度,而float64则可以提供约15个十进制数的精度。通常应该优先使用float64类型,因为float32类型的累计计算误差很容易扩散,并且float32能精确表示的正整数并不是很大。

浮点数的最大值可以在math包找到

复数

complex64、complex128:分别对应float32和float64两种浮点数精度。

内建的real和imag函数分别返回复数的实部和虚部:

var x complex128 = complex(1, 2) // 1+2i 
var y complex128 = complex(3, 4) // 3+4i 
fmt.Println(x*y) // "(-5+10i)" 
fmt.Println(real(x*y)) // "-5" 
fmt.Println(imag(x*y)) // "10"

字符串

一个字符串是一个不可改变的字节序列。文本字符串通常被解释为采用UTF8编码的Unicode码点(rune)序列。

获取字节数目(不是rune字符数目)

s := "hello, world" 
fmt.Println(len(s)) // "12"

获取切片

fmt.Println(s[0:11]) // "hello, world" 
fmt.Println(s[:5]) // "hello" 
fmt.Println(s[7:]) // "world" 
fmt.Println(s[:]) // "hello, world"

下标访问

从0开始,如果试图访问超出字符串索引范围的字节将会导致panic异常

c := s[len(s)] // panic: index out of range

"+"拼接

s := "left foot" 
t := s 
s += ", right foot" 

这并不会导致原始的字符串值被改变,但是变量s将因为+=语句持有一个新的字符串值,但是t依然是包含原先的字符串值。

fmt.Println(s) // "left foot, right foot" 
fmt.Println(t) // "left foot

原生字符串面值

使用反引号代替双引号。没有转义操作,全部的内容都是字面的意思,包含退格和换行,因此一个程序中的原生字符串面值可能跨越多行。

唯一的特殊处理是会删除回车以保证在所有平台上的值都是一样的,包括那些把回车也放入文本文件的系统。

原生字符串面值用于编写正则表达式会很方便,因为正则表达式往往会包含很多反斜杠。原生字符串面值同时被广泛应用于HTML模板、JSON面值、命令行提示信息以及那些需要扩展到多行的场景。

const GoUsage = `Go is a tool for managing Go source code.

Usage:
    go command [arguments] 
...`

Unicode

是国际标准字符集,它将世界各种语言的每个字符定义一个唯一的编码。 Unicode码点对应Go语言中的rune整数类型。

将Unicode码点写到字符串面值

\uhhhh对应16bit的码点值

\Uhhhhhhhh对应32bit的码点值

其中h是一个十六进制数字;一般很少需要使用32bit的形式。每一个对应码点的UTF8编码。例如:下面的字母串面值都表示相同的值:

"世界"
"\u4e16\u754c" 
"\U00004e16\U0000754c"

UTF8

是一个将Unicode码点编码为字节序列的变长编码。

image.png

Go语言源文件总是用UTF8编码,并且Go语言的文本字符串也以UTF8编码的方式处理。

布尔型

一个布尔类型的值只有两种:true和false

常量

const pi = 3.14159 // approximately; math.Pi is a better approximatio