这是我参与「第五届青训营」伴学笔记创作活动的第 1 天
1 基础语法
-
Hello Word
package main import ( "fmt" ) func main(){ fmt.Println("hello world") } -
变量
var a int = 1 // 先写变量名,再写变量类型 var b, c int = 1, 2 // 多个变量 var d = true // 可以不写变量类型,编译器自动识别 var e float64 // 未初始化变量 f := float32(e) // := 简化方式【实际用的多】 const s string = "constant" // 常量 -
for
可省略递增和初始条件,省略全部就是死循环,没有while
for { fmt.Println("loop") break } for j := 7; j < 9; j++ { fmt.Println(j) } -
if-else
if条件没有括号
if条件里可以赋值,其赋值的变量作用域在这个if语句里
if num := 9; num < 0 { fmt.Println(num, "is negative") } -
switch
switch会自动break,除非使用fallthrough;switch后面可以没有表达式
t := time.Now() switch { case t.Hour() < 12: fmt.Println("It's before noon") default: fmt.Println("It's after noon") } -
array
数组是值类型,go一般不直接使用数组
b := [5]int{1, 2, 3, 4, 5} -
slice
Slice本身没有数据,是对底层array的一个view
slice可以向后扩展。不可以向前扩展
s[i]不可以超越len(s),向后扩展不可以超爷底层数组cap(s)
添加元素时,如果超越cap,系统会重新分配更大的底层数组
由于值传递的关系,必须接收append的返回值
s = append(s, val)arr := [...]int{0, 1, 2, 3, 4, 5, 6, 7} s1 := arr[2:6] s2 := s1[3:5] fmt.Println(s1) // [2 3 4 5] fmt.Println(s2) //[5 6] // 创建 s3 := make([]int, 10, 32) // 复制 copy(s2, s1) // 删除 s2 = append(s2[:3], s2[4:]...) -
map
map[K]V, map[K1]map[K2]V
创建:make(map[string]int)
获取元素:m[key]
key不存在时,获得Value类型的初始值
用valus,ok:=m[key]来判断是否存在key
用delete删除一个key
使用range遍历key、value
不保证遍历顺序,如需排序,需要手动对key排序
使用len获得元素个数
map的key:map使用哈希表,必须可以比较相等,除了slice,map,function的内建类型都可以作为key,Struct类型不包含上述字段也可以作为key
func main() { m := map[string]string{ "name": "mys", "course": "golang", } m2 := make(map[string]int) // empty map var m3 map[string]int // nil fmt.Println(m, m2, m3) // 遍历 for k, v := range m { fmt.Println(k, v) // key在map里是无序的 } // 获取 courseName, ok := m["course"] fmt.Println(courseName, ok) // golang true // 删除 name, ok := m["name"] // 判断是否存在 fmt.Println(name, ok) // mys true delete(m, "name") name, ok = m["name"] fmt.Println(name, ok) // false } -
func
返回值类型写在最后面
可以返回多个返回值,注意两个返回值常用场景:
(res, error)函数可作为参数
没有默认参数、可选参数,只有可变参数列表
-
point
-
struct
仅支持封装,不支持继承和多态
不论地址还是结构本身,一律使用
.来访问成员type user struct { name string password string } -
string
-
json
-
time
-
strconv
-
env
2 实战案例
1 猜谜游戏
package main
import (
"bufio"
"fmt"
"math/rand"
"os"
"strconv"
"strings"
"time"
)
func main() {
maxNum := 100
rand.Seed(time.Now().UnixNano()) // 设置时间的随机数种子
secretNumber := rand.Intn(maxNum) // 生成一个[0,n)的随机数
num := 1
fmt.Println("Please input your guess")
reader := bufio.NewReader(os.Stdin) // 从标准输入生成读对象
for {
input, err := reader.ReadString('\n')
if err != nil {
fmt.Println("error, try again", err)
}
input = strings.Trim(input, "\r\n")
guess, err := strconv.Atoi(input) // 将输入的字符串转换为int类型
if err != nil {
fmt.Println("Invalid input,enter again")
continue
}
fmt.Println("you guess is", guess)
if guess > secretNumber {
fmt.Println("bigger")
num++
} else if guess < secretNumber {
fmt.Println("smaller")
num++
} else {
fmt.Println("correct")
fmt.Printf("num = %v", num)
break
}
}
}
2 在线词典
package main
import (
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"log"
"net/http"
)
type DictRequest struct {
TransType string `json:"trans_type"`
Source string `json:"source"`
UserID string `json:"user_id"`
}
type DictResponse struct {
Rc int `json:"rc"`
Wiki struct {
KnownInLaguages int `json:"known_in_laguages"`
Description struct {
Source string `json:"source"`
Target interface{} `json:"target"`
} `json:"description"`
ID string `json:"id"`
Item struct {
Source string `json:"source"`
Target string `json:"target"`
} `json:"item"`
ImageURL string `json:"image_url"`
IsSubject string `json:"is_subject"`
Sitelink string `json:"sitelink"`
} `json:"wiki"`
Dictionary struct {
Prons struct {
EnUs string `json:"en-us"`
En string `json:"en"`
} `json:"prons"`
Explanations []string `json:"explanations"`
Synonym []string `json:"synonym"`
Antonym []string `json:"antonym"`
WqxExample [][]string `json:"wqx_example"`
Entry string `json:"entry"`
Type string `json:"type"`
Related []interface{} `json:"related"`
Source string `json:"source"`
} `json:"dictionary"`
}
func query(word string) {
client := &http.Client{}
request := DictRequest{TransType: "en2zh", Source: word}
buf, err := json.Marshal(request) // 将数据结构转为json字符串
if err != nil {
log.Fatal(err)
}
var data = bytes.NewReader(buf)
req, err := http.NewRequest("POST", "https://api.interpreter.caiyunai.com/v1/dict", data)
if err != nil {
log.Fatal(err)
}
req.Header.Set("Connection", "keep-alive")
req.Header.Set("DNT", "1")
req.Header.Set("os-version", "")
req.Header.Set("sec-ch-ua-mobile", "?0")
req.Header.Set("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36")
req.Header.Set("app-name", "xy")
req.Header.Set("Content-Type", "application/json;charset=UTF-8")
req.Header.Set("Accept", "application/json, text/plain, */*")
req.Header.Set("device-id", "")
req.Header.Set("os-type", "web")
req.Header.Set("X-Authorization", "token:qgemv4jr1y38jyq6vhvi")
req.Header.Set("Origin", "https://fanyi.caiyunapp.com")
req.Header.Set("Sec-Fetch-Site", "cross-site")
req.Header.Set("Sec-Fetch-Mode", "cors")
req.Header.Set("Sec-Fetch-Dest", "empty")
req.Header.Set("Referer", "https://fanyi.caiyunapp.com/")
req.Header.Set("Accept-Language", "zh-CN,zh;q=0.9")
req.Header.Set("Cookie", "_ym_uid=16456948721020430059; _ym_d=1645694872")
resp, err := client.Do(req)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
bodyText, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
if resp.StatusCode != 200 {
log.Fatal("bad StatusCode:", resp.StatusCode, "body", string(bodyText))
}
var dictResponse DictResponse
err = json.Unmarshal(bodyText, &dictResponse) // 字符串转为数据结构
if err != nil {
log.Fatal(err)
}
fmt.Printf("%#v\n", dictResponse)
fmt.Printf(word, "UK:", dictResponse.Dictionary.Prons.En, "US:", dictResponse.Dictionary.Prons.EnUs)
for _, item := range dictResponse.Dictionary.Explanations {
fmt.Println(item)
}
}
func main() {
// if len(os.Args) != 2 {
// fmt.Fprintf(os.Stderr, `usage: simpleDict WORD
//example: simpleDict hello
//`)
// os.Exit(1)
// }
// word := os.Args[1]
word := "hello"
query(word)
}