Go 基础

本文将介绍 Go 中的变量、常量、指针、类型转换、类型别名等基础概念。

一、变量

1. 变量创建

1
2
3
4
5
6
7
8
9
10
11
// 声明类型,自动赋零值
var a int

// 声明类型,赋值
var a int = 1

// 自动判断类型,赋值
var a = 1

// 自动判断类型,赋值,简化写法
a := 1

2. 多变量创建

1
2
3
4
5
6
var a, b int

var (
a int
b bool
)

3. 匿名变量

在 Go 中,对于希望忽略的变量,可以用 _ 对它们进行标识。

1
res, _ := getData()

二、常量

1. 常量创建

1
const 常量名 [类型] = 常量值

2. 多常量创建

1
2
3
4
5
6
7
8
const a, b = 1

const (
a = 1
// 若未设初值,将自动使用上面的初值
b // 1
c = 3
)

3. 常量生成器

iota 关键字用于声明一组 “递增” 的常量。iota 关键字可以在表达式中使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
const (
a = iota // 0
b // 1
c // 2
d // 3
)

const (
IgEggs Allergen = 1 << iota // 1 << 0 which is 00000001
IgChocolate // 1 << 1 which is 00000010
IgNuts // 1 << 2 which is 00000100
IgStrawberries // 1 << 3 which is 00001000
IgShellfish // 1 << 4 which is 00010000
)

三、指针

1. “更安全” 的指针

Go 为程序员提供了访问指针的能力,但需要注意的是,在 Go 中,指针是不允许偏移和运算的,这避免了指针偏移导致的非法数据修改,也方便了自动垃圾回收。

2. 指针创建

1
2
3
4
5
6
7
8
// 定义空指针
var point *类型

// 使用 & 获取值的指针
point := &value

// 使用 new() 实例化并获得指针
point := new(类型)

3. 指针的值的获取

1
*point

四、类型转换

Go 并不提供隐式类型转换功能,所有的类型转换都需要显式声明。

1
valueOfTypeB = typeB(valueOfTypeA)

五、类型别名

1. 什么是类型别名?

类型别名是 Go 1.9 版本中添加的新功能,用于解决代码升级、迁移过程中存在的类型兼容性问题。

1
type TypeAlias = Type

2. 类型别名和类型定义

1
2
3
4
5
// 类型别名
type TypeAlias = Type

// 类型定义
type newType Type

类型别名获得的是原类型的别名,等效于原类型;类型定义得到的是一个新类型,与原类型不同。

参考