这是我参与「第三届青训营 -后端场」笔记创作活动的的第1篇笔记。
JAVA和C++ python都学过一些,此处仅记录和已知语言很不同的地方还有作业中遇到的问题
var
变量声明和赋值的两种方法
var a int = 1a:= int(1)
const
无需指定类型,根据上下文推断
switch
和C++不同之处有二
- 无需额外break
- 可以不加变量,等于if
数组和切片
- 数组固定长度
var a = [5]int
a := [5]int{1,2,3,4,5} - 切片可变长度,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
变量声明和赋值的两种方法
var a int = 1a:= int(1)
const
无需指定类型,根据上下文推断
switch
和C++不同之处有二
- 无需额外break
- 可以不加变量,等于if
数组和切片
- 数组固定长度
var a = [5]int
a := [5]int{1,2,3,4,5} - 切片可变长度,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')
简单字典程序
- windows下获取F12查看网络状态,并且复制为curl
- 通过curl转go网站翻译成go语句生成request请求
- 进一步优化,是的程序根据输入参数 生成报文进行json序列化,相应的反序列化响应
- 使用结构体辅助序列化 json转结构体网站
在查看百度翻译的调用过程中sug和v2transapi?from=en&to=zh均为查询结果。
其中sug的请求只需要查询单词
按照课程教程可以得到正常返回
v2transapi?from=en&to=zh需要输入更多的参数,响应的json也不同,以相同方法请求该地址的返回报文响应状态码是200 OK,返回却为空值。