Golang构建Web应用时遇到的错误解决方案
Golang构建Web应用时遇到的错误解决方案 我在Windows 10系统上使用GoLand IDE开发了Web应用程序,运行一切正常。 现在我在openSuse Leap 42.3系统中安装了GO,并将我的应用程序放置在文件夹/srv/www/htdocs/go/src下
我的Go版本是:go1.7.5 linux/amd64
我的GO环境变量是:
GOARCH="amd64"
GOBIN="/usr/bin"
GOEXE=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOOS="linux"
GOPATH="/usr/share/go/1.7/contrib"
GORACE=""
GOROOT="/srv/www/htdocs/go"
GOTOOLDIR="/srv/www/htdocs/go/pkg/tool/linux_amd64"
CC="gcc"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build988831746=/tmp/go-build -gno-record-gcc-switches"
CXX="g++"
CGO_ENABLED="1"
运行以下命令:
- go run main.go 或
- go build main.go
都会返回这个错误:
runtime
…/runtime/cgo.go:9:3: //go:cgo_export_static main only allowed in cgo-generated code
请给予建议
更多关于Golang构建Web应用时遇到的错误解决方案的实战教程也可以访问 https://www.itying.com/category-94-b0.html
是的,但这是错误的,它应该是 Go 包安装的路径,而不是你的项目目录。
你真的需要使用cgo吗?如果不需要,这是我首先会去掉的东西。
GOROOT="/usr/share/go/1.7/contrib" 可能是这个路径,现在不在Linux系统上。
你在 Windows 上使用的 Go 版本是什么?
当你使用正确的 GOOS 和 GOARCH 值从 Windows 进行交叉编译时,是否遇到同样的问题?(Go 是否真的能从 Windows 交叉编译到 Linux?到目前为止我只尝试过相反的方向……)
另外,看起来你把 GOROOT 和 GOPATH 搞混了。GOROOT 应该包含系统包,而 GOPATH 应该包含开发者的代码。
jsanai:
GOPATH=“/srv/www/htdocs/go” GOROOT=“/srv/www/htdocs/go/bin”
这看起来比你之前的情况还要糟糕。
请为自己行个方便,在本地构建可执行文件,然后只将二进制文件上传到服务器。使用 Go 的交叉编译功能或 Go Docker 容器应该就足够了。
或者你也可以在服务器上的主目录中进行构建。你不需要把源代码或二进制文件放在 /srv/www… 路径下。
一般来说,我不建议将其放在发行版常用 Web 服务器通常提供服务的路径中。否则在安装或更新软件包时,你可能会面临泄露机密信息的风险。
只需创建一个服务(systemd 单元、upstart、initd,根据你的发行版选择),然后启动它即可。
感谢您的回复。
我已经修改了: GOPATH="/srv/www/htdocs/go" GOROOT="/srv/www/htdocs/go/bin"
那个错误不再出现了 😊
现在遇到这个问题:
导入循环不被允许 package main imports crypto/md5 imports crypto imports hash imports io imports errors imports runtime imports runtime/internal/atomic imports unsafe imports runtime 导入循环不被允许 package main imports net/http imports crypto/tls imports crypto/x509 imports net imports runtime/cgo imports runtime/cgo
这是我的main.go文件头部
package main
import (
"fmt"
"log"
"net/http"
"ressources/gorilla/mux"
_ "ressources/gorilla/securecookie"
"database/sql"
_ "ressources/mysql"
"crypto/md5"
"encoding/hex"
"sync"
)
这是一个常见的Go版本和cgo配置问题。根据你的环境变量和错误信息,问题主要出现在Go版本和GOPATH设置上。
问题分析:
- Go 1.7.5 版本较老,可能存在已知的cgo问题
- GOPATH设置不正确,指向了系统目录而非你的项目目录
- GOROOT设置可能有问题
解决方案:
- 更新Go版本(推荐)
# 下载并安装更新的Go版本(如1.21+)
wget https://golang.org/dl/go1.21.0.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.21.0.linux-amd64.tar.gz
- 修正环境变量
在
~/.bashrc或~/.profile中添加:
export GOROOT=/usr/local/go
export GOPATH=/srv/www/htdocs/go
export PATH=$GOPATH/bin:$GOROOT/bin:$PATH
然后执行:
source ~/.bashrc
- 项目结构调整 将你的项目放在正确的GOPATH结构下:
mkdir -p /srv/www/htdocs/go/src/your-project
# 将你的代码移动到该目录
- 验证环境
go version
go env
- 重新构建
cd /srv/www/htdocs/go/src/your-project
go build
如果必须使用Go 1.7.5,尝试禁用cgo:
CGO_ENABLED=0 go build main.go
或者检查你的代码中是否包含cgo相关的指令:
// 确保没有错误的cgo指令
package main
import (
"net/http"
)
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Hello World"))
})
http.ListenAndServe(":8080", nil)
}
更新Go版本到较新的稳定版(1.18+)通常能解决这类cgo相关的兼容性问题。


