分类 Golang开发 下的文章

最近在使用Golang集成虹软Linux SDK时,发现不能单纯的设置CGO_ENABLED=0,这样会导致C/C++库调用出错,无法完成正常的编译,因为你需要引入C/C++库的时候,不能禁用CGO。

而且虹软Linux SDK只能在Linux平台编译,macOS上缺少必须的glibc库,所以使用Docker是最好的方案,好在Docker社区的强大,几乎你需要的所有环境都有对应的官方镜像,这里推荐golang:alpine作为基础镜像,这个镜像包含了基础的Golang运行环境和可供编译C/C++的Linux环境,如果有缺少的参数可以自行添加。

为了减少最终镜像体积,可以分阶段构建,大概的Dockerfile如下:

# 使用基础镜像构建
FROM golang:1.15-alpine AS build
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
RUN apk add libc6-compat libgcc libstdc++
ENV GO111MODULE=on \
    GOPROXY=https://goproxy.cn,direct \
    GOOS=linux \
    GOARCH=amd64
WORKDIR /build
COPY lib /usr/
COPY go.mod .
COPY go.sum .
RUN go mod download
COPY . .
RUN go build -o face
# 使用轻量化镜像运行减少体积
FROM scratch as final
ENV TZ=Asia/Shanghai
COPY --from=build /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
COPY --from=build /usr/share/zoneinfo /usr/share/zoneinfo
COPY --from=build /build/face /
COPY --from=build /build/.env /face.env
ENTRYPOINT ["/face"]

最近在使用Golang开发数据库操作过程中,涉及到PostgreSQL的主键自增长,一般在MySQL中可以使用AUTO_INCREMENT字段来实现主键自增长,语句如下:

CREATE TABLE IF NOT EXISTS `table_name`(
   `id` INT UNSIGNED AUTO_INCREMENT,
   `title` VARCHAR(100) NOT NULL,
   `author` VARCHAR(40) NOT NULL,
   `sub_date` DATE,
   PRIMARY KEY ( `id` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

但在PostgreSQL中无法使用AUTO_INCREMENT,经过查询得知PostgreSQL需要使用序列来标识字段的自增长,语句如下:

#先创建序列
CREATE SEQUENCE upms_id_seq START 1;

#主键赋默认值
CREATE TABLE "table_name" (
  "id" int4 NOT NULL DEFAULT nextval('upms_id_seq'),
  "title" varchar(100) NOT NULL,
  "author" varchar(40) NOT NULL,
  "sub_date" timestamptz,
  PRIMARY KEY ("id")
);

最近接手一个维护项目由于历史久远,导致原有的程序只能跑在debian 6 系统上,以下作为记录:

1.更换系统源

由于debian官方源已经6和7的源放入存档了,导致安装ca-certificates失败,所以需要更新源。

把原来的源修改为http://archive.debian.org/debian/,我的修改后的如下:

deb http://archive.debian.org/debian/ squeeze main
deb-src http://archive.debian.org/debian/ squeeze main
deb http://archive.debian.org/debian/ squeeze-updates main
deb-src http://archive.debian.org/debian/ squeeze-updates main
deb http://mirrors.ustc.edu.cn/debian-security/ squeeze/updates main
deb-src http://mirrors.ustc.edu.cn/debian-security/ squeeze/updates main

2.安装ca-certificates

只要配置好上述的源以后,就可以直接运行下面的命令,就可以安装好,否则会报404找不到错误。

apt-get install -y ca-certificates

3.安装证书

首先需要下载微信支付证书,链接在此
下载完成后把证书放到 /usr/share/ca-certificates

sudo mv Baltimore_CyberTrust_Root.pem /usr/share/ca-certificates/local/
sudo mv DigiCert_Global_Root_CA.pem /usr/share/ca-certificates/local/

刷新证书

sudo update-ca-certificates --fresh

最近在一个项目中遇到一个需要做外键关联查询的字段,通过beego官网文档发现,beego也支持这种关联关系,例如我的数据库中有userinfo和role两个表,userinfo用于存储用户信息,role用于存储用户的角色,其中userinfo表中的roleid关联role主键id,定义的struct如下:

type Userinfo struct {
    Id       int
    Role     *Role  `orm:"column(roleid);rel(one)"`
    NickName string `orm:"column(nickname)"`
    UserName string `orm:"column(username)"`
}

Userinfo中定义Role指针类型的struct,后面也注释了"rel(one)"表明是一对一关系。

type Role struct {
    Id           int
    Grade        int         `orm:"column(grade)"`
    RightContent string      `orm:"column(rightcontent)"`
}

Role里面就是一个正常的struct,可以指定也可以不指定关系,如果要指定的话,可以注释下"rel(fk)",表明是一对多关系,因为一个Role可能对应多个User。

按照以往移动开发的经验,我们会认为此处我们去数据库读取Userinfo信息,Role字段就也会读取出来,实际上beego在Read函数上没有这样的处理,官网也说明了,不管是普通的Read还是高级查询的AllOne,都只会有默认值,需要自己再去根据Id查询一次才会有值,这一点需要特别注意。

在使用Beego开发API过程中,有几个经常会用到的命令,在此记录下。

调试

bee run

使用上面的命令即可进入监控模式,可以实时看到输出的日志,代码修改以后也可以实时重新编译运行,但在Goland下有个小问题,必须切换下终端窗口,才会立马生效,不然就要等他定时刷新,会比较慢。

交叉编译

bee pack -be GOOS=linux -be GOARCH=amd64

需要带-be 参数指定交叉编译的平台,否则会默认按照当前电脑的平台编译,我们大多数情况下需要编译成服务器平台,使用上述命令即可,这个命令打包以后会把conf单独打包出来,方便维护和使用。

目前我常用到的就这2个,后面用到其他的再补充。