基础语法
语言结构
package main
import "fmt"
func main(){
fmt.Println("Hello,World!")
}
- 通常来说,Go代码的第一行是包的声明,其中main包是每个项目的入口。
- 代码的第三行使用
import关键字导入Go语言提供的标准包fmt。 - 第五行定义了一个函数,
func是定义函数的关键字。 - 第六行使用fmt的Println函数输出字符串。
变量
- 变量声明:
var - 常量声明:
const - 变量的定义形式:
var name 类型 = 表达式(类型和表达式可以择一省略) - 数字类型默认为
0,布尔类型默认为false,字符串类型默认为"",接口、slice、指针、map、通道、函数等类型默认值为nil。 - 常量的值是在程序编译后确定的,之后不可改变。
// 省略类型
var m = 2
// 省略表达式
var n int
// 多个变量一起声明
var a, b, c int
// 多个变量一同通过表达式声明
var i, j, k = 1, "hello", true
const LEN = 10
// 一次定义多个常量
const (
SYS = "Windows"
Type = "string"
)
指针
- 指针的默认初始值为
nil。
var int x
p := &x // & 为取地址符号。 p为指向x的整型指针
*p = 1
fmt.Println(x)
赋值
Go支持多重赋值,其余与C++相同。
选择
Go语言中,Switch语句的每个case不需要额外的break。其余与C++相同。
循环
Go语言只提供for关键字,没有其余如while等。
基本数据类型
- 整型可分为int8、int16、int32、int64,也可分为带符号int和无符号unit。
- 浮点型分为float32和float64。
- 复数分为complex64和complex128,分别由float32和float64组成。
- Go语言的布尔类型没有强制类型转换,无法将
0转为false。 - 字符串索引是按字节访问的,而不是字符。
- 在Go语言中,数组的使用频率并不高,因为数组长度不可变,很多时候都是使用
slice(切片)。切片比数组更灵活,长度是可变的。且在Go语言中,数组长度是数组的一部分。
常用特性
并发编程
- 不同于传统的多进程或多线程,golang的并发执行单位是一种称为goroutine的协程,这使得Go语言的并发编程更简洁高效。
- 高并发是Golang语言最大的亮点。
内存回收(GC)
GC过程是:先stop the world,扫描所有对象判活,把可回收对象在一段bitmap区中标记下来,接着立即start the world,恢复服务,同时起一个专门goroutine回收内存到空闲list中以备复用,不物理释放。物理释放由专门线程定期来执行。
内存分配
初始化阶段直接分配一块大内存区域,大内存被切分成各个大小等级的块,放入不同的空闲list中,对象分配空间时会从空闲list中取出大小合适的内存块。内存回收时,会把不用的内存重放回空闲list。空闲内存会按照一定策略合并,以减少碎片。
函数多返回值
Go语言允许多返回值,使代码更简洁安全。
异常处理
Go语言不支持try...catch...,golang提倡的异常处理方式是:
- 普通异常:被调用方返回error对象,调用方判断error对象。
- 严重异常:指的是中断性panic(比如除0),使用defer...recover...panic机制来捕获处理。严重异常一般由golang内部自动抛出,不需要用户主动抛出,避免传统try...catch写得导出都是的情况。用户也可以使用panic('xxxx')主动抛出,只是这样就使得这一套机制退化成结构化异常机制了。