Go语言基础语法和常用特性解析
1. 为什么需要Go语言
- 性能问题:一些高级编程语言可能在性能方面受到限制,因为它们的抽象层次较高,导致运行时性能不如低级语言。Go通过编译型语言的特性和并发性能优势来解决这个问题。
- 依赖管理:一些编程语言,尤其是C和C++,在管理依赖关系和外部库时可能面临复杂性。Go引入了Go module机制,用于更有效地管理依赖关系,解决了这个问题。
- 笨重:某些编程语言可能过于复杂,有大量的语法和特性,这可能使学习和使用变得困难。Go的设计目标之一是保持简洁和清晰,降低学习曲线。
- 垃圾回收和并行计算:对于一些系统编程语言,如C和C++,垃圾回收和并行计算等基础功能可能缺乏内置支持,需要开发者手动处理。Go通过内置垃圾回收和goroutine等机制来简化这些任务。
- 多核支持:在多核计算机上利用所有核心的能力是一项挑战。Go的goroutine和channel机制使并发编程变得更加容易,允许开发者有效地利用多核处理器。
2. Go语言的特征
- 自动立即回收。
- 更丰富的内置类型。
- 函数多返回值。
- 错误处理。
- 匿名函数和闭包。
- 类型和接口。
- 并发编程。
- 反射。
- 语言交互性。
- 泛型。Go在1.8支持泛型特性。
3. 搭建Go环境
- 官网下载:golang.google.cn/dl/ 。
- 安装后终端输入
go -version检查是否安装成功。
4. Hello World
创建main.go文件,编写下面内容:
package main
import (
"fmt"
)
func main() {
fmt.Println("hello world")
}
打开终端进入main.go所在文件目录,执行go build one.go 就可以编译go文件并生成一个可执行文件,运行即可。
5. Go的变量
5.1 变量
- Go的基本类型
bool --布尔类型
int(32 or 64), int8, int16, int32, int64 --整形
uint(32 or 64), uint8(byte), uint16, uint32, uint64 --无符号整形
float32, float64 --浮点数
string --字符串
complex64, complex128
array -- 固定长度的数组
- Go的复合数据类型
slice -- 序列数组(最常用)
map -- 映射
chan -- 管道
5.2 变量的声明
声明变量语法: var 变量名 变量类型,例如:
var name string
var age int
var isOk bool
5.3 批量声明变量
var (
a string
b string
c string
d int
)
6. Go的控制流程
6.1 if语句
if 布尔表达式 {
/* 在布尔表达式为 true 时执行 */
}
6.2 switch语句
switch var1 {
case val1:
...
case val2:
...
default:
...
}
6.3 for循环
Go 语言只有 for 循环这一种循环语句,for循环主要有以下三种形式:
- 形式1(
for i循环)
for init; condition; post {
}
// 例子:
for i:=0;i<10;i++{
}
- 形式2
n:=10
for n>0 { // 替代while(n>0){} 和 for (; n > 0;) {}
n--
}
- 形式3:
for{}相当于while(true){}和for(;;){}
for {
}
6.4 range循环
for range循环在遍历容器或者数组时可以获得这些数据类型的索引,更方便编写易懂的代码:
for key, value := range myMap1 {
myMap2[key] = value
}
7. 函数
7.1 函数的声明
函数声明包括函数名、形式参数列表、返回值列表(可省略)以及函数体。
func name(parameter-list) (result-list) {
body
}
// 例子
func hypot(x, y float64) float64 {
return math.Sqrt(x*x + y*y)
}
7.2 函数的返回值
与其他语言不同的是,Go语言的函数会返回一个error的值,这个值代表函数出错的数据信息。
8. 结构体
结构体是一种聚合的数据类型,是由零个或多个任意类型的值聚合成的实体。每个值称为结构体的成员。
type Employee struct {
ID int
Name string
Address string
}
var dilbert Employee
上面两个语句声明了一个叫Employee的命名的结构体类型,并且声明了一个Employee类型的变量dilbert。
9. 数组
数组是一个由固定长度的特定类型元素组成的序列,一个数组可以由零个或多个元素组成。
// 3个int类型的数组a
var a [3]int
a := [...]int{1, 2, 3}
// 打印a的值和下标
for i, v := range a {
fmt.Printf("%d %d\n", i, v)
}