Go语言进阶以及Gin学习| 青训营笔记

128 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 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来说少了许多代码.