欢迎访问我的个人博客
https://vincillau.github.io/
Go语言
(又称Golang)是由Google开发的一种静态强类型、编译型、并发型的具有垃圾回收功能的编程语言。
Golang中变量、常量、类型、函数、语句标签和包的名称遵循以下规则:
Golang中的声明主要有四种:
Golang的源代码存储在一个或多个以.go
为后缀的文件中。每个未见以package
声明开头,表明文件属于哪一个包。后面是import
声明,然后是包级别的类型、变量、常量、函数的声明。
函数的成名包含一个名字、一个参数列表、一个可选的返回值列表以及函数体。格式为:
func <函数名>(<参数列表>) [返回值类型] {
// 函数体
}
Golang中使用var
关键字声明变量。通用格式为:
var name type = expression
如果省略变量的类型,编译器会通过表达式推断变量的类型。如果省略表达式,变量将会被初始化为该类型的零值。
类型 | 零值 |
---|---|
数字 | 0 |
布尔值 | false |
字符串 | “” |
接口和引用类型 | nil |
对于像数组和结构体这样的复合类型,零值是其所有元素或成员的零值。
可以声明一个变量列表并使用对应的表达式列表对其初始化。例如:
var i, j, k int
var b, f, s = true, 2.3, "four"
变量可以通过调用返回多个值的函数进行初始化:
var f, err = os.Open(name)
Golang中短变量声明的形式为:
name:= expression
编译器通过表达式推断变量的类型。
可以使用短变量类型声明多个变量:
i, j := 0, 1
f, err := os.Open(name)
短变量声明不需要声明所有在左边的变量。如果一些变量在同一个词法块中声明,则短声明的行为相当于赋值。短变量声明至少声明一个变量。
&
)可以获取变量的地址。使用*
可以对指针进行解引用。nil
。new函数
用于创建变量。表达式**new(T)**可以创建一个未命名的T类型的变量,初始化为T类型的零值并返回其地址。
包级别变量的声明周期是整个程序的执行时间。局部变量在每次执行声明语句是时创建一个新的变量,该变量一直生存到它变得不可访问。变量在堆或栈上是由编译器来决定的,不是有var或new决定的。
使用多重赋值可以一次性赋值多个变量。在赋值前=
右侧的所有表达式都会被计算。可以将不需要的值付给空标识符:
_, err = io.Copy(dst, src)
使用type声明可以定义一个新的命名类型,它与某个已有的类型使用相同的底层类型。通用格式为:
type name underlying-type
Golang的数据类型分为四大类:
类型分类 | 类型 |
---|---|
基本类型 | 数字、字符串、布尔型 |
聚合类型 | 数组、结构体 |
引用类型 | 指针、slice、map、函数、通道 |
接口类型 | 接口 |
Golang同时具有有符号整数和无符号整数。
有符号整数:
类型 | 大小 |
---|---|
int8 | 8 |
int16 | 16 |
int32 | 32 |
int64 | 64 |
无符号整数:
类型 | 大小 |
---|---|
uint8 | 8 |
uint16 | 16 |
uint32 | 32 |
uint64 | 64 |
除了上述8种类型外,Golang中还有int
和uint
两种类型,它们与原生的有\无符号整数相同,或者在该平台上的运算效率最高。
rune
类型是int32的同义词,常常用于表示Unicode码点。byte
类型是uint8的同义词。
无符号整数类型uintptr
的大小不明确,但是足以存放指针。
n位有符号整数的表示范围是-2(n-1)~2(n-1)-1。n位无符号类型的表示范围是0~2^n-1。
Golang中的二元运算符按优先级降序排序如下:
*
, /
, %
, <<
, >>
, &
, &^
+
, -
, |
, ^
==
, !=
, <
, <=
, >
, >=
&&
||
Golang中有两种大小的浮点数float32和float64。
math包中的的MaxFloat32是float32的最大值。math.MaxFloat64是float64的最大值。最小值类似。
math.IsNaN用于判断参数是否是非数值。
Golang中的复数类型为complex64和complex128,分别由float32和float64组成。内置函数complex可用于创建复数,real函数和imag函数可用于提取复数的实部和虚部:
var x complex128 = complex(1, 2)
fmt.Println(real(x))
fmt.Println(imag(x))
bool型
的值只有两种可能:true和false。!
表示取反。&&
和||
分别表示与运算和或运算,它们都有可能引起短路行为,&&的优先级比||高。bool类型与数值类型不能隐式转换。
在Golang中,字符串是不可变的字符序列,可以包含任意数据。len函数可以获取字符串的字节数。
子串生成操作s[i:j]
产生新的字符串。例如:
var str string = "hello world"
fmt.Println(str[0:5])
可以使用+
连接两个字符串生成一个新的字符串。
字符串本身可以做比较,比较按字节进行,符合字典排序。
使用带双引号的字节序列表示字符串字面量。一般字符串按utf-8进行编码。字符串中可以有转义序列,以\
开始:
转义序列 | 含义 |
---|---|
\a | 警告或响铃 |
\b | 退格 |
\f | 换页 |
\n | 换行 |
\r | 回车 |
\t | 水平制表符 |
\v | 垂直制表符 |
’ | 单引号 |
" | 双引号 |
\ | 反斜杠 |
\xhh | 十六进制字节 |
\ooo | 八进制字节 |
\uhhhh | 16位码点 |
\uhhhhhhhh | 32位码点 |
使用反引号表示原生的字符串字面量,转义序列不起作用。
bytes
、strings
、strconv
、unicode
4个标准包用于支持对字符串的操作。
strings包提供了用于搜索、替换、比较、修整、切分和连接字符串的函数。
bytes包中具有用于操作字节slice的函数。
strconv包提供了转换布尔值、整数、浮点数为与之对应的字符串形式以及进行相反操作的函数。
unicode包提供了用于判别文字符号值的特性的函数。
Golang中使用const
声明常量,例如:
const pi = 3.14
可以指定常量的类型:
const pi float64 = 3.14
可以同时声明多个常量:
const (
e = 2.718
pi = 3.14
)
iota创建一系列相关值,而不是逐个值显式写出。常量声明中,iota从0开始取值,逐项加一,例如:
type Weekday int
const (
Sunday Weekday = itoa
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
)
更复杂的表达式也可以使用iota
type Flags uint
const (
FlagUp Flags = 1 << iota
FlagBroadcast
FlagLoopback
FlagPointToPoint
FlagMuticast
)