首页 > #Golang# user: LookupId not implemented on linux/386 golang

#Golang# user: LookupId not implemented on linux/386 golang

在测试一个程序的时候,遇到如下报错

user: LookupId not implemented on linux/386 golang

服务器环境

2.6.32-279.el6.x86_64

操作系统版本

CentOS 5.8

go 的环境

GOARCH="386"
GOBIN="/home/apps/go/bin"
GOCHAR="8"
GOEXE=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOOS="linux"
GOPATH="/home/apps/go-project/GO"
GORACE=""
GOROOT="/home/apps/go"
GOTOOLDIR="/home/apps/go/pkg/tool/linux_amd64"
TERM="dumb"
CC="gcc"
GOGCCFLAGS="-g -O2 -fPIC -m32"
CXX="g++"
CGO_ENABLED="0"

go 的版本

go version go1.2.1 linux/amd64

代码如下:

package main
import (
    "encoding/json"
    "fmt"
    "log"
    "os/user"
)

func main(){
    u, err := user.LookupId("500")
    if err != nil {
        log.Fatal(err)
    }

    data, err := json.MarshalIndent(u, "", "")
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("%s\n", data)
}

提问,在我现有的环境下,我要如何解决这个问题,这个报错,是说 linux/386 没有 Lookupid 的实现,使用什么命令编译会不出现这个问题?

注:在 go 的用户组也看到类似问题,但是没有看的很明白 连接为 Cross compilation and os/user (cgo problem)


不同平台实现不一样的情况,我一般会针对不同的平台单独封装。

比如你的情况:
既然 linux/386 没有 Lookupid 的实现,我会把

    u, err := user.LookupId("500")

单独搞到一个文件去实现,比如386平台

lookuppid_386.go

func LookupId(id string) (*User, error) {
   // 实现
}

其它有实现的平台,可以直接调用api, 比如

lookuppid_unix.go

func LookupId(id string) (*User, error) {
    return user.LookupId(id)
}

你业务逻辑调用自己实现的 LookupId 函数


若要交叉编译,需要禁用cgo以及各类环境参数。用以下命令试试看

CGO_ENABLED=0 GOOS=linux GOARCH=386 go build

找到解决办法了,如下,
可以把 go 环境变量中的

GOARCH="386" 修改成 GOARCH="amd64"

[apps@GD9-MANAGE-001 goadmin]$ GOOS=linux GOARCH="amd64" go build -o user_lookup .
[apps@GD9-MANAGE-001 goadmin]$ ./user_lookup
{
"Uid": "500",
"Gid": "500",
"Username": "apps",
"Name": "",
"HomeDir": "/home/apps"
}

【热门文章】
【热门文章】