Golang

sliceをrangeでループして取得した値のフィールドを更新しても、元のsliceは更新されない(rangeで取得した値はコピー)

AOJやっててハマったので package main import ( "fmt" ) type Element struct { number int } func main() { Elementのsliceの場合() Elementのポインタのsliceの場合() } func Elementのsliceの場合() { elements := []Element{} for i := 0; i < 2; i++ {…

GitHub Trendingに毎日同じリポジトリがいるのを見たくないので俺がその日初めて見るリポジトリだけを見るためのツールを作った

goの勉強がてらに作った サンプル 特徴 treviewコマンドでTrendingに入ってるリポジトリの情報一覧が表示できる 前日以前に一回でも表示されたリポジトリは表示されない コマンド叩いたときにデフォルトで表示する言語を指定できる GitHub GitHub - inabajun…

Sliceのレシーバによって参照される値はコピーにはならない

9/10追記 コピーはされるが、sliceはarrayへのポインタを持っていて、コピーしてもそのポインタは変わらないので参照先にarrayは同じ、と言う話だった レシーバは明示的にポインタを渡さない限り値のコピーが渡されると思っていたがそういうことでもないよう…

A Tour of Goをやるぞ(Concurrency)

これをやる A Tour of Go Goroutines go f(x) で別スレッド関数を実行できる。 Goroutinesは同じアドレス空間で動くので、共有メモリへのアクセス時は同期する必要がある。 package main import ( "fmt" "time" ) type Test struct { value int } func (test…

Goのコードを任意のパスにforkしてcloneして開発したい気持ち

forkして適当なとこにcloneするとimportのパスが import ( "github.com/inabajunmr/repo/package" ) みたいになってて実行時に$GOPATH見に行っちゃうので修正後の挙動が見れないとかテストがどうとかあって、じゃあgo getして$GOPATH以下のコードを直接いじ…

deferの中でmutationな操作をする関数を読んで戻り値を変更しても、戻り値に影響がないのは何故だろう

package main import "fmt" type Test struct { value int } func One(test *Test) { test.value = 1 fmt.Println("one") } func execute() Test { x := Test{0} defer One(&x) // xのポインタをOne関数に渡して、0を1に更新 return x } func main() { x := …

A Tour of Goをやるぞ(Methods and interfaces)

これをやる A Tour of Go 型にメソッドを定義 funcと関数名の間にreceiverを定義することで型にメソッドを定義をできる。 メソッドはreceiverを持った関数のことである。 package main import ( "fmt" ) func (test Test) Double() int { return test.X * te…

A Tour of Goをやるぞ(More types: structs, slices, and maps.)

これをやる A Tour of Go ポインタ package main import "fmt" func main() { i := 10; p := &i fmt.Println(p) // ポインタ fmt.Println(*p) // 値 *p = 20 // ポインタ経由での値変更 fmt.Println(i) v := 20 i = v fmt.Println(&i) // 代入しても参照先は…

A Tour of Goをやるぞ(Flow control statements: for, if, else, switch and defer)

これをやる A Tour of Go そしてメモりたくなったことをメモって行く while whileみたいのはforで表現する。 func main() { value := 0 for true { fmt.Println("hello") value += 1 if value == 5 { break; } } } 無限ループ func main() { for { fmt.Print…

A Tour of Goをやるぞ(Packages, variables, and functions.)

これをやる A Tour of Go そしてメモりたくなったことをメモって行く パッケージについて 慣習として、パッケージ名はimportのパスの最後のエレメントになる math/randならrand https://tour.golang.org/basics/1 Exported name 大文字で始まる名前はエクス…