这是我参与「第五届青训营 」笔记创作活动的第2天 1.并发 和 并行 Go语言可以充分发挥多核优势高效运行。 1.1Goroutine 协程: 用户态,轻量级线程,栈MB级别 线程:内核态,线程跑多个协程 我们可以用以下代码来实现。
package concurrence
import (
"fmt"
"sync"
)
func hello(i int) {
println("hello world : " + fmt.Sprint(i))
}
func ManyGo() {
var wg sync.WaitGroup
for i := 0; i < 5; i++ {
wg.Add(1)
go func(j int) {
defer wg.Done()
hello(j)
}(i)
}
wg.Wait()
}
1.2 Channel 分为有缓冲和无缓冲 有缓冲可以定义缓冲的数量。
package concurrence
func CalSquare() {
src := make(chan int)
dest := make(chan int, 3)
go func() {
defer close(src)
for i := 0; i < 10; i++ {
src <- i
}
}()
go func() {
defer close(dest)
for i := range src {
dest <- i * i
}
}()
for i := range dest {
println(i)
}
}
以下代码可以实现协程发出数字,计算数字,然后主协程发出计算的数字 1.3 Lock锁的应用 和Java类似都是使用互斥锁来保证运行时不会卡住以及高效率运行。 1.4WaitGroup 通过调用函数来实现计数器以及控制程序。 2。Go的依赖管理 和Java用来依赖管理的maven类似 3.单元测试 对于程序来说很重要的一个东西。保证运行时尽可能的减少可能出现的错误。以免影响程序的上线。 4.4项目实践 可以分为三层:数据层,逻辑层,视图层。下层为上层服务,上层不可见下层。
package repository
import (
"github.com/Moonlight-Zhao/go-project-example/util"
"sync"
"time"
)
type Topic struct {
Id int64 `gorm:"column:id"`
UserId int64 `gorm:"column:user_id"`
Title string `gorm:"column:title"`
Content string `gorm:"column:content"`
CreateTime time.Time `gorm:"column:create_time"`
}
func (Topic) TableName() string {
return "topic"
}
type TopicDao struct {
}
var topicDao *TopicDao
var topicOnce sync.Once
func NewTopicDaoInstance() *TopicDao {
topicOnce.Do(
func() {
topicDao = &TopicDao{}
})
return topicDao
}
func (*TopicDao) QueryTopicById(id int64) (*Topic, error) {
var topic Topic
err := db.Where("id = ?", id).Find(&topic).Error
if err != nil {
util.Logger.Error("find topic by id err:" + err.Error())
return nil, err
}
return &topic, nil
}
我们可以定义一个Repository索引。 service 函数
package service
import (
"errors"
"fmt"
"github.com/Moonlight-Zhao/go-project-example/repository"
"sync"
)
type TopicInfo struct {
Topic *repository.Topic
User *repository.User
}
type PostInfo struct {
Post *repository.Post
User *repository.User
}
type PageInfo struct {
TopicInfo *TopicInfo
PostList []*PostInfo
}
func QueryPageInfo(topicId int64) (*PageInfo, error) {
return NewQueryPageInfoFlow(topicId).Do()
}
func NewQueryPageInfoFlow(topId int64) *QueryPageInfoFlow {
return &QueryPageInfoFlow{
topicId: topId,
}
}
type QueryPageInfoFlow struct {
topicId int64
pageInfo *PageInfo
topic *repository.Topic
posts []*repository.Post
userMap map[int64]*repository.User
}
func (f *QueryPageInfoFlow) Do() (*PageInfo, error) {
if err := f.checkParam(); err != nil {
return nil, err
}
if err := f.prepareInfo(); err != nil {
return nil, err
}
if err := f.packPageInfo(); err != nil {
return nil, err
}
return f.pageInfo, nil
}
func (f *QueryPageInfoFlow) checkParam() error {
if f.topicId <= 0 {
return errors.New("topic id must be larger than 0")
}
return nil
}