Golang中Gorilla Mux在RaspberryPi上使用Go 1.15.x时无法工作的问题

Golang中Gorilla Mux在RaspberryPi上使用Go 1.15.x时无法工作的问题 你好。 我最近在树莓派4上将Go库从v1.14.x更新到了v1.15.3。 我所有使用Gorilla Mux的项目都停止工作了! 我一直使用Go的Linux/ARMv6版本(我认为这不是针对树莓派的官方移植版本),直到v1.14.x它们都能正常工作。 你可以用下面这段简单的代码来测试我遇到的问题:

package main

import (
	"net/http"
	"log"
	"github.com/gorilla/mux"
)

func main() {
	router := mux.NewRouter()
	log.Fatal(http.ListenAndServe(":12111", router))
}

运行 go run main.go 会得到以下错误信息:

# vendor/golang.org/x/crypto/poly1305
/home/pi/go/src/vendor/golang.org/x/crypto/poly1305/sum_noasm.go:10:7: undefined: newMAC

这是怎么回事?

谢谢,祝好。


更多关于Golang中Gorilla Mux在RaspberryPi上使用Go 1.15.x时无法工作的问题的实战教程也可以访问 https://www.itying.com/category-94-b0.html

4 回复

问题似乎在 Go 1.15.4 中已修复。 感谢大家!

更多关于Golang中Gorilla Mux在RaspberryPi上使用Go 1.15.x时无法工作的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


感谢 @petrus。我认为他将问题提交给 Gorilla 团队是正确的做法。在这种情况下,我的担忧是无效的。

与你核对一下:

  1. Go编译器是直接来自golang.org还是由操作系统提供的?
  2. 既然你使用的是linux/armv6l,我假设你的树莓派是3代或更高版本,对吗?

如果第1点不是,能否请你按照golang.org的说明对Go编译器设置进行校准?来自Ubuntu操作系统原生包的经验表明,有时操作系统维护者会改动编译器的内容(例如,将文档移出以匹配操作系统文档的位置)。

你的源代码在x86_64架构上运行没有任何问题。

u0:test$ go mod init test
go: creating new go.mod: module test
u0:test$ go get github.com/gorilla/mux                                                              
go: downloading github.com/gorilla/mux v1.8.0                                                       
go: github.com/gorilla/mux upgrade => v1.8.0                                                        
u0:test$ go run main.go 
^Csignal: interrupt 

Go版本:

go version go1.15.2 linux/amd64

这个问题是由于Go 1.15中golang.org/x/crypto/poly1305包的内部实现变化导致的。在ARMv6架构上,该包缺少针对该架构的汇编优化实现,导致编译时newMAC函数未定义。

以下是解决方案:

1. 更新依赖包

go get -u golang.org/x/crypto

2. 如果问题仍然存在,可以尝试清理vendor目录并重新获取依赖:

rm -rf vendor/
go mod vendor

3. 或者直接使用go modules的replace指令强制使用最新版本:

// 在go.mod文件中添加
replace golang.org/x/crypto => golang.org/x/crypto v0.0.0-20201012173705-84dcc777aaee

4. 完整的工作示例:

// go.mod
module example

go 1.15

require github.com/gorilla/mux v1.8.0

replace golang.org/x/crypto => golang.org/x/crypto v0.0.0-20201012173705-84dcc777aaee

// main.go
package main

import (
	"log"
	"net/http"
	
	"github.com/gorilla/mux"
)

func main() {
	r := mux.NewRouter()
	r.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		w.Write([]byte("Working on Raspberry Pi with Go 1.15"))
	})
	
	log.Println("Server starting on :12111")
	log.Fatal(http.ListenAndServe(":12111", r))
}

这个问题已经在golang.org/x/crypto的后续版本中修复,更新依赖包即可解决。

回到顶部