Go基础、猜谜游戏和简单字典程序|青训营笔记

185 阅读5分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第1篇笔记。
JAVA和C++ python都学过一些,此处仅记录和已知语言很不同的地方还有作业中遇到的问题

var

变量声明和赋值的两种方法

  1. var a int = 1
  2. a:= int(1)

const

无需指定类型,根据上下文推断

switch

和C++不同之处有二

  1. 无需额外break
  2. 可以不加变量,等于if

数组和切片

  1. 数组固定长度
    var a = [5]int
    a := [5]int{1,2,3,4,5}
  2. 切片可变长度,make申请
    s:=make([]string, 3)
    因此append要把返回值赋值到s
    s = append(s,'a')

map

申请一个键为string值为int的map
map := make(map[string]int)
访问一个键同时返回值和有无 r, ok := m["unknow"] 删除 delete(m, "one")

range

可迭代类型

m := map[string]string{"a": "A", "b": "B"}
for k, v := range m {
   fmt.Println(k, v) // b 8; a A
}

函数

类似python 可返回多值

func exists(m map[string]string, k string) (v string, ok bool) {
   v, ok = m[k]
   return v, ok
}

指针

简单使用 值传递->地址传递
*取内容 标明指针类型
&取地址

结构体

可以缺省赋值,.访问元素

type user struct {
   name     string
   password string
}

   a := user{name: "wang", password: "1024"}
   b := user{"wang", "1024"}
   c := user{name: "wang"}
   c.password = "1024"
    var d user
    d.name = "wang"
    d.password = "1024"

结构体方法

带指针和不带指针两种方式

func (u user) checkPassword(password string) bool {
   return u.password == password
}

func (u *user) resetPassword(password string) {
   u.password = password
}

错误处理

在返回值中处理

func findUser(users []user, name string) (v *user, err error) {
   for _, u := range users {
      if u.name == name {
         return &u, nil
      }
   }
   return nil, errors.New("not found")
}

string函数类似python

fmt打印

格式化输入输出 支持%v %+v %#v 不同等级打印

序列化

每个字段开头大写(公开字段)即可序列化和反序列化

type userInfo struct {
   Name  string
   Age   int `json:"age"`
   Hobby []string
}

buf, err := json.Marshal(a)
err = json.Unmarshal(buf, &b)

加tag变小写,反引号

Age   int `json:"age"`

时间

可以通过不同的方式 特别地,2006=yyyy,Sub可以得到多个时间实体的差值

t := time.now()  
t := time.Date(···)
time.Format("2006-01-02 15:04:05")  
time.Unix() 
diff := t2.Sub(t)

数字解析

strconv包 parseXXX和Atoi

进程信息

os解析输入参数 和 环境变量

fmt.Println(os.Args)           // [/var/folders/8p/n34xxfnx38dg8bv_x8l62t_m0000gn/T/go-build3406981276/b001/exe/main a b c d]
fmt.Println(os.Getenv("PATH")) // /usr/local/go/bin...
fmt.Println(os.Setenv("AA", "BB"))

exec启动子进程并获得输出

Go基础|青训营笔记

这是我参与「第三届青训营 -后端场」笔记创作活动的的第1篇笔记

var

变量声明和赋值的两种方法

  1. var a int = 1
  2. a:= int(1)

const

无需指定类型,根据上下文推断

switch

和C++不同之处有二

  1. 无需额外break
  2. 可以不加变量,等于if

数组和切片

  1. 数组固定长度
    var a = [5]int
    a := [5]int{1,2,3,4,5}
  2. 切片可变长度,make申请
    s:=make([]string, 3)
    因此append要把返回值赋值到s
    s = append(s,'a')

map

申请一个键为string值为int的map
map := make(map[string]int)
访问一个键同时返回值和有无 r, ok := m["unknow"] 删除 delete(m, "one")

range

可迭代类型

m := map[string]string{"a": "A", "b": "B"}
for k, v := range m {
   fmt.Println(k, v) // b 8; a A
}

函数

类似python 可返回多值

func exists(m map[string]string, k string) (v string, ok bool) {
   v, ok = m[k]
   return v, ok
}

指针

简单使用 值传递->地址传递
*取内容 标明指针类型
&取地址

结构体

可以缺省赋值,.访问元素

type user struct {
   name     string
   password string
}

   a := user{name: "wang", password: "1024"}
   b := user{"wang", "1024"}
   c := user{name: "wang"}
   c.password = "1024"
    var d user
    d.name = "wang"
    d.password = "1024"

结构体方法

带指针和不带指针两种方式

func (u user) checkPassword(password string) bool {
   return u.password == password
}

func (u *user) resetPassword(password string) {
   u.password = password
}

错误处理

在返回值中处理

func findUser(users []user, name string) (v *user, err error) {
   for _, u := range users {
      if u.name == name {
         return &u, nil
      }
   }
   return nil, errors.New("not found")
}

string函数类似python

fmt打印

格式化输入输出 支持%v %+v %#v 不同等级打印

序列化

每个字段开头大写(公开字段)即可序列化和反序列化

type userInfo struct {
   Name  string
   Age   int `json:"age"`
   Hobby []string
}

buf, err := json.Marshal(a)
err = json.Unmarshal(buf, &b)

加tag变小写,反引号

Age   int `json:"age"`

时间

可以通过不同的方式 特别地,2006=yyyy,Sub可以得到多个时间实体的差值

t := time.now()  
t := time.Date(···)
time.Format("2006-01-02 15:04:05")  
time.Unix() 
diff := t2.Sub(t)

数字解析

strconv包 parseXXX和Atoi

进程信息

os解析输入参数 和 环境变量

fmt.Println(os.Args)           // [/var/folders/8p/n34xxfnx38dg8bv_x8l62t_m0000gn/T/go-build3406981276/b001/exe/main a b c d]
fmt.Println(os.Getenv("PATH")) // /usr/local/go/bin...
fmt.Println(os.Setenv("AA", "BB"))

exec启动子进程并获得输出

猜谜游戏

主要是在windows系统中换行是\r\n,由此引发的一些错误
修改前_, err := fmt.Scanf("%d\n", &guess)
修改后_, err := fmt.Scanf("%d\r\n", &guess)
对于另外一种输入则应去除后缀中的\r\n而非仅\n
修改前input, err := reader.ReadString('\n')
修改后input, err := reader.ReadString('\r\n')

简单字典程序

  1. windows下获取F12查看网络状态,并且复制为curl
  2. 通过curl转go网站翻译成go语句生成request请求
  3. 进一步优化,是的程序根据输入参数 生成报文进行json序列化,相应的反序列化响应
  4. 使用结构体辅助序列化 json转结构体网站

在查看百度翻译的调用过程中sugv2transapi?from=en&to=zh均为查询结果。
其中sug的请求只需要查询单词 image.png 按照课程教程可以得到正常返回 image.png

v2transapi?from=en&to=zh需要输入更多的参数,响应的json也不同,以相同方法请求该地址的返回报文响应状态码是200 OK,返回却为空值。 image.png