基础
语法
package main // 入口包(入口文件)
import {
"fmt" // 导入包
}
func main() {
fmt.Println("hello world")
}
不同文件可以是同一个包
变量
强类型
var a = "initial" 自动推导类型
var b int = 1 显式声明类型
f := float32(e)
const s string = "constant"
const h = 500000000 常量根据使用上下文自动确定类型
if else
if v := math.Pow(x, n); v < lim {
return v
} else {
fmt.Printf("%g >= %g\n", v, lim)
}
// 这里开始就不能使用 v 了
循环
// 仅有for
for {
fmt.Println("loop")
break
}
// 正常循环
for j := 7; j < 9; j++ {
fmt.Println(j)
}
switch
case 后默认跟break
case 后可跟条件分支
switch {
case t.Hour() < 12:
fmt.Println("It's before noon")
default:
fmt.Println("It's after noon")
}
switch time.Saturday {
case today + 0:
fmt.Println("Today.")
case today + 1:
fmt.Println("Tomorrow.")
default:
fmt.Println("Too far away.")
}
数组
切片
可变长度数组
创建s := make([]string, 3)
追加s = append(s, "d")返回的类似指针,自动扩容
切片s[2:5] 不支持负数索引
map
创建m := make(map[string]int) map[key][value]
内部无序
range
遍历用
m := map[string]string{"a": "A", "b": "B"}
for k, v := range m {
fmt.Println(k, v) // b 8; a A
}
函数
可返回多个值,通常返回两个值(返回值和错误信息)
func exists(m map[string]string, k string) (v string, ok bool) {
v, ok = m[k]
return v, ok
}
函数的闭包,有点像保存了静态变量
func adder() func(int) int {
sum := 0
return func(x int) int {
sum += x
return sum
}
}
func main() {
pos, neg := adder(), adder()
for i := 0; i < 10; i++ {
fmt.Println(
pos(i),
neg(-2*i),
)
}
}
指针
同c
结构体
未赋值的部分会自动化为空值
结构体方法
有点像类的方法
type user struct {
name string
password string
}
// 带指针则可修改结构体,反之不可
func (u user) checkPassword(password string) bool {
return u.password == password
}
func main() {
a := user{name: "wang", password: "1024"}
fmt.Println(a.checkPassword("2048")) // true
}
错误处理
函数返回两个值中的其中一个代表错误,可通过errors.New("")创建
字符串操作
见包strings 注意中文长度
字符串格式化
%v 、%+v、%#v 自动,越来越详细
JSON
结构体公开字段首字母大写
type userInfo struct {
Name string
Age int `json:"age"` //序列化后是小写,应该是重命名
Hobby []string
}
序列化buf, err := json.Marshal(a)
反序列化json.Unmarshal(buf, &b)
时间
见包time
数字解析
见包 strconv
进程信息
包os、os/exec
线程
并发使用,注意堵塞以及锁的情况
go func
实战
猜数
简单
读取时采用Scan(&input)
在线词典
defer
延迟调用机制,在函数执行完毕后逆序执行
调用api简单方法
- 抓取请求
- 将请求转为go代码
- 将JSON改为go代码
- 更改相应值
- 发送回去
SOCKS5 代理服务器
开一个防火墙端口
遇到的问题
- Printf有格式化,Println没有