这是我参与「第五届青训营 」伴学笔记创作活动的第 6 天
一.并发:
1.1协程:
协程:用户态,轻量级线程,栈MB级别
线程:内核态,线程跑多个协程,栈KB级别
1.2CSP:
协程之间的通信:
go是提倡通信共享内存而不是通过共享内存而实现通信
1.3Channel
无缓冲通道 make(chan int)也叫同步通道
有缓冲通道 make(chan int,2)
1.4并发安全Lock
对协程进行加锁
lock.Lock()
1.5WaitGroup
不知道子协程的时间,所以无法精确sleep时间
使用WaitGroup优化Seelp
总结:
Goroutine,Channel,Sync
二.依赖管理:
1.背景:
工程项目不可能基于标准库从0到1的搭建
管理依赖库
2.依赖管理:
2.1.1GOPATH:
环境变量,
项目代码直接依赖src下的代码
弊端:
无法实现package的多版本控制
2.1.2Go Vendor
弊端:
无法控制依赖版本
更新项目可能出现依赖问题
2.1.3Go Module
通过go.mod文件管理依赖包版本
通过go get/go mod指令工具管理依赖包
2.2依赖管理三要素
配置文件(go.mod),中心仓库(proxy),本地工具(go get/mod)
2.3.5依赖分发
通过Proxy获取依赖,而不是直接从Github,SVN等上面拿
2.3.6变量GOPROXY
GOPROXY="proxy1.cn,https://proxy2.cn,…"
direct是源站
2.3.7工具-go get
2.3.8工具-go mod
Init 初始化 ,创建go.mod
Download 下载模块到本地缓存
tidy 增加需要的依赖,删除不需要的依赖
三.测试:
回归测试,集成测试,单元测试
3.1单元测试:
输入,输出,期望校对,测试单元
3.1.1单元测试-规则
所有测试文件都以_test.go结尾
func TestXxx(*testing.T)
初始化逻辑放到TestMain中
四:项目实践:
4.1需求描述:
社区话题页面
展示话题(标题,文字描述)和回帖列表
暂不考虑前端页面实现,仅仅实现一个本地web服务
话题和回贴数据用文件存储
4.2需求用列
浏览消费用户
TopicPage:
User->Topic
User->PostList
4.4分层结构
File->Repository->Service->Controller->Client
数据层:数据Model,外部数据的增删改查
逻辑层:业务Entity,处理核心业务逻辑输出
视图层:视图view,处理和外部的交互逻辑
4.5组件工具
五.Gin框架学习:
一个小demo:
package main
import (
"encoding/json"
"fmt"
"github.com/gin-gonic/gin"
"net/http"
)
func main() {
r := gin.Default()
r.GET("/ping", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "pong",
})
})
//传统传参方式
r.GET("/user/info", func(context *gin.Context) {
userid := context.Query("userid")
username := context.Query("username")
context.JSON(http.StatusOK, gin.H{
"userid": userid,
"username": username,
})
})
//Restful风格
r.GET("/user/info/:userid/:username", func(context *gin.Context) {
userid := context.Param("userid")
username := context.Param("username")
context.JSON(http.StatusOK, gin.H{
"userid": userid,
"username": username,
})
})
//前端给后端传json
r.POST("/json", func(context *gin.Context) {
data, _ := context.GetRawData()
var m map[string]any
c := json.Unmarshal(data, &m)
context.JSON(http.StatusOK, m)
fmt.Println(c)
})
r.Run(":8082") // 监听并在 0.0.0.0:8082 上启动服务
}
总结:作为长期使用java进行开发的我来说,gin的框架让人眼前一亮,除了go语言本身的高性能以外,他的开发框架也让人感到舒适,个人感觉对比java来说少了许多代码.