var & const
:声明变量(var)和常量(const)
var num int
const str string = "test"
// 批量定义变量
var (
username string = "xiaomo"
emails []string
)
// 批量定义常量
const (
host = "127.0.0.1"
port = 8080
)
package & import
: 包与导入
// 定义包名称
package main
import (
"fmt" // 导入fmt包
micro "github.com/micro/go-micro" // 给包名取别名
)
if/else, switch/case/default/fallthrough, for/continue/break, goto
等流程控制
// if-else
ok := true
if ok {
} else {
}
// for loop
for i := 0; i < 10; i++ {
if i < 3 {
continue
}
if i > 5 {
break
}
}
// switch-case
var i = 0
switch i {
case 0, 1:
fmt.Println("in case 1")
// 加fallthrough表示会继续往下匹配
// fallthrough
case 2:
fmt.Println("in case 2")
default:
fmt.Println("other")
}
func
: 定义函数和方法
// 小写开头的函数只能在包内使用
func test1() {}
// 大写开头的函数可以导出到其他包使用
func Test2() {}
// 带入参,返回值的函数
func test3(age int) int {}
// 支持多个返回值
func test4(name string, pwd string) (int ,error) {}
// 相同类型参数的省略用法
func test5(name, pwd, addr string, age int) (int, error) {}
// 可变长入参
func sum(nums ...int) {}
// sum函数调用方式:
// arr := []int{1, 2, 3}
// sum(arr...)
return
:用于从函数返回
func test1() {
if true {
return
}
}
func test2() bool {
// ...
return true
}
defer
:在函数退出之前执行某段逻辑
func test(a int) {
defer func() {
fmt.Println(a)
}
a++
}
go
: 用于并发
func test1() {}
func test2() {
go test1() // 创建goroutine, test1和test2函数将并发执行
// do something other
}
chan
: 和goroutine配合使用,用于数据同步
m := make(chan int) // 无缓冲管道
n := make(chan int, 6) // 有缓冲管道
select
: 用来监听和channel有关的IO操作
select {
case <- chan1:
// 如果成功从chan1读到数据,则进入该case处理
case chan2 <- 2:
// 如果成功向chan2写入数据,则进入该case处理
default:
// 如果上面都没有成功匹配,则进入default处理
}
type
:用于声明自定义类型
参考如下interface/struct的用法
interface
:用于定义接口
type Teacher interface {
Speak() string
Lesson() string
}
struct
: 用于定义抽象数据类型
type Student struct {
Level int
Name string
}
map
: 用于定义map类型数据
//定义一个key为string,value为int类型的map
var data1 map[string]int
// 定义一个key为string,value为任意类型的map
var data2 map[string]interface{}
range
:迭代读取slice/map/channel类型的元素数据
// 遍历数组
arr := [3]int {1, 2, 3}
for i, n := range arr {
fmt.Println(i, n)
}
// 遍历切片
sli := []int{2, 3, 4, 5}
for i, n := range sli {
fmt.Println(i, n)
}
// 遍历map
m := map[string]int{"Id":1, "Count":2}
for k, v := range m {
fmt.Println(k, v)
}