go 基础知识
背景
语言应用领域:
嵌入式、汇编:C语言
操作系统:C语言
系统级服务编程:C++
企业级应用和WEB应用:Java
GO致力于解决 并发支持不友好、编译速度慢、编程复杂 三个问题
标识符和关键字
变量和常量
运算符
表达式
简单语句
控制结构
函数
接口
编译模式: 编译成可执行程序
运行模式:直接运行
内存管理:支持自动垃圾回收
并发支持:协程(语言原生支持)
交叉编译:支持
跨平台支持:支持
库:丰富
框架:丰富
Go源码特征
源程序以 .go 为后缀
源程序默认为 UTF-8 编码
标识符区分大小写
语句结尾的分号可以省略
函数以func开头,函数体开头的 { 必须在函数头所在行尾部,不能单独起一行
字符串字面量使用" "括起来
调用包里面的方法通过点 . 访问符,比如示例中的fmt.Printf
main函数所在的包名必须是main
token(词法分析---->词法单元):
关键字、标识符、操作符、分隔符、字面常量
标识符:开头一个字符必须是字母或下划线,后面跟任意多个字符、数字或下划线,并区分大小写
关键字:go具有25个关键字。package(定义包名)、import(导入包名)、const(声明常量)、var(声明变量)、func(定义函数)、defer(延迟执行)、go(并发语法糖)、return(函数返回)、struct(定义结构体)、interface(定义接口)、map(声明map)、chan(声明通道)、
if 、else(顺序语句)、 for、range、break、continue(循环语句)、switch、select、type、case、default、fallthrough(switch语句)、goto(goto跳转)
预声明标识符:65个预声明标识符,包括25个关键字、20个数据类型标识符、4个常量值标识、1个空白标识、15个内置函数
整形(byte、int、int8、int16、int32、int64、uint、unint8、uint16、uint32、uint64、uintptr)
浮点型(float32、float64)
复数型(complex64、complex128)
字符和字符串型(string、rune)
常量值标识(true、false、iota(枚举声明中)、nil(指针变量默认值))
空白标识符( _ )
操作符和分隔符:操作符47个、分隔符4个(空格、制表、回车、换行)
算术运算符(+ - * / %)
位运算符(& | ^ &^ >> <<)
赋值运算符(:= = += -= *= /= %= &= |= ^= &^= >>= <<=)
比较运算符(> >= < <= == !=)
括号( ( ) { } [ ])
逻辑运算符(&& || !)
自增自减(++ --)
其它运算符(: , ; . ... <-)
字面常量:表示固定值的符号叫做字面常量
变量声明:
var varName dataType [ = value]
e.g: var a int = 1
短声明 (只能出现在函数内,go编译器自动进行数据类型推断)
var := value
常量声明:
const{
c0 = iota // c0 =1
c1 = iota // c0 =2
c2 = iota // c0 =3
}
iota用在常量声明中,其初始值为0,iota可看作自增的枚举变量(在同一代码块中依次增加),专门用来初始化常量
复合数据类型:
指针、数组、切片、字典(map)、通道、结构、接口
指针:指针声明类型*T,变量名前加&获取变量地址,*T获取内容
数组:[n]elementType
var name [2]int // 元素默认值为0
a := [3]int{1,2,3}
a := [...]int{1,2,3} // 不指定长度,通过初始化列表确定长度
a := [3]int{1:1, 2:3}
切片:变长数组,引用类型
array[b:e] 表示在数组中创建一个包含e-b个元素的切片,第一个是array[b] 最后一个array[e-1]
字典:map
ma := map[string] int{"a":1, "b":2}
struct:结构体,由多个不同类型的元素组合而成
type TypeName struct {
FieldName FieldType
FieldName FieldType
FieldName FieldType
}
控制结构:
if x<= y {
return y
} else {
return x
}
switch {
case 条件1:
。。。
case 条件2:
。。。
case 条件3:
。。。
}
fallthough 强制执行下一个case字句
for init; condition; post{ }
for key, value := range map{ } // 通过range可以对数组、切片、字符串、map、通道进行访问
标签和跳转:(只能跳到同级 或者 上层作用域)
Lable: Statement
goto Lable
函数:支持多值返回、支持闭包、支持可变参数、不支持函数重载、不支持函数嵌套
多个相邻的相同类型参数可以使用简写模式
func swap(a, b int) (int, int){
return b, a
}
函数的参数传递,采用值传递
不定参数:使用 paramName ... type
func sum(arr ...int)(sum int){
for _, v := range arr{
sum += v
}
return
}
函数延迟执行 采用defer (defer后面必须是函数或方法,调用采用先进后出的顺序在函数返回前进行执行,类似java的finally,确保资源最终能够回收或释放)
内置函数:
panic() 抛出错误
recover() 捕获 panic抛出的错误
go中的error: compile error、runtime error、logic error
go是强类型语言,编译器在编译时会进行严格的类型校验
类型强制转换:语法格式 var a T = ( T ) ( b ) // 使用括号将类型和要转换的变量或表达式的值括起来
接口:interface
接口的命名一般以“er”结尾
接口定义的内部方法声明不需要func引导
在接口定义中,只有方法声明没有方法实现