Go 语言入门指南:基础语法和常用特性解析 | 青训营

74 阅读3分钟

基础语法

语言结构

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')主动抛出,只是这样就使得这一套机制退化成结构化异常机制了。