这是我参与「第三届青训营 -后端场」笔记创作活动的的第1篇笔记
- golang为强类型语言,所有变量都有其类型。
- string可以用+拼接,可以用=直接判断相等。
- 变量声明:
var name (type) = value自动推导类型name := valueconst name (type) = value常量声明,根据上下文推导变量类型
- 没有while循环,只有for循环
- switch 不需要显式加break
- 数组
var a [num]intb := [num]int{0,0,0}var twoD [row][col]int
- 切片/slice
s:= make([]string, len)s = append(s,"d")追加元素,需要赋值给原切片,因为追加时若发生扩容,会返回一个新切片。copy(c,s)切片拷贝s[start:end][start,end)
- map
m:= make(map[keyType]valueType)r, ok := m[key]delete(m, key)
- range
for i,num := range nums遍历数组for k,v := range m遍历map
- 函数
func add(a int, b int)(v int, ok bool){}
- 指针
- 传参 避免某些大值的拷贝开销
- 结构体
type user struct{
name string
password string}func (u *user) resetPassword(password string){
u.password = password
}
- 字符串格式化
fmt.Printf("p=%v\n",p)p={1,2}fmt.Printf("p=%+v\n",p)p={x:1,y:2}fmt.Printf("p=%#v\n",p)p=main.Point{x:1,y:2}
- Json
- 结构体变量大写字母开头,可以序列化为Json格式
buf, err := json.Marshal(a)fmt.Println(string(buf))
- 反序列化
var b userInfoerr = json.Unmarshal(buf,&b)fmt.Printf("#{b}\n")
- 结构体变量大写字母开头,可以序列化为Json格式
- 实战-guessingGame
rand.Intn(n),需要设置随机数种子,不然会一直随机出同一个数,一般是用程序启动时间.rand.Seed(time.Now().UnixNano())
- 命令行读入
reader := bufio.NewReader(os.Stdin)input, err := reader.ReadString('\n')按行读取input = strings.TrimSuffix(input,'\n')截去换行符guess, err := strconv.Atoi(input)将字符串转换为数字
- 实战-simpleDict
- 调用彩云小译的接口,使用post请求,[可以通过赋值粘贴curl命令生成代码](Convert curl commands to code (curlconverter.com))
- 定义结构体,序列化为json,再通过json传递数据到request中。
- 反序列化:使用代码生成JSON转Golang Struct - 在线工具 - OKTools
- 实战-Socket5
- 请求阶段 connect函数
- relay阶段
- Q&A
- 写代码时不需要首先考虑性能问题,只需要对热点代码进行性能修复。
- homework
fmt.Scanf接收两个参数,第一个参数用于每个给定元素的不同格式,第二个参数接收每个给定元素- 因为guessingGame接收数字,所以使用
_, err := fmt.Scanf("%d",&guess)即可 - 选用火山翻译作为第二个翻译引擎,request中包括text,language两个字段。
- 首先获取调用api时发送与返回的请求类型,构造相应的结构体,通过序列化与反序列化将其转换成json格式。
- 并发:使用waitGroup实现
wg:= sync.WaitGroup{}
wg.Add(2)
go func(){
dictResponse = queryCloud(word)
wg.Done()
}()
go func(){
volcanoResponse = queryVolcano(word)
wg.Done()
}()
wg.Wait()