- 导包使用
import ("fmt" "math")
- 变量声明:一种是通过
var name string = ""可以不必要写变量类型;另一种是使用变量 冒号:= 等于值。常量的话就是把 var 改成const,值在一提的是o语言里面的常量,它没有确定的类型,会根据使用的上下文来自动确定类型。
- if-else:if后面没有括号且必须要有大括号
if i==5 {}
- 循环: 只有for循环同时也可以没有括号但必须有大括号
- switch:go中的switch不需要break;switch后面的变量名,并不是要括号。
a := 2
switch a {
case 1:
fmt.PrintIn("one")
case 2:
fmt .Println("two")
case 3:
fmt .Printin("three")
case 4,5:
fmt.Println("four or five")
default:
fmt.Println("other")
}
t := time.Now()
switch {
case t.Hour() < 12:
fmt.Println("It's before noon")
default :
fmt .PrintIn("It's after noon")
}
- 数组:
var a [5]int b := [5]int{1,2,3,4,5}
- 切片: make 一个切片
s := make([]string, 3) 可以用append追加元素 s = append(s, "a")
- map:
m := make(map[string]int)
m["one"] = 1
m["two"] = 2
fmt.PrintIn(m)
fmt.PrintIn(len(m))
fmt.PrintIn(m["one"])
fmt.PrintIn(m["unknow"])
r, ok := m["unknow"]
fmt.Println(r, ok)
delete(m,"one")
m2 := map[string]int{"one": 1,“two": 2}
var m3 = map[string]int{"one": 1,"two": 2}
fmt .Println(m2, m3)
- range: 于一个slice或一个map的话,用range来遍历,代码能够更加简洁;对于数组会返回两值,第一是索引,二个是对应位置的值
nums := []int{2,3,4]
sum := 0
for i, num := range nums {
sum += num
if num == 2 {
fmt.PrintIn("index:", i, "num:", num)
}
}
m := map[string]string{"a":"A","b":"B"}
for k, v := range m {
fmt.Println(k, v)
}
for k := range m {
fmt.Printiln("key", k)
}
- 函数:变量类型后置 且返回两个值,第一个为真正结果,第二个返回错误信息
- 指针:支持指针但操作有限
- 结构体:
type user struct{
name string
password string
}
- 结构体方法:
- 错误处理:
在 go 语言习惯使用一个单独的返回值来传递错误信息。能够很清晰地知道哪个函数返回了错误,并且能用简单的 if else 来处理错误.在函数里面,我们可以在那个函数的返回值类型里面,后面加一个 error,就代表这个函数可能会返回错误那么在函数实现的时候,retum 需要同时 retur 两个值,要么就是如果出现错误的话,那么可以 retun nil和一个 error,如果没有的话,那么返回原本的结果和nil.
- JSON:
GO中JS0N很简单,对于一个已经有的结构体,只要保证每个字段的第一个字母是大写,也就是公开字段,该结构体就能用
JSON.marshaler去序列化,JSON.unmarshaler进行反序列化。这样默认序列化出来的字符串的话,它的风格是大写字母开头,而不是下划线,我们可以在后面用 json tag 等语法来去修改输出JSON 结果里面的字段名。
- 进程信息:
在 go里面,我们能够用 os.argy 来得到程序执行的时候的指定的命令行参数。
比如我们编译的一个二进制文件,command。后面接 abcd 来启动,输出就是 os.argy会是一个长度为 5 的 slice,第一个成员代表二进制自身的名字.我们可以用 so.getenv来读取环境变量。
