Go语言初步实践 | 青训营笔记

57 阅读2分钟

这是我参与「第五届青训营 」笔记创作活动的第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
}