课程概述
- Go语言简介
- Go语言开发环境、基础语法、标准库
- 实践开发
简介
Go语言是Google公司开发的静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言,于2009年正式推出并开放了源代码项目。 Go语言又习惯称Golang(原因是Go.org已经被注册,所以Go语言用golang.org作为官网,并且它流行起来之前搜索引擎搜索Go这样一个简单的词汇很难搜索到相关内容,所以人们使用Golang作为关键词,一直延续到今天)
特点
- 高性能、高并发
- 语法简单、学习曲线平缓
- 丰富的标准库
- 完善的工具链
- 静态链接
- 快速编译
- 跨平台
- 垃圾回收
目前 Go 语言支持 Windows、Linux 等多个平台,也可以直接在 Android 和 iOS 等移动端执行,从业务角度来看,Go 语言在云计算、微服务、大数据、区块链、物联网、人工智能等领域都有广泛的应用,国内外有约来越多的公司使用Go语言作为主要开发语言
快速入门
开发环境
可以选择VsCode、Goland等主流IDE进行开发, 甚至可以使用基于云的开发环境,例如:gitpod.io/#github.com…
基础语法
- 循环:for语句而没有while语句
- switch语句也去掉了繁琐的小括号和break语句
- 数组:相对不那么灵活(定长),我们常常使用切片进行灵活的操作
- map,就是哈希表,类似于c++的方式存取
- for range语句,类似于其他语言的for-each语句,但是Go语言可以同时获取集合的下标和值
- 函数:比较有特点的是,Go语言的函数可以有多个返回值,一般是一个正常的返回值,外加错误信息
- 指针:相比C++的指针,受到了很大的限制
- 结构体:Go语言没有类这样一个概念,我们用结构体和接口模拟面向对象
- 结构体方法:可以将函数标记为某个结构体的方法,类似于其他语言的类的成员方法
- 错误处理:一般通过error类包装返回错误信息
实践开发
猜谜小游戏
完成这样一个小实践,体会了:
- 随机数种子、随机数的使用
- 读取用户的输入
- 循环、选择、switch的使用
- 简单的异常处理
- 字符串的处理、转化
给出一个100以内的随机数作为谜底,输入一个数进行比较,如果与谜底不同会提示是偏大还是偏小,直到猜出正确答案为止,源代码如下:
package main
import (
"bufio"
"fmt"
_ "github.com/go-sql-driver/mysql"
"math/rand"
"os"
"strconv"
"strings"
"time"
)
func main() {
//获取secret
rand.Seed(time.Now().Unix())
intn := rand.Intn(100)
reader := bufio.NewReader(os.Stdin)
fmt.Println("please enter a number in 100")
for {
readString, err := reader.ReadString('\n')
if err != nil {
fmt.Println("read a number failed", err)
continue
}
readString = strings.Trim(readString, "\n")
guessNumber, err := strconv.Atoi(readString)
if err != nil {
fmt.Println("please enter a number not others", err)
continue
}
switch {
case guessNumber == intn:
fmt.Println("you are right!")
break
case guessNumber < intn:
fmt.Println("the number you guessed is smaller than the right answer")
case guessNumber > intn:
fmt.Println("the number you guessed is larger than the right answer")
}
}
}
演示结果如下:
在线词典
通过在线调用翻译网站的API,实现简单的翻译功能,主要涉及到http包的使用,实现api调用和接收并处理返回的数据。代码如下:
package main
import (
"bufio"
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"log"
"net/http"
"os"
"strings"
)
type Data struct {
TransType string `json:"trans_type"`
Source string `json:"source"`
UserId string `json:"user_id"`
}
type DicResponse 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 main() {
//读取数据
reader := bufio.NewReader(os.Stdin)
word, _ := reader.ReadString('\n')
word = strings.Trim(word, "\n")
//封装数据
client := &http.Client{}
//var data = strings.NewReader(`{"trans_type":"en2zh","source":"good"}`)
request := Data{
TransType: "en2zh",
Source: word,
}
buffer, _ := json.Marshal(request)
data := bytes.NewReader(buffer)
req, err := http.NewRequest("POST", "https://api.interpreter.caiyunai.com/v1/dict", data)
if err != nil {
log.Fatal(err)
}
req.Header.Set("authority", "api.interpreter.caiyunai.com")
req.Header.Set("accept", "application/json, text/plain, */*")
req.Header.Set("accept-language", "zh-CN,zh;q=0.9")
req.Header.Set("app-name", "xy")
req.Header.Set("content-type", "application/json;charset=UTF-8")
req.Header.Set("device-id", "")
req.Header.Set("origin", "https://fanyi.caiyunapp.com")
req.Header.Set("os-type", "web")
req.Header.Set("os-version", "")
req.Header.Set("referer", "https://fanyi.caiyunapp.com/")
req.Header.Set("sec-ch-ua", `"Not?A_Brand";v="8", "Chromium";v="108", "Google Chrome";v="108"`)
req.Header.Set("sec-ch-ua-mobile", "?0")
req.Header.Set("sec-ch-ua-platform", `"macOS"`)
req.Header.Set("sec-fetch-dest", "empty")
req.Header.Set("sec-fetch-mode", "cors")
req.Header.Set("sec-fetch-site", "cross-site")
req.Header.Set("user-agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36")
req.Header.Set("x-authorization", "token:qgemv4jr1y38jyq6vhvi")
//发送请求
resp, err := client.Do(req)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
//获取response,解析数据
bodyText, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
var response DicResponse
json.Unmarshal(bodyText, &response)
fmt.Println(word, "UK:", response.Dictionary.Prons.En, "US:", response.Dictionary.Prons.EnUs)
for _, x := range response.Dictionary.Explanations {
fmt.Println(x)
}
}
运行结果如下: