Golang学习笔记(一)

Golang学习笔记(一)

一、Golang简介

Go语言(又称Golang)是由Google开发的一种静态强类型编译型并发型的具有垃圾回收功能编程语言

二、Golang的基本语法

1.名称

Golang中变量、常量、类型、函数、语句标签和包的名称遵循以下规则:

  1. 以Unicode字符或下划线开头;
  2. 首个字符后面可以跟任意数量的字符、数字和下划线;
  3. 区分大小写;
  4. 不能与Golang中的关键字相同;
  5. 可以与内置的预声明变量、类型和函数相同,但是不建议这么做;
  6. 包名本身由小写字符组成;
  7. Golang中的名称一般使用驼峰式命名,首字母缩略词通常使用相同的大小写。

2.作用域

  1. 在函数中声明的实体只在函数的局部有效;
  2. 声明在函数外的实体对包内的所有源文件可见;
  3. 如果实体的名称以大写字母开头,则它可以被包外的程序引用;如果以小写字母开头,则对包外不可见。

3.声明

Golang中的声明主要有四种:

  1. 变量(var)
  2. 常量(const)
  3. 类型(type)
  4. 函数(func)

Golang的源代码存储在一个或多个以.go为后缀的文件中。每个未见以package声明开头,表明文件属于哪一个包。后面是import声明,然后是包级别的类型、变量、常量、函数的声明。

函数的成名包含一个名字、一个参数列表、一个可选的返回值列表以及函数体。格式为:

1
2
3
func <函数名>(<参数列表>) [返回值类型] {
// 函数体
}

4.变量

Golang中使用var关键字声明变量。通用格式为:

var name type = expression

如果省略变量的类型,编译器会通过表达式推断变量的类型。如果省略表达式,变量将会被初始化为该类型的零值。

类型 零值
数字 0
布尔值 false
字符串 “”
接口和引用类型 nil

对于像数组和结构体这样的复合类型,零值是其所有元素或成员的零值。

可以声明一个变量列表并使用对应的表达式列表对其初始化。例如:

1
2
var i, j, k int
var b, f, s = true, 2.3, "four"

变量可以通过调用返回多个值的函数进行初始化:

1
var f, err = os.Open(name)

(1) 短变量声明

Golang中短变量声明的形式为:

name:= expression

编译器通过表达式推断变量的类型。

可以使用短变量类型声明多个变量:

1
2
i, j := 0, 1
f, err := os.Open(name)

短变量声明不需要声明所有在左边的变量。如果一些变量在同一个词法块中声明,则短声明的行为相当于赋值。短变量声明至少声明一个变量。

(2) 指针

  1. 指针的值是一个变量的地址,所有的变量都有地址。
  2. 使用取地址符(&)可以获取变量的地址。使用*可以对指针进行解引用。
  3. 每一个聚合类型变量都由变量组成,所以也有地址。
  4. 代表变量的表达式是唯一可以应用取地址符的表达式。
  5. 指针的零值是nil
  6. 函数可以返回局部变量的地址。

(3) new函数

new函数用于创建变量。表达式**new(T)**可以创建一个未命名的T类型的变量,初始化为T类型的零值并返回其地址。

(4) 变量的生命周期

包级别变量的声明周期是整个程序的执行时间。局部变量在每次执行声明语句是时创建一个新的变量,该变量一直生存到它变得不可访问。变量在堆或栈上是由编译器来决定的,不是有var或new决定的。

4.赋值

(1) 多重赋值

使用多重赋值可以一次性赋值多个变量。在赋值前=右侧的所有表达式都会被计算。可以将不需要的值付给空标识符:

1
_, err = io.Copy(dst, src)

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中还有intuint两种类型,它们与原生的有\无符号整数相同,或者在该平台上的运算效率最高。

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
2
3
var x complex128 = complex(1, 2)
fmt.Println(real(x))
fmt.Println(imag(x))

4.布尔值

bool型的值只有两种可能:true和false。!表示取反。&&||分别表示与运算和或运算,它们都有可能引起短路行为,&&的优先级比||高。bool类型与数值类型不能隐式转换。

5.字符串

在Golang中,字符串是不可变的字符序列,可以包含任意数据。len函数可以获取字符串的字节数。

子串生成操作s[i:j]产生新的字符串。例如:

1
2
var str string = "hello world"
fmt.Println(str[0:5])

可以使用+连接两个字符串生成一个新的字符串。

字符串本身可以做比较,比较按字节进行,符合字典排序。

(1) 字符串字面量

使用带双引号的字节序列表示字符串字面量。一般字符串按utf-8进行编码。字符串中可以有转义序列,以\开始:

转义序列 含义
\a 警告或响铃
\b 退格
\f 换页
\n 换行
\r 回车
\t 水平制表符
\v 垂直制表符
' 单引号
" 双引号
\ 反斜杠
\xhh 十六进制字节
\ooo 八进制字节
\uhhhh 16位码点
\uhhhhhhhh 32位码点

使用反引号表示原生的字符串字面量,转义序列不起作用。

(2) 字符串和字节slice

bytesstringsstrconvunicode4个标准包用于支持对字符串的操作。

strings包提供了用于搜索、替换、比较、修整、切分和连接字符串的函数。

bytes包中具有用于操作字节slice的函数。

strconv包提供了转换布尔值、整数、浮点数为与之对应的字符串形式以及进行相反操作的函数。

unicode包提供了用于判别文字符号值的特性的函数。

6.常量

Golang中使用const声明常量,例如:

1
const pi = 3.14

可以指定常量的类型:

1
const pi float64 = 3.14

可以同时声明多个常量:

1
2
3
4
const (
e = 2.718
pi = 3.14
)

(1) 常量生成器iota

iota创建一系列相关值,而不是逐个值显式写出。常量声明中,iota从0开始取值,逐项加一,例如:

1
2
3
4
5
6
7
8
9
10
11
type Weekday int

const (
Sunday Weekday = itoa
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
)

更复杂的表达式也可以使用iota

1
2
3
4
5
6
7
8
9
type Flags uint

const (
FlagUp Flags = 1 << iota
FlagBroadcast
FlagLoopback
FlagPointToPoint
FlagMuticast
)

参考

  1. 《Go程序设计语言》
  2. Go —— 维基百科
  3. Go语言入门教程

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!