在Mac上工作的“golang.org/x/net/ipv4”,而不是在Linux上

我使用“golang.org/x/net/ipv4”来使用它的SetTTL函数。 不幸的是,它似乎不能在Linux上工作,只能在Mac上使用,尽pipe文档指出Linux支持所有的function。

下面是Dockerfile的一个最基本的例子:

main.go:

package main import ( "fmt" "net" "bufio" xnet "golang.org/x/net/ipv4" ) const Host = "google.com" func main() { var err error conn, err := net.Dial("tcp4", Host + ":80") if err != nil { panic(err) } defer conn.Close() xconn := xnet.NewConn(conn) err = xconn.SetTTL(5) if err != nil { panic(err) } defer xconn.Close() fmt.Fprint(conn, "GET / HTTP/1.1\r\nHOST: google.com\r\n\r\n") firstLine, err := bufio.NewReader(xconn).ReadString('\n') if err != nil { panic(err) } fmt.Println(firstLine) } 

Dockerfile:

 FROM golang:1.8.1-alpine RUN apk --no-cache add git RUN go get golang.org/x/net/ipv4 COPY . /go/src/me.com/me/xnetproblem RUN go install me.com/me/xnetproblem CMD ["/go/bin/xnetproblem"] 

我运行这个命令:

 docker build -t xnet . 

我得到这个输出:

 john xnetproblem > docker build -t xnet . Sending build context to Docker daemon 90.62 kB Step 1/6 : FROM golang:1.8.1-alpine [snip] Step 5/6 : RUN go install me.com/me/xnetproblem ---> Running in c3802fe61d63 # me.com/me/xnetproblem src/me.com/me/xnetproblem/main.go:25: xconn.Close undefined (type *ipv4.Conn has no field or method Close) src/me.com/me/xnetproblem/main.go:28: cannot use xconn (type *ipv4.Conn) as type io.Reader in argument to bufio.NewReader: *ipv4.Conn does not implement io.Reader (missing Read method) The command '/bin/sh -c go install me.com/me/xnetproblem' returned a non-zero code: 2 

使用本地go install而不是Docker,该程序在Mac上运行,而在Linux上运行。

感谢@ JimB的评论,我意识到我的Mac已经安装了旧版本的ipv4软件包。 更新后,我能够修复代码。

这是一个完整的工作版本:

 package main import ( "fmt" "net" "bufio" "golang.org/x/net/ipv4" ) const Host = "google.com" func main() { var err error conn, err := net.Dial("tcp4", Host + ":80") if err != nil { panic(err) } defer conn.Close() if err = ipv4.NewConn(conn).SetTTL(5); err != nil { panic(err) } fmt.Fprint(conn, fmt.Sprintf("GET / HTTP/1.1\r\nHost: %v\r\n\r\n", Host)) firstLine, err := bufio.NewReader(conn).ReadString('\n') if err != nil { panic(err) } fmt.Println(firstLine) } 

这是输出:

 HTTP/1.1 301 Moved Permanently