这是我参与「第三届青训营 -后端场」笔记创作活动的的第1篇笔记
语法基础
- 程序入口包必须为
main - 变量声明
var name type =,常量根据上下文自动确定类型 if else必须大括号for循环和if else一样条件不需要括号switch { case x : }不需要breakswitch { case x : }switch 对象可以任意,甚至不写- 数组
var a [5]int用的少 - 切片
s := make([]string, 3), 长度可变s = append(s, "d") - map,
m := make(map[string]int) - range,类似迭代器,是一种遍历方式
- 函数,写法好奇怪
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
}
func (u user) checkPassword(password string) bool {
return u.password == password
}
func (u *user) resetPassword(password string) {
u.password = password
}
- 字符串操作与格式化
- JSON, 定义一个结构体每个属性以大写字母开头,那么即可序列化。使用
json.Marshal(obj)进行序列化,得到一个JSON对象,可以将其转为字符串。Marshal能够进行反序列化。 - 时间处理,操作与Java大致上类似。
- 字符串与数字间的转换。主要操作位于srconv包中,各种ParseXXX函数。
ParseInt三个参数分别为字符串、进制数、返回进制数
猜数字
题目、代码本身都很简单,需要注意的是:Go语言对Linux、mac、Windows的回车换行并没有很好的处理,因此实现的代码需要进行相应改动。 原代码中:
input = strings.TrimSuffix(input, "\n")
需要修改为:
input = strings.TrimSuffix(input, "\r\n")
使用Scanf之后需要使用:
var guess int
_, err := fmt.Scanf("%d\r\n", &guess)
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
maxNum := 100
rand.Seed(time.Now().UnixNano())
secretNumber := rand.Intn(maxNum)
// fmt.Println("The secret number is ", secretNumber)
fmt.Println("Please input your guess")
for {
var guess int
_, err := fmt.Scanf("%d\r\n", &guess)
if err != nil {
fmt.Println("Invalid input. Please enter an integer value")
continue
}
fmt.Println("You guess is", guess)
if guess > secretNumber {
fmt.Println("Your guess is bigger than the secret number. Please try again")
} else if guess < secretNumber {
fmt.Println("Your guess is smaller than the secret number. Please try again")
} else {
fmt.Println("Correct, you Legend!")
break
}
}
}
在线词典
题目很有意思,学会了一些工具。Go发HTTP请求感觉挺容易的。 两个工具网站:
https://curlconverter.com/#go
https://oktools.net/json2go
第一个对Edge支持不好。
第三题需要使用Go的协程和WaitGroup实现并发
func main() {
if len(os.Args) != 2 {
fmt.Fprintf(os.Stderr, `usage: simpleDict WORD
example: simpleDict hello
`)
os.Exit(1)
}
word := os.Args[1]
var wg sync.WaitGroup
wg.Add(2)
go func() {
defer wg.Done()
queryCaiyun(word)
}()
go func() {
defer wg.Done()
queryBaidu(word)
}()
wg.Wait()
//fmt.Println("以下是彩云")
//queryCaiyun(word)
//fmt.Println("--------------------------------------")
//fmt.Println("以下是百度")
//queryBaidu(word)
}
最终代码如下: