20200219のGoに関する記事は2件です。

【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はこういったディレクトリ系のエラーが多発するので、慣れるまでは苦しいのですが、頑張ってやっていきたいです?

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

共通のフィールド名がある構造体同士でのコピー

共通のフィールド名があるが、同じでは無い構造体から構造体への、フィールド値のコピーサンプル

/**
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)
}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む