- 投稿日:2020-02-19T17:29:34+09:00
【Go】go: cannot find GOROOT directory: /usr/local/Cellar/go/1.13.4/libexec問題を解決
はじめに
オリジナルアプリの新機能実装が一息ついたので、久しぶりにGoをやろうと思ったんですが、以下のような記述が出ました。
$ go: cannot find GOROOT directory: /usr/local/Cellar/go/1.13.4/libexecちなみにこのコマンドを打ったときにエラーが出ましたね。
$ go run main.goこのエラーを解決するのに1時間程度かかり、苦戦したので解決方法を共有したいと思います。go envすら使えなくなったのでほんと焦りました。
手順
そもそも
/usr/local/Cellar/go/1.13.4/libexecこれがないと言われているので、まずはここの記述を探しましょう。
$ cd /usr/local/Cellar/go/そしてここまできたら
$ lsをしてください。
すると僕の場合
$ 1.13.8これが出ていました。
つまり、バージョンがずれていたわけですね。
なので、
echo 'export GOROOT=/usr/local/Cellar/go/1.13.8/libexec' >> ~/.bash_profileこんな感じでバージョンを修正しましょう。ここは人によって数字が違うと思うので、自分のバージョンに合わせて記述してください。
そしてこのコマンドを打ち終えたら
source ~/.bash_profileこれで更新してください。
すると
$ go run main.goこのコマンドが通るようになります。
もちろん
$ go envも通るようになります。
Goはこういったディレクトリ系のエラーが多発するので、慣れるまでは苦しいのですが、頑張ってやっていきたいです?
- 投稿日:2020-02-19T14:50:40+09:00
共通のフィールド名がある構造体同士でのコピー
共通のフィールド名があるが、同じでは無い構造体から構造体への、フィールド値のコピーサンプル
/** reflectを使用して、同じ名前、同じ型のフィールドに値をコピーするサンプル */ package main import ( "fmt" "reflect" ) // 型のエイリアスを使っている場合でも通る type UID int64 type Test1 struct { Id UID Name string Age int Affiliation string } type Test2 struct { Id UID Name string Age int Company string } func main() { st1 := Test1{128, "Bob", 1234, "製造"} v1 := reflect.ValueOf(st1) t1 := v1.Type() st2 := Test2{} v2 := reflect.ValueOf(&st2) for i := 0; i < t1.NumField(); i++ { // フィールド名 name := t1.Field(i).Name // 値 field := v1.Field(i) value := field.Interface() v := v2.Elem().FieldByName(name) if v.IsValid() { fmt.Printf("name=%s, type=%s, value=%#v\n", name, v.Type(), value) // コピー元と先の型が違うと、ここで落ちる v.Set(field) } else { // コピー先に同じ名前のフィールドが無かったので取得出来なかった場合 fmt.Printf("no field[name=%s] found.\n", name) } } fmt.Printf("st2=%+v\n", st2) }