🐛

" undefined: unsafe.Slice"のエラー修正

2023/06/10に公開

背景

仕事で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から追加されていたみたいでした。
https://go.dev/doc/go1.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のリリースで分割される仕様に変更された様です。

https://go.dev/doc/go1.17#:~:text=Pruned module graphs in go 1.17 modules

終わりに

1.16から1.19にバージョンアップすることで”undefined: unsafe.Slice”を解消する事が出来ました。
自分のプロジェクトの場合はバージョンアップで他に影響が出ることはなかったのです。
何方かの参考になれば幸いです。

Discussion