项目中在go语言中使用sqlite数据库,网上找了相关例程,但一开始就出现了错误,代码如下:

package main

import (
	//"database/sql"
	"fmt"
	_ "github.com/mattn/go-sqlite3"
)

func main() {
	fmt.Println("Hello world");
}

使用go run main.go(对源代码直接执行)或者go build main.go(先编译后执行),都会出现以下错误:

$ go build sbom_gen_tool.go
main.go:6:2: no required module provides package github.com/mattn/go-sqlite3: go.mod file not found in current directory or any parent directory; see 'go help modules'

在网上搜索解决方案, 要修改go的环境变量,但是对于解决过程写得不够细致,因此在里写下详细的解决过程。

(1)查看环境变量

执行go env查看环境变量,如下所示:

$ go env
GO111MODULE=""
GOARCH="amd64"
GOBIN=""
GOCACHE="/home/ph/.cache/go-build"
GOENV="/home/ph/.config/go/env"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOINSECURE=""
GOMODCACHE="/home/ph/go/pkg/mod"
GONOPROXY=""
GONOSUMDB=""
GOOS="linux"
GOPATH="/home/ph/go"
GOPRIVATE=""
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/usr"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/usr/lib/gcc/x86_64-linux-gnu/11"
GOVCS=""
GOVERSION="go1.16.5 gccgo (Ubuntu 11.2.0-19ubuntu1) 11.2.0"
GCCGO="/usr/bin/x86_64-linux-gnu-gccgo-11"
AR="ar"
CC="x86_64-linux-gnu-gcc-11"
CXX="x86_64-linux-gnu-g++-11"
CGO_ENABLED="1"
GOMOD="/dev/null"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build2747685887=/tmp/go-build -gno-record-gcc-switches -funwind-tables"

(2) 设置环境变量

执行go env -w GO111MODULE=auto设置环境变量,如下所示:

$ go env -w GO111MODULE=auto

(3)确认环境变量是否已经改变

执行go env | grep GO111查看“GO111MODULE”是否已设置为“auto”,如下所示:

$ go env | grep GO111
GO111MODULE="auto"

可以见到环境变量“GO111MODULE”已经由原来的空字符串变为了"auto"。

(4) 重新尝试编译

再次执行go build main.go,结果如下:

$ go build main.go
main.go:6:2: cannot find package "github.com/mattn/go-sqlite3" in any of:
    /usr/src/github.com/mattn/go-sqlite3 (from $GOROOT)
    /home/ph/go/src/github.com/mattn/go-sqlite3 (from $GOPATH)

(5)下载源码包

执行go get github.com/mattn/go-sqlite3下载源码包,如下所示:

$  go get github.com/mattn/go-sqlite3

(6)查看“go-sqlite3”是否已下载

根据(4)中的路径提示,依次在“/usr/src/”和“/home/ph/”下搜索“go-sqlite3”,如下所示:

$ sudo find /usr/src/ -name "go-sqlite3"
ph@ph-ThinkBook-14-G2-ITL:~/dingdao/SBOM_Project/sbom-gen$ sudo find /home/ph/ -name "go-sqlite3"
/home/ph/go/src/github.com/mattn/go-sqlite3
/home/ph/go/pkg/mod/cache/download/github.com/mattn/go-sqlite3

可以看到,“go-sqlite3”源码包实际上是下载到了“src”和“pkg”2个路径下。

(7)再次尝试编译

再次执行go build main.go,结果如下:

$ go build main.go

$

这次没有出现任何提示,说明编译通过了。

(8)运行编译出来的可执行文件

运行main,结果如下:

$ ./main
Hello world

至此,问题完全解决,可以进行后续工作了。