最近在使用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"]
在使用Flutter开发过程中，我们经常会遇到需要切换版本的时候，而且flutter切换channel后需要重新下载大量内容，每个channel切换完成后需要再跑flutter doctor，又会有大量的下载，而且还都是国外服务器，下载非常慢。于是尝试着寻找一款合适的工具，原则是可以跨平台，最好是Golang开发的，很巧的是发现 https://blog.befovy.com/2019/12/fvm-using-go/ 这位Golang博主已经开发完成了，github链接在此，主要的思路与使用Dart编写的fvm异曲同工。安装由于我是使用Mac电脑的，所以直接使用brew安装brew tap befovy/taps brew install fvmfvm支持导入已有的SDK，由于我之前安装的是stable的channel，所以使用如下命令：fvm import stable等待几分钟后即可全部导入完成。环境变量配置在使用fvm之前，实际上我已经手动安装过Flutter，所以需要重新修改下环境变量地址，fvm的默认安装路径如下：export FLUTTER_PATH=~/Library/Application\ Support/fvm/current export PATH=$PATH:$FLUTTER_PATH/bin需要根据自己的电脑终端情况，把上述代码拷贝到.bash_profile或者.zshrc文件。安装指定版本如果之前未安装其他版本，需要先安装，例如我安装“1.17.5”版本：fvm install 1.17.5 # 或者 fvm install 1.17.5 --repo https://mirrors.tuna.tsinghua.edu.cn/git/flutter-sdk.git上述带--repo表示指定路径，推荐使用国内清华镜像加速下载，不过我在实际使用中出现过下列问题：fvm: Command 'git' exited with error: chdir ~/Library/Application Support/fvm/versions/1.17.5: no such file or directory结果去掉--repo就正常下载了，如果遇到类似的问题，可以带和不带--repo都试下，我遇到的就是不带是OK的。使用指定版本安装好指定版本以后，可以直接使用use命令来使用：fvm use 1.17.4 flutter doctor
最近接手一个维护项目由于历史久远，导致原有的程序只能跑在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 main2.安装ca-certificates只要配置好上述的源以后，就可以直接运行下面的命令，就可以安装好，否则会报404找不到错误。apt-get install -y ca-certificates3.安装证书首先需要下载微信支付证书，链接在此下载完成后把证书放到 /usr/share/ca-certificatessudo 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还是高级查询的All和One，都只会有默认值，需要自己再去根据Id查询一次才会有值，这一点需要特别注意。
今天在准备格式化输出时，发现一个奇怪的现象：time.Now().Format("yyyy-MM-dd HH:mm:ss")结果并没有按照我想象的格式化，而是直接把上面那玩意儿给打印出来了......通过查询资料发现，特么Golang并不是按照我们常规理解的日期格式化来处理的，而是使用Go语言的诞生时间：2006-01-02 15:04:05 -0700 MST而且这个日期就是写死的一个日期，不是这个日期就不认识，就不能正确的格式化。记住就好了，为了方便记忆可以这样按照美式时间格式“月日时分秒年 外加时区”，排列起来依次是 01/02 03:04:05PM ‘06 -0700，刚开始使用时需要注意。真是一个神奇（反智）的设计啊。
最近在学习Beego框架，还没进门就发现了一个坑的地方，在此记录下。从 Beego官网开始学习的，按照官网的示例跑了一个项目，正常运行没有问题，但按照给定的接口调用，始终提示nomatch。原因是Beego还未完全支持go mod，必须让示例项目在GOPATH下运行，才可以生成commentsRouter文件，否则无法生成，这就是问题所在的地方，将示例代码移到GOPATH下以后，问题解决。
Golang 编译非常简单，如果是编译当前平台直接使用以下指令。go build main.go如果编译过程中出现 undefined: 方法名 的错误，则可以直接编译整个package，编译器会自动找到入口。go build ./同时Golang也支持交叉编译，在一个平台上生成另一个平台的可执行程序，最近使用了一下，非常好用，步骤如下：1、关闭cgo 2、指定目标系统 3、指定目标内核 4、build 示例如下：Linux、Mac 下编译 WindowsCGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build ./Windows下编译 linuxSET CGO_ENABLED=0 SET GOOS=linux SET GOARCH=amd64 go build ./
之前一直是做Android开发，从开始接触Android开发到现在已经过去8年了，对于一个普通的程序员，也到了给自己提升的时候了，前段时间本来准备去学习下JVM，了解Java虚拟机的运行原理，但开始入门的时候，发现这是一件很枯燥的事情，直到我遇到了Golang，我感觉我可以从底层开始学习一门新兴的语言，站在另一个角度看到Java，于是有了这篇文章，希望自己能坚持的学下去。Golang的历史就不必说了，是一个很有背景和前景语言，在后面的学习和开发过程中如果有机会，我会做一些Golang和Java的比较。可能很多人学习语言的开始都是hello world！，下面奉上一段代码结束开篇。package main import "fmt" func main() { fmt.Println("Hello, World!") }