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
、unicode
4个标准包用于支持对字符串的操作。
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 协议 ,转载请注明出处!