Write the Code. Change the World.

分类目录
9月 06

使用 goframe 遇到的一些情况

  • 因为 laravel 有 artisan,migrate 等工具。无论用 go 的哪个框架(目前至少了解过 gen 和 goframe),都没有类似比价好用的 cli 工具。 goframe 虽然有 gen,但还是没 laravel 的好用,并且没有数据库迁移,seeder。因为 laravel 熟,可以使用 laravel 来写数据迁移和 seeder。用 goframe 来写项目。在使用 gf gen dao 的时候很有用。 再说一下 gf gen dao 也是真好用。

  • 默认的 validate,错误直接以 200 状态码返回。无论什么返回,都会包上一层。这个有点不太好。一般项目,我只关心成功和失败。失败比如 401 无权限,403 拒绝请求,429 请求频率太高等等。有明确的状态吗,用户也好理解,也不用在返回实体部分包裹一层 code data 啥的。

  • 数据库表的认知。在 laravel 项目中,数据库表名都是复数的,个人也感觉复数更容易描述表的意义。 goframe 这边习惯用单数。还有时间字段。laravel 习惯用 created_at,updated_at。而 goframe 这边习惯 create_at 和 update_at。 这些习惯克服一下不是啥难事。

  • gf gen ctrl 的方式可以更方便的去处理路由(使得整个项目规范起来,命名,调用等等)。laravel 新建路由组,比如 api,比如 web,比如 console 等等。通过 gf gen ctrl 以及 goframe 的路由,也能方便轻松实现。

9月 05

https://github.com/danceyoung/paper-code/blob/master/package-oriented-design/packageorienteddesign.md

本篇内容主要讲解golang项目的面向包设计准则和基础的架构分层。

信息来自原文

内容进行翻译、加工、整合及结合个人的实践经验,并附有一个真实的例子来解释本篇内容。

当然你也可以直接阅读英文原文。

当然高手如云,只是懒得写罢了。

百年太久,只争朝夕,不负韶华,不枉少年,来日怎方长。

继续阅读

7月 28

很多时候,都是终端里看信息。多色的信息就很好看了。我是一个实在人,就从零开始搞一个。其实是别人搞好了,我拿来用。

开始

终端高亮,我们用这个 https://github.com/mgutz/ansi

先建立一个 go 项目

mkdir artisan 
cd artisan 
go mod init artisan

再安装 ansi

go get github.com/mgutz/ansi

然后再封装一个调用方法包

mkdir -p pkg/console
touch pkg/console/console.go

console.go

// Package console 命令行辅助方法
package console

import (
    "fmt"
    "os"

    "github.com/mgutz/ansi"
)

// Success 打印一条成功消息,绿色输出
func Success(msg string) {
    colorOut(msg, "green")
}

// Error 打印一条报错消息,红色输出
func Error(msg string) {
    colorOut(msg, "red")
}

// Warning 打印一条提示消息,黄色输出
func Warning(msg string) {
    colorOut(msg, "yellow")
}

// Exit 打印一条报错消息,并退出 os.Exit(1)
func Exit(msg string) {
    Error(msg)
    os.Exit(1)
}

// ExitIf 语法糖,自带 err != nil 判断
func ExitIf(err error) {
    if err != nil {
        Exit(err.Error())
    }
}

// colorOut 内部使用,设置高亮颜色
func colorOut(message, color string) {
    fmt.Fprintln(os.Stdout, ansi.Color(message, color))
}

最后,新建一个 main.go 然后,调用

touch main.go

package main

import "artisan/pkg/console"

func main() {
    console.Success("多少恨昨夜梦魂中,还似旧时游上苑。车如流水马如龙,花月正春风。")
}

go run main.go

这个时候就可以看到绿色的输出了。

6月 17

在做 go 测试的时候,经常会有端口被使用,而没停止。停掉该进程就很有必要。

操作一波

# 以 3000 端口为例
lsof -i:3000

# 通过 lsof 命令找到 pid ,杀掉 pid
kill -9 xxxx
6月 15

利用air(git)实现 go 项目的热重启。安装完 air 后,运行 air 出现 zsh: command not found: air 报错。air 是安装在 gopath 的 bin 目录下,终端找不到这个文件。

解决方法

vim ~/.zshrc

# 在末尾追加下边语句,保存
alias air='$(go env GOPATH)/bin/air'

# source 使得配置生效
source ~/.zshrc

再运行 air 发现就可以了。如果不行,是终端对应的配置文件不是这个。

  __    _   ___
 / /\  | | | |_)
/_/--\ |_| |_| \_ , built with Go

可是,如果又安装了一个呢。是不是又得再加。这样好麻烦。把 GOPATH BIN 目录加入到环境变量中就可以了的。

vim ~/.zshrc

# 加入下边的,保存
export PATH="$(go env GOPATH)/bin:$PATH"

# source 使得配置生效
source ~/.zshrc
12月 29

在一个项目中,环境变量,配置文件这些都是一个很重要的环节。设计好了,体验也会不一般。在 go 中,使用 viper 来构造一个这样的配置环境。

https://github.com/spf13/viper

开始之前

  • 在开始之前,我们已经熟悉了 laravel 的配置文件的方式。这里,我们仿照 laravel 的结构方式来组织我们的代码。使用 .env 文件来放置重要配置信息。当然也有 .env.example 。.env 不会加入版本控制中,.env.example 加入版本控制中。
  • go 的 init 函数。相关联文件中, init 函数总是会先执行的。init 函数要慎用,仔细用。导入顺序也很有关系。

  • 一个项目中 MVC 是指的是业务逻辑的代码,而除了支撑业务逻辑代码以外,还有底层的辅助代码。例如路由加载、数据库初始化等。在我们的项目中,遵循 Go 社区的惯例,这些底层代码我们会归类为各自的包,并放置于 pkg 目录下。pkg 目录下的包,我们会尽量保持其独立性,这样方便在其他项目中复用。但是最重要的,当前还是以服务 goblog 项目为主。
    继续阅读