基础语法
go是强类型语言,字符串是内置类型,可以通过“+”拼接,运算符与C/C++类似。
变量&常量
变量
- 标识符只能由字母和下划线开头,且区分大小写。任何命名需要对外暴露的必须以大写命名开头。
- var name=表达式(var a=1/true/“hello world”) 变量名1,变量名2...=表达式1,表达式2...批量初始化。
- 函数内才可以短变量申明,name :=表达式(f:=float32(e)。
- 变量必须声明才能使用,且同一作用域内不能重复声明,变量声明后必须使用。
- 声明变量语法 var identifier type,或者var(多个变量)批量声明。
- 匿名变量
常量
- const constName [type]=value,也可以批量声明。
- 常量const与之类似,go中常量没有固定类型,根据上下文自动确定,type可以省略。
- iota,可修改的常量,默认值为1,每调用一次加1,遇到const被重置为0.通过-可以跳过一个值,中间声明也可以跳过。
关键字
数据类型
布尔类型
逻辑表达式不能用0或非0表达ture或false。
数字类型
没有float、double类型,只有double64/double32.
字符串
字符串连接
- “=”
- fmt.springf("%s,%s,s1,s2)
- strings.join([]string{s1,s2},",")
- buffer.WriteString()
转义字符
字符串的切片,和python基本类似。
循环/分支语句
- if-else同样变量名后无括号,switch不跑其他分支。
- for循环 for 初始语句;条件表达式;结束语句{循环体语句}
- goto通过标签进行代码间的无条件跳转
数组
var variablename [size]variabletype- 数组初始化
variablename:=[...]variabletype{}
切片
- 切片可变长度的数组,具有相同元素的序列,操作与python类似
- 声明切片
var identifier []type / name:=make([]type,len) / make([]T,length,capac ity),与数组区别在不用添加size - 直接初始化 name:=[]type{值}/利用数组或数组切片表达式初始化。
- 使用append(操作数组,添加元素)
- 删除索引为x的元素s:=append(s[:x],s[x+1:]...)
map
- 声明
var mapvariable map[key_type]valuetype - 创建
name:=make(map[key type]value_type) - 写入map,
name:= map[key_type]valuetype{} /[key]=value - delete删除键值对
函数
- 函数不允许重载,不能再嵌套函数(可以嵌套匿名函数),可以传递给一个变量和另一个函数,可以返回一个函数
- 传参时传的是拷贝副本
- 使用时必须先定义
- func functionname(参数列表)(return type){函数体},参数和返回值都可以是函数
- 函数闭包
func cal(base int) (func(int) int, func(int) int) {
add := func(a int) int {
base += a
return base
}
sub := func(b int) int {
base -= b
return base
}
return add, sub
}
func main() {
add, sub := cal(100)
//x := add(200)
//y := sub(50)
fmt.Printf("%v\n", add(200))
fmt.Printf("%v\n", sub(50))
}
- defer语句,先定义的后执行。
- init函数优先于main函数之前自动执行,没有输入函数与返回值,变量初始化先于init,init先于mian。
指针
var ptr *type,不能进行偏移和运算。- 指向数组的指针
var ptr [max]*int - 类型定义
type NewType type - 类型别名
type NewType=type