美文网首页Go
Go - 从零开发第一个Golang项目

Go - 从零开发第一个Golang项目

作者: 红薯爱帅 | 来源:发表于2021-03-17 00:17 被阅读0次
    Go语言编程之旅:一起用Go做项目

    1. 概述

    Go语言特性请参考我的上一篇文章,本文不再赘述啦:
    https://www.jianshu.com/p/2f56e491172d

    本文重点介绍Go语言开发环境的安装流程,以及第一个Golang项目的开发流程(来自上面那本书)。

    2. Go开发环境安装

    Windows10

    $ go env -w GO111MODULE=on
    $ go env -w GOPROXY=https://goproxy.cn,direct
    $ go env -w GOPATH=D:\golang
    

    Ubuntu20.04

    • 下载最新版本1.16.2,并配置env
    $ wget -c https://dl.google.com/go/go1.16.2.linux-amd64.tar.gz -O - | sudo tar -xz -C /usr/local
    $ sed -i '$a\export PATH=$PATH:/usr/local/go/bin' ~/.profile
    $ sed -i '$a\export GO111MODULE=on' ~/.profile
    $ sed -i '$a\export GOPROXY=https://goproxy.cn,direct' ~/.profile
    $ source ~/.profile
    $ go version
    go version go1.16.2 linux/amd64
    

    3. 从零创建一个Golang项目

    初始化项目,其中tour目录位置随意

    $ mkdir tour && cd tour
    $ go mod init test.com/shuzhang/tour  // will create go.mod file
    $ go get -u github.com/spf13/cobra    // will create go.sum file
    

    完善项目目录结构

    $ touch main.go
    $ mkdir -p cmd internal
    $ tree tour
    ├── main.go
    ├── go.mod
    ├── go.sum
    ├── cmd
    └── internal
    

    完善代码

    补充说明

    • 增加了makefile,汇总了一些常用的go命令
    BINARY_NAME=tour
    
    all: test install
    
    #compile:
    #   echo "Compiling for every OS and Platform"
    #   GOOS=freebsd GOARCH=386 go build -o bin/main-freebsd-386 main.go
    #   GOOS=linux GOARCH=386 go build -o bin/main-linux-386 main.go
    #   GOOS=windows GOARCH=386 go build -o bin/main-windows-386 main.go
    
    build:
        go build -mod readonly -o ${BINARY_NAME} main.go
    
    test:
        go test -v main.go
    
    run: build
        ./${BINARY_NAME}
    
    install: build
        cp ./${BINARY_NAME} ${GOPATH}/bin
    
    deps:
        go mod download
    
    clean:
        go clean
        rm ${BINARY_NAME} ${GOPATH}/bin
    
    • 增加了dockerfile,支持容器化部署
    FROM golang:1.16.2
    LABEL maintainer="zspishere@163.com"
    
    ENV GO111MODULE=on
    ENV GOPROXY=https://goproxy.cn,direct
    # ENV GOMAXPROCS=8
    
    RUN mkdir /code
    WORKDIR /code
    COPY . /code/
    RUN cd /code && make all
    
    ENTRYPOINT ["tour"]
    CMD ["time", "now"]
    
    • 启动测试
    $ docker build -t golang/tour .
    
    $ docker run golang/tour -h
    2021/03/16 15:36:11 maxprocs: Leaving GOMAXPROCS=8: CPU quota undefined
    2021/03/16 15:36:11 let us begin ...
    Usage:
       [command]
    
    Available Commands:
      help        Help about any command
      json        json转换和处理
      sql         sql转换和处理
      time        时间格式处理
      word        单词格式转换
    
    Flags:
      -h, --help   help for this command
    
    Use " [command] --help" for more information about a command.
    
    $ docker run golang/tour time now
    2021/03/16 15:36:05 maxprocs: Leaving GOMAXPROCS=8: CPU quota undefined
    2021/03/16 15:36:05 let us begin ...
    2021/03/16 15:36:05 输出结果: 2021-03-16 23:36:05, 1615908965
    
    $ docker run golang/tour json struct -s '{"a": 1, "xx": 234, "ss": {"a": 1, "xx": 234},"yy": "asdf", "listaa": ["asdf", "asdf"]}'
    2021/03/17 19:42:33 maxprocs: Leaving GOMAXPROCS=8: CPU quota undefined
    2021/03/17 19:42:33 let us begin ...
    2021/03/17 19:42:33 输出结果:
    type Tour struct {
    A float64
    Xx float64
    Ss map[string]interface {}
    Yy string
    Listaa []string
    }
    
    $ docker run golang/tour sql struct --host 10.20.3.233:33306 --password 123123 --table user --username root --db test
    2021/03/17 20:12:15 maxprocs: Leaving GOMAXPROCS=8: CPU quota undefined
    2021/03/17 20:12:15 let us begin ...
    type User struct {
             // 唯一ID
             Id     int32   `json:"id"`
             // 昵称
             Nickname       string  `json:"nickname"`
             // 姓名
             Name   string  `json:"name"`
             // 性别
             Sex    int8    `json:"sex"`
             // 部门
             Department     string  `json:"department"`
             // 生日
             Birthday       time.Time       `json:"birthday"`
             // 创建时间
             CreatedAt      time.Time       `json:"created_at"`
    }
    func (model User) TableName() string {
            return "user"
    
    • 启动mysql服务脚本
    $ docker run --name test-mysql \
         -v `pwd`/mysql:/var/lib/mysql \
         -e MYSQL_ROOT_PASSWORD=123123 \
         -p 33306:3306 \
         -d mysql
    

    4. 下一步计划

    主流的静态语言并不多,诸如C/C++、Java、C#、Go等,其中,Go凭借其自身优势,既利于项目开发迭代,又不失程序执行效率,逐渐被大厂认可。

    然而,Go的坑也很多,同时语言本身也在不断升级。路漫漫其修远兮,吾将上下而求索!下一步,将继续深入学习Web、高并发等场景的应用。

    补充:本文build的docker image比较大,近1G。在Production环境,可以直接使用debian镜像执行Go程序,114MB。

    相关文章

      网友评论

        本文标题:Go - 从零开发第一个Golang项目

        本文链接:https://www.haomeiwen.com/subject/vazjcltx.html