Golang代码组织最佳方案

《Golang代码组织最佳方案》

案例一:不建议的偷懒结构

$gopath/src/github.com/ryanemax/device/pkg_phone/phone.go

$gopath/src/github.com/ryanemax/device/main.go

import "./pkg_phone"

案例二:Docker中也不建议的偷懒结构

gonet2示例:github.com/gonet2/game

Dockerfile # Docker环境文件
src/proto # 包proto
src/registry # 包registry
src/game/service.go # game主程
  import(
    "regitry"
    "proto"
    )

虽然docker中环境纯净,但多个$GOPATH中如果都存在src/registry名称的库,则会产生冲突。

最佳结构方式

# 案例一中
  import "github.com/ryanemax/device/pkg_phone"
# 案例二中
  import (
    "github.com/gonet2/src/registry"
    "github.com/gonet2/src/proto"
  )

《Golang实用的第三方库》

https://github.com/avelino/awesome-go

命令行应用开发库

Cobra,案例:Hugo

https://github.com/spf13/cobra

文本界面应用开发库

color 简单的命令行颜色输出

https://github.com/fatih/color

color

Termui 完整的命令行应用界面(基于https://github.com/nsf/termbox-go)

https://github.com/gizak/termui

termui

实用的原生库

encoding/hex

常用于解析网络通信协议中的BCD码流

pdata := byte[]{0x12,0x34,0x56,0x78}
data_imei := hex.EncodeToString(pdata[0:3])
fmt.Println(data_imei)
## 输出结果为12345678

strconv

常用与各数制与字符之间的转换

## 常规方式:转换int类型12,到二进制字符串
fint := strconv.FormatInt(12, 2)
fmt.Println("FormatBinary 12:", fint)
## 输出结果为1100


## 快捷方式:转换int类型12,到二进制字符串
bs := fmt.Sprintf("%b",12)
## bs输出结果为1100

## 快捷方式:转换任意数制到int类型
fmt.Printf("电压等级:%d\n", content[1])
plev, err := strconv.Atoi(fmt.Sprintf("%d", content[1]))
if err != nil {
        Warning(err.Error())
}
device.StatusPowerLev = plev

fmt.Printf("GSM信号强度等级:%d\n", content[2])
gsmlev, err := strconv.Atoi(fmt.Sprintf("%d", content[2]))
if err != nil {
        Warning(err.Error())
}
device.StatusGsmLev = gsmlev

## 快捷方式:Byte时间数据,转时间戳
## gpstime := []byte{0x0f, 0x0c, 0x0e, 0x11, 0x01, 0x0c}
func ParseTime(gpstime []byte) time.Time {
        //解析六个字节的时间数据为标准的时间戳
        var ts string
        for _, v := range gpstime {
        //将每个字节格式化输出成十进制字符串
                ts += fmt.Sprintf("%2d", v)
        }
        //替换格式化输出导致的整数高位空格
        ts = strings.Replace(ts, " ", "0", -1)

        //时间戳格式化
        const TimeFormat = "2006-01-02 15:04:05"
        t, err := time.Parse(TimeFormat, "20"+ts[0:2]+"-"+ts[2:4]+"-"+ts[4:6]+" "+ts[6:8]+":"+ts[8:10]+":"+ts[10:12])
        if err != nil {
                //Error(err.Error())
        }
        //Warning(err.Error())
        //Info("定位时间:", t)
        return t
}


微信扫一扫交流

作者:ryanemax
微信关注:ryanemax (刘雨飏)
本文出处:https://futurestack.cn/cookbook/backend/golangincase/
授权协议: CC BY-SA 4.0