简介
优点
- 高性能、高并发
- 语法简单、学习曲线平缓
- 丰富的标准库
- 完善的工具链
- 静态链接
- 快速编译
- 跨平台
- 垃圾回收
基础
语法
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 7%2 == 0 {
fmt.Println("7 is even")
} else {
fmt.Println("7 is odd")
}
循环
仅有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")
}
数组
切片
可变长度数组
创建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
}
指针
同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
实战
猜数
简单
读取时可采用Scan(&input)
在线词典
defer
延迟调用机制,在函数执行完毕后逆序执行
百度api好像加密了,调取不到
调用api简单方法
- 抓取请求
- 将请求转为go代码
- 将JSON改为go代码
- 更改相应值
- 发送回去
SOCKS5 代理服务器
开一个防火墙端口
遇到的问题
- Printf有格式化,Println没有