环境变量 goroot gopath
安装依赖 go get
框架 beego leaf
hello.go
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}
运行 go run hello.go
大写开头 public 小写开头 private
结尾不需要分号
变量声明
var age int // 声明时赋默认值
var length = 1.3 // 自动推断
number := 10 // 省略var,只能用于函数体内
var vname1, vname2, vname3 int32
var (
v1 int
v2 float32
)
var agePtr *int
agePtr = &age // 取地址
变量默认值为 0 或 nil
变量类型
bool true false
int8 int16 int32 int64 uint8 uint16 uint32 uint64
float32 float64
complex64 complex128
string 值类型
byte 类似 uint8
rune 类似 int32
int 32 或 64 位
uint 与 uint 一样大小
uintptr 无符号整型,用于存放一个指针
赋值
a = b
a, b = b, a // 并行赋值,交换a b的值
_, b = 5, 7 // _ 空白标识符 抛弃5
常量
const a string = "abc"
const b = "abc" // 省略类型
const ( // 用于枚举
a = "abc"
b = len(a) // = 3
c = unsafe.Sizeof(a) // = 16
)
const (
a = iota //0
b //1
c //2
d = "ha" //独立值, iota += 1
e //"ha" iota += 1
f = 100 //iota +=1
g //100 iota +=1
h = iota //7,恢复计数
i //8
) // 0 1 2 ha ha 100 100 7 8
运算符
+-*/% ++ -- == != > < >= <= && || ! & | ^按位异或 << >> = & *
b = a++ // 不允许
条件
if a {
} else if b {
} else {
}
switch 不需要 break,继续为 fallthrough
switch var1 {
case val1:
case val2:
default:
}
随机执行一个,否则阻塞
select {
case communication clause :
statement(s);
case communication clause :
statement(s);
/* 你可以定义任意数量的 case */
default : /* 可选 */
statement(s);
}
不支持 ?:
循环
for init; condition; post { }
for condition { }
for { }
for 循环的 range 格式可以对 slice、map、数组、字符串等进行迭代循环。格式如下:
for key, value := range oldMap {
newMap[key] = value
}
continue
break
goto label
label: statement
函数
func max(num1, num2 int) int {
}
多返回值
func swap(x, y string) (string, string) {
return y, x
}
默认为值传递
函数作为另外一个函数的实参
闭包
数组
类型相同,长度固定
var balance [10] float32
var balance = [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0} // {}中个数要小于5
var balance = [...]float32{1000.0, 2.0, 3.4, 7.0, 50.0} // 长度为5
多维数组
指针
var ip *int
数组指针
var ptr [MAX]*int;
指向指针的指针
var pptr **int
结构体
type Books struct {
title string
author string
subject string
book_id int
}