GO实战项目一 ——社区话题页面 | 青训营笔记

97 阅读2分钟

这是我参与「第五届青训营」伴学笔记创作活动的第 2 天。

bluebird.png

GO实战项目一 ———— 社区话题页面

一、项目需求

1.1 需求描述

  • 展示话题(标签、文字描述)、回帖列表
  • 话题和回帖数据用文件存储
  • 暂时不考虑前端页面实现仅仅实现一个本地web服务

1.2 需求用例

浏览消费用户

ness1.png

1.3 ER图——Entity Relationship Diagram

  • 话题
  • 帖子

ER.png

1.4 分层结构

  • 数据层————数据Model 外部数据的增删改查
  • 逻辑层————业务Entity 处理核心业务逻辑输出
  • 视图层————视图view 处理和外部的交互逻辑

分层.png

二、主要代码

主函数代码编排

    package main

import (
        "os"

"github.com/Moonlight-Zhao/go-project-example/cotroller"
"github.com/Moonlight-Zhao/go-project-example/repository"
"gopkg.in/gin-gonic/gin.v1"
)

func main() {
if err := Init("./data/"); err != nil {
	os.Exit(-1)
}
r := gin.Default()
r.GET("/community/page/get/:id", func(c *gin.Context) {
	topicId := c.Param("id")
	data := cotroller.QueryPageInfo(topicId)
	c.JSON(200, data)
})
err := r.Run()

if err != nil {
	return
}
}

func Init(filePath string) error {
if err := repository.Init(filePath); err != nil {
	return err
}
return nil
}

cotroller

package cotroller

import (
"strconv"

"github.com/Moonlight-Zhao/go-project-example/service"
)

type PageData struct {
        Code int64       `json:"code"`
        Msg  string      `json:"msg"`
        Data interface{} `json:"data"`
}
func QueryPageInfo(topicIdStr string) *PageData {
topicId, err := strconv.ParseInt(topicIdStr, 10, 64)
if err != nil {
	return &PageData{
		Code: -1,
		Msg:  err.Error(),
	}
}
pageInfo, err := service.QueryPageInfo(topicId)
if err != nil {
	return &PageData{
		Code: -1,
		Msg:  err.Error(),
	}
}
return &PageData{
	Code: 0,
	Msg:  "success",
	Data: pageInfo,
}

}

concurrence代码

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)
}
}

goroutine代码

package concurrence

import (
"fmt"
"time"
)

func hello(i int) {
        println("hello goroutine : " + fmt.Sprint(i))
}

func HelloGoRoutine() {
for i := 0; i < 5; i++ {
	go func(j int) {
		hello(j)
	}(i)
}
time.Sleep(time.Second)
}

scny代码

  package concurrence

import (
"sync"
"time"
)

var (
x    int64
lock sync.Mutex
)

func addWithLock() {
for i := 0; i < 2000; i++ {
	lock.Lock()
	x += 1
	lock.Unlock()
}
}
func addWithoutLock() {
for i := 0; i < 2000; i++ {
	x += 1
}
}

func Add() {
x = 0
for i := 0; i < 5; i++ {
	go addWithoutLock()
}
time.Sleep(time.Second)
println("WithoutLock:", x)
x = 0
for i := 0; i < 5; i++ {
	go addWithLock()
}
time.Sleep(time.Second)
println("WithLock:", x)
}

func ManyGoWait() {
var wg sync.WaitGroup
wg.Add(5)
for i := 0; i < 5; i++ {
	go func(j int) {
		defer wg.Done()
		hello(j)
	}(i)
}
wg.Wait()
}