- 投稿日:2020-05-27T14:18:55+09:00
【Go1.14】GOPATHが$HOME/goから変わらない時にやった事
前提
~ » go version go version go1.14.3 darwin/amd64困った事
- 環境変数を上書きしてPATHを設定しても、GOPATHだけがデフォルトから変わらない。
export GOPATH=/Users/myname/workspace/go export GOROOT=/Users/myname/sdk/go1.14.3 export PATH=$PATH:"$GOROOT/bin" export PATH=$PATH:"$GOPATH/bin"~ » go env GOPATH /Users/myname/goやったこと
- ヘルプコマンドから公式Wikiに辿り着く
~ » go help gopath The Go path is used to resolve import statements. It is implemented by and documented in the go/build package. The GOPATH environment variable lists places to look for Go code. On Unix, the value is a colon-separated string. On Windows, the value is a semicolon-separated string. On Plan 9, the value is a list. If the environment variable is unset, GOPATH defaults to a subdirectory named "go" in the user's home directory ($HOME/go on Unix, %USERPROFILE%\go on Windows), unless that directory holds a Go distribution. Run "go env GOPATH" to see the current GOPATH. See https://golang.org/wiki/SettingGOPATH to set a custom GOPATH. 省略go env -w GOPATH=$HOME/go
- 無事に変更された
~ » go env GOPATH /Users/myname/workspace/go後書き
Go1.13から新しい設定手順ができたのかな?
色々調べて過去の情報やちょっと違う手順で少し詰まってしまいました。
公式の手順に従うのが一番最速ですね。参考記事
- 投稿日:2020-05-27T13:56:12+09:00
【Golang】構造体④コンストラクタ
【Golang】構造体④コンストラクタ
Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。 基礎〜応用まで。
//コンストラクタ //__init__の部分を書く //Pythonの場合 クラス、メソッド /* class Vertex(object): def __init__(self, x, y): self._x = x self._y = y def area(self): return self._x * self._y def scale(self, i): self._x = self._x * i self._y = self._y * i v = Vertex(3, 4) v.scale(10) print(v.area()) */ package main import ( "fmt" ) type Vertex struct { X, Y int } //2 //コンンストラクタのカスタム //Pythonの def __init__(self):のイメージ //NewStruct()のようにする。 func NewV(x, y int) *Vertex { return &Vertex{x, y} } func main() { //1 v := Vertex{3, 4} fmt.Println(v) v2 := NewV(3, 4) //メモリー fmt.Println(v2) //実態 fmt.Println(*v2) }
- 投稿日:2020-05-27T09:16:50+09:00
golang switch fallthrough
golang の switchで使う fallthroughを試してみた
次のcase文に、条件に関わらずに進む。
この例だと、Aの条件が成立して実行されたあと、fallthroughで、
Case Bの節を実行する。
Case Cは実行されないので、その中のfallthroughは通過しない。
もしa=Cだったら、defaultも
実行される。fallthrough.gopackage main func main () { a := "A" switch a { case "A": println("A") fallthrough case "B": println("B") case "C": println("C") fallthrough default: println("end") } }
- 投稿日:2020-05-27T01:41:30+09:00
ファイルの変更を監視してコマンドを実行するCLIツール「monitor」を作成した話
概要
AtCoderや機械学習の前処理を行うようなスクリプトを組む場合,変数の状態をprintデバッグすることが多く,変更を加えて再実行して結果を確認する一連の作業がめんどくさいと感じていました.
そこで,ファイルの変更があった場合に事前に引数で渡したコマンドを実行してくれるコマンドラインツールmonitor
を作りました.
この手のCLIツールは探せばより優秀なものがすでにあるとは思いますが,とりあえず作ってみたことで愛着が沸きますし勉強になりました.実装
https://github.com/maitaken/monitor
実装言語は使ってみたかったという理由でGo言語を選択しました.インストール方法
GOの設定(GOPATHなど)がされているのであれば,以下のコマンドでインストールできます.GOのcontextを使用しているのでGoは1.7以上のバージョンが必要です.
git clone https://github.com/maitaken/monitor.git cd monitor make install使い方
基本的な使い方は以下の2つです.
ファイルの監視対象が1つの場合,第一引数に監視するファイル名,第二引数に実行するシェルを指定します.
monitor [監視するファイル名] ["実行するシェル"] ex) monitor main.py "python main.py"ファイルの監視対象が2つ以上の場合,-fオプションを使用します.このファイル名の指定にはワイルドカードが使用できます.
monitor -f [監視するファイル名] -f [監視するファイル名] ["実行するシェル"] ex) monitor -f main.py -f in "python main.py < in" monitor -f "*.py" "python main.py"TODO
いまのところでも結構使いやすいのですが,今後は以下の機能を付けていきたいと思っています.
指定したコマンドが終わるまで結果を出力してくれない
実行に時間がかかり,ある間隔で出力される値を確認したい場合,現状ですと全ての実行が終わるまで待たなければいけません.
そのため,途中経過を逐次出力する機能をつけたいと思っています.ただ,もともとAtCoderで使うことを目的にしていたため,実行時間が長くても3sか4sくらいなので(それ以上長かったらTLEになってしまう)今のところ不便じゃないです.
ファイルをパッシブな方法で監視するように変更
現在の実装だと500msに一回ファイルの変更日時を確認して,一回前に確認した変更日時と異なっていたらコマンドを再実行するような実装になっています.(アクティブな方法)
アクティブな方法ではCPU使用率などのリソースが無駄に使われているので,OSのシステムコールを用いたファイル監視に変更していく必要があります.