🐛
" undefined: unsafe.Slice"のエラー修正
背景
仕事でGoを使い始めて、モジュールをインストールした際にエラーが出たので調査することになりました。
// 一部抜粋
#22 27.28 /go/pkg/mod/golang.org/x/sys@v0.5.0/unix/sysvshm_unix.go:33:7: undefined: unsafe.Slice
#22 27.28 note: module requires Go 1.17
#22 ERROR: executor failed running [/bin/sh -c CGO_ENABLED=0 go build ./cmd/api/main.go]: exit code: 2
Dockerfileのgoのバージョンがdev環境(1.19)とstg環境(1.16)に差異があったので、stg環境でのbuild時にのエラーが発生しました。
unsafe.Sliceが定義されていないとの事で、調査したところ1.17から追加されていたみたいでした。
ですので、stg環境のバージョンを上げることにしました。
(なぜ環境によってバージョンに差異が出ていたのか分かりませんでした。。変更忘れだったのか?)
Version up: 1.16 -> 1.19
Dockerfile
Dockerfileをdev環境とstg環境で分けていた為、versionが違っていた。
Dockerfile
FROM golang:1.19-alpine as base
Dockerfile.stg
FROM golang:1.16-alpine as base
stgの方を1.19に変更することで、build時に出ていた"undefined: unsafe.Slice"は解消されました。
go.mod
go.modに記載されているバージョンが1.16のままだったので1.19になる様に合わせました
go.mod
module github.com/...
go 1.16
require (
github.com/DATA-DOG/go-txdb v0.1.5
github.com/appleboy/gin-jwt/v2 v2.8.0
... //省略
github.com/volatiletech/strmangle v0.0.1
golang.org/x/crypto v0.0.0-20220131195533-30dcbda58838 // indirect
golang.org/x/image v0.7.0 // indirect
)
go 1.16をgo 1.19に変更する。
- go 1.16
+ go 1.19
$ go mod tidy
を実行してgo.modを整理してもらう。
go.mod
module github.com/....
go 1.19
require (
github.com/DATA-DOG/go-txdb v0.1.5
github.com/appleboy/gin-jwt/v2 v2.8.0
github.com/aws/aws-sdk-go v1.44.27
... //省略
github.com/volatiletech/null/v8 v8.1.2
github.com/volatiletech/sqlboiler/v4 v4.8.6
github.com/volatiletech/strmangle v0.0.1
)
require (
github.com/KyleBanks/depth v1.2.1 // indirect
github.com/PuerkitoBio/purell v1.1.1 // indirect
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect
... //省略
gopkg.in/yaml.v2 v2.4.0 // indirect
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect
nhooyr.io/websocket v1.8.7 // indirect
)
1.19に変更するとrequireがdirectとindirectの2つに分割されました。
1.17のリリースで分割される仕様に変更された様です。
終わりに
1.16から1.19にバージョンアップすることで”undefined: unsafe.Slice”を解消する事が出来ました。
自分のプロジェクトの場合はバージョンアップで他に影響が出ることはなかったのです。
何方かの参考になれば幸いです。
Discussion