声明包、导入包、主函数、作用域
package main
import "fmt"
func main() {
fmt.Println("Hello World")
}基本数据类型和运算符
变量声明与赋值
var name type
var (
name1 type1
name2 type2
)
var a int = 1
b := 2
a, b = b, a基础类型
int、int8、int16、int32、int64
uint、uint8、uint16、uint32、uint64
float32、float64
complex64、complex128
byte、rune
bool
字符串
len()
strings.Map()
string[start : end]
strings.Fields()
strings.Split()
strings.Index()
strings.Replace()
fmt.Sprintf()
fmt.Printf()
fmt.Println()
类型转换
显式声明类型转换
v1 := T(v)
strconv.Itoa()
strconv.Atoi()
ParseBool()
ParseInt()
ParseFloat()
FormatBool()
FormatInt()
FormatFloat()
类型别名
type newType oldType
常量
const name [type] = value
枚举 enum
没有定义枚举类型,但是可以通过const和iota联合使用
const(
identifier 1 type = iota
identifier 2
)运算符
+ - * / % ++ -- == != > < >= <= && || ! & | ^ << >> += -= *= /= %= &= |= ^= <<= >>=
流程控制
// if
if expr1 {
statement1
} else if expr2 {
statement2
} else{
statement3
}
// switch
switch var1 {
switch var1: val2 {
switch {
case val1:
statement1
case val2:
statement2
...
default:
statementn
}
// for
for i:=0; i<10; i++ {
}
// for-range
for key,val := range coll {
}
break
continue
goto复合数据类型
数组
var array_name [SIZE] array_type{1, 2, 3}
len(array_name)
array1 == array2 // len(array1) == len(array2)
// 遍历
for i, v := range array {
}
var aa [2][3]int{
{}
{}
}切片
切片是对数组的区间引用,append创建新的数组空间并引用为切片
var slice_name []slice_type{1, 2, 3}
make([]Type, size, cap)
slice_name[start:end]
len()
cap()
append(slice, val)
copy(dst, src)
nil // 空切片
// 通过append和[:]组合使用删除切片内元素映射
var mapname map[keytype]valuetype{
key1 : val1,
...
}
mapname := make(map[keytype]valuetype)
for k,v := range mapname{
}
// get
var val, isExist := mapname[key] // 如何不存在该元素则返回值类型的“零值”
// del
delete(mapname, key)函数
函数定义
func funcname(param1 type1, param2 type2) type {
...
}值传递和引用传递(指针)
func swap(a *int, b *int) {
*a, *b = *b, *a
}
传递数组和切片
func join(array [3]string) string {
var s string = ""
for i := 0; i < len(array); i++ {
s += array[i] + " "
}
return s
}可变参数和可变类型参数
// 可变参数
func sum(num ...int) int {
}
// 可变类型参数
func print(a ...interface{}) {
for i := 0; i < len(a); i++ {
fmt.Println(a[i])
}
}
print(1, 'a', []int{1, 2, 3})多个返回值
func minmax(a int, b int) (int, int) {
if a < b {
return a, b
} else {
return b, a
}
}
fmt.Println(minmax(1, 2))函数变量
func sum(a int, b int) int {
return a + b
}
var add func(int, int) int = sum
fmt.Println(add(1, 2))匿名函数
func(a int, b int) {
fmt.Println(a + b)
}(1, 2)闭包
func main() {
var sum = add()
fmt.Println(sum(1))
fmt.Println(sum(2))
}
func add() func(int) int {
var sum int = 0
return func(a int) int {
sum += a
return sum
}
}todo 延迟调用
指针
var ptr_name *ptr_type = &v
ptr := &vnew
var ptr *int
ptr = new(int)空指针 nil
函数传指针修改源数据
指针数组
var ptr [length]*type二重指针
var ptr **type结构体
func main() {
p1 := person{"Alice", 20}
println(p1.name, p1.age)
p2 := new(person)
p2.name = "Bob"
p2.age = 30
p3 := &person{}
p3.name = "Charlie"
p3.age = 40
println(p2.name, p2.age)
println(p3.name, p3.age)
}
type person struct {
name string
age int
}todo
接口
todo
错误处理
todo