Golang学习笔记(一)
Golang学习笔记(一)
一、Golang简介
Go语言(又称Golang)是由Google开发的一种静态强类型、编译型、并发型的具有垃圾回收功能的编程语言。
二、Golang的基本语法
1.名称
Golang中变量、常量、类型、函数、语句标签和包的名称遵循以下规则:
- 以Unicode字符或下划线开头;
- 首个字符后面可以跟任意数量的字符、数字和下划线;
- 区分大小写;
- 不能与Golang中的关键字相同;
- 可以与内置的预声明变量、类型和函数相同,但是不建议这么做;
- 包名本身由小写字符组成;
- Golang中的名称一般使用驼峰式命名,首字母缩略词通常使用相同的大小写。
2.作用域
- 在函数中声明的实体只在函数的局部有效;
- 声明在函数外的实体对包内的所有源文件可见;
- 如果实体的名称以大写字母开头,则它可以被包外的程序引用;如果以小写字母开头,则对包外不可见。
3.声明
Golang中的声明主要有四种:
- 变量(var)
- 常量(const)
- 类型(type)
- 函数(func)
Golang的源代码存储在一个或多个以.go为后缀的文件中。每个未见以package声明开头,表明文件属于哪一个包。后面是import声明,然后是包级别的类型、变量、常量、函数的声明。
函数的成名包含一个名字、一个参数列表、一个可选的返回值列表以及函数体。格式为:
1 | |
4.变量
Golang中使用var关键字声明变量。通用格式为:
var name type = expression
如果省略变量的类型,编译器会通过表达式推断变量的类型。如果省略表达式,变量将会被初始化为该类型的零值。
| 类型 | 零值 |
|---|---|
| 数字 | 0 |
| 布尔值 | false |
| 字符串 | “” |
| 接口和引用类型 | nil |
对于像数组和结构体这样的复合类型,零值是其所有元素或成员的零值。
可以声明一个变量列表并使用对应的表达式列表对其初始化。例如:
1 | |
变量可以通过调用返回多个值的函数进行初始化:
1 | |
(1) 短变量声明
Golang中短变量声明的形式为:
name:= expression
编译器通过表达式推断变量的类型。
可以使用短变量类型声明多个变量:
1 | |
短变量声明不需要声明所有在左边的变量。如果一些变量在同一个词法块中声明,则短声明的行为相当于赋值。短变量声明至少声明一个变量。
(2) 指针
- 指针的值是一个变量的地址,所有的变量都有地址。
- 使用取地址符(
&)可以获取变量的地址。使用*可以对指针进行解引用。 - 每一个聚合类型变量都由变量组成,所以也有地址。
- 代表变量的表达式是唯一可以应用取地址符的表达式。
- 指针的零值是
nil。 - 函数可以返回局部变量的地址。
(3) new函数
new函数用于创建变量。表达式**new(T)**可以创建一个未命名的T类型的变量,初始化为T类型的零值并返回其地址。
(4) 变量的生命周期
包级别变量的声明周期是整个程序的执行时间。局部变量在每次执行声明语句是时创建一个新的变量,该变量一直生存到它变得不可访问。变量在堆或栈上是由编译器来决定的,不是有var或new决定的。
4.赋值
(1) 多重赋值
使用多重赋值可以一次性赋值多个变量。在赋值前=右侧的所有表达式都会被计算。可以将不需要的值付给空标识符:
1 | |
5.类型声明
使用type声明可以定义一个新的命名类型,它与某个已有的类型使用相同的底层类型。通用格式为:
type name underlying-type
三、Golang中的基本数据类型
Golang的数据类型分为四大类:
| 类型分类 | 类型 |
|---|---|
| 基本类型 | 数字、字符串、布尔型 |
| 聚合类型 | 数组、结构体 |
| 引用类型 | 指针、slice、map、函数、通道 |
| 接口类型 | 接口 |
1.整数
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位无符号类型的表示范围是02^n-1。
Golang中的二元运算符按优先级降序排序如下:
*, /, %, <<, >>, &, &^+, -, |, ^==, !=, <, <=, >, >=&&||
2.浮点数
Golang中有两种大小的浮点数float32和float64。
math包中的的MaxFloat32是float32的最大值。math.MaxFloat64是float64的最大值。最小值类似。
math.IsNaN用于判断参数是否是非数值。
3.复数
Golang中的复数类型为complex64和complex128,分别由float32和float64组成。内置函数complex可用于创建复数,real函数和imag函数可用于提取复数的实部和虚部:
1 | |
4.布尔值
bool型的值只有两种可能:true和false。!表示取反。&&和||分别表示与运算和或运算,它们都有可能引起短路行为,&&的优先级比||高。bool类型与数值类型不能隐式转换。
5.字符串
在Golang中,字符串是不可变的字符序列,可以包含任意数据。len函数可以获取字符串的字节数。
子串生成操作s[i:j]产生新的字符串。例如:
1 | |
可以使用+连接两个字符串生成一个新的字符串。
字符串本身可以做比较,比较按字节进行,符合字典排序。
(1) 字符串字面量
使用带双引号的字节序列表示字符串字面量。一般字符串按utf-8进行编码。字符串中可以有转义序列,以\开始:
| 转义序列 | 含义 |
|---|---|
| \a | 警告或响铃 |
| \b | 退格 |
| \f | 换页 |
| \n | 换行 |
| \r | 回车 |
| \t | 水平制表符 |
| \v | 垂直制表符 |
| ' | 单引号 |
| " | 双引号 |
| \ | 反斜杠 |
| \xhh | 十六进制字节 |
| \ooo | 八进制字节 |
| \uhhhh | 16位码点 |
| \uhhhhhhhh | 32位码点 |
使用反引号表示原生的字符串字面量,转义序列不起作用。
(2) 字符串和字节slice
bytes、strings、strconv、unicode4个标准包用于支持对字符串的操作。
strings包提供了用于搜索、替换、比较、修整、切分和连接字符串的函数。
bytes包中具有用于操作字节slice的函数。
strconv包提供了转换布尔值、整数、浮点数为与之对应的字符串形式以及进行相反操作的函数。
unicode包提供了用于判别文字符号值的特性的函数。
6.常量
Golang中使用const声明常量,例如:
1 | |
可以指定常量的类型:
1 | |
可以同时声明多个常量:
1 | |
(1) 常量生成器iota
iota创建一系列相关值,而不是逐个值显式写出。常量声明中,iota从0开始取值,逐项加一,例如:
1 | |
更复杂的表达式也可以使用iota
1 | |
参考
- 《Go程序设计语言》
- Go —— 维基百科
- Go语言入门教程
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!