matzryo / mynotes

自分の学習メモ帳
0 stars 0 forks source link

Goメモ #13

Closed matzryo closed 5 years ago

matzryo commented 6 years ago

Golandインストール。 以下のサイト、 tour of go spec CodeReviewComments effective go pkg の存在を知る

matzryo commented 6 years ago
$ which go
/usr/bin/go
$ go tool tour
go tool: no such tool "tour"
$ go get github.com/atotto/go-tour-jp/gotour
$ gotour
fish: Unknown command 'gotour'
matzryo commented 6 years ago

packageのfunction名は、パスカルケースなのか。

matzryo commented 6 years ago

インポートステートメント、カンマとかではないのか。Factored Inpoert Statement

matzryo commented 6 years ago

はい、可視性

matzryo commented 6 years ago

型名を変数名のあとに書くのは、読み下しやすいから。

matzryo commented 6 years ago

パッケージでも関数でもないところでは、変数は宣言できない

matzryo commented 6 years ago

関数中でだけ、暗黙的な型宣言ができる。基本的には、暗黙宣言できるところは暗黙でやるのかな。

matzryo commented 6 years ago

スコープ何種類あんだろ

matzryo commented 6 years ago

zero value便利そう。でも、基本は明示したほうがいい作法なのかな?

matzryo commented 6 years ago

数値の定数は値。 型都度適当な型になる。

matzryo commented 6 years ago

デバッグどうやる

matzryo commented 6 years ago

定数は := を使って宣言できません。

最初の一回しか代入できない?から? 基本型のみ許している?character型は知らないが。

matzryo commented 6 years ago

deferって面白い。rubyにはないはず。(知らない)

matzryo commented 6 years ago

ポインターってなににつかうんだろ

matzryo commented 6 years ago

配列の長さは方の一部。長さは変えられない。 あと、違う型を入れられない?

matzryo commented 6 years ago

[]Tはスライス、[n]Tは配列。

matzryo commented 6 years ago

スライスリテラル、少しキモい

matzryo commented 6 years ago

スライスの容量。後ろ?[2:]でなぜ減る。

matzryo commented 6 years ago

スライスはnilとしか比較できない。実質的に同じ配列か、とかどうチェックするか

matzryo commented 6 years ago

capacityは、ちょっとだけ低いレイヤーの話なのかな?

matzryo commented 6 years ago

rangeは楽しそう

matzryo commented 6 years ago

loadinternal: cannot find runtime/cgo

$ go help run
usage: go run [build flags] [-exec xprog] package [arguments...]

Run compiles and runs the named main Go package.
$ env CGO_ENABLED=0 echo $CGO_ENABLED
(何も出ない)
$ set --export CGO_ENABLED 0
$ echo $CGO_ENABLED
0
$ go env CGO_ENABLED
0
$ go run exercise-slices.go 
# command-line-arguments
loadinternal: cannot find runtime/cgo
...

なんでだよ

matzryo commented 6 years ago

dxとdyはpicで設定されている?

matzryo commented 6 years ago

rangeはeachみたいに使える

matzryo commented 6 years ago

問題を解いて、リファクタリングするのは身につく。

matzryo commented 6 years ago

なるほど。このケースなら、ポインターを活用するとやりたいことが簡単に実現できるな。ポインターのユースケース初めて見たかも。 https://go-tour-jp.appspot.com/methods/4

matzryo commented 6 years ago

ポインタレシーバを使う2つの理由があります。 ひとつは、メソッドがレシーバが指す先の変数を変更するためです。 ふたつに、メソッドの呼び出し毎に変数のコピーを避けるためです。 例えば、レシーバが大きな構造体である場合に効率的です。

matzryo commented 6 years ago

Rubyみたいに、組み込み型にメソッド追加はできなさそう。

matzryo commented 6 years ago

ポインタレシーバを持つメソッド(ここでは Scale )は、レシーバが指す変数を変更できます。 レシーバ自身を更新することが多いため、変数レシーバよりもポインタレシーバの方が一般的です。 Scale の宣言(line 16)から * を消し、プログラムの振る舞いがどう変わるのかを確認してみましょう。 変数レシーバでは、 Scale メソッドの操作は元の Vertex 変数のコピーを操作します。 (これは関数の引数としての振るまいと同じです)。 つまり main 関数で宣言した Vertex 変数を変更するためには、Scale メソッドはポインタレシーバにする必要があるのです。

matzryo commented 6 years ago

Scale メソッドはポインタレシーバを持つ場合、Goは利便性のため、 v.Scale(5) のステートメントを (&v).Scale(5) として解釈します。

ほんとはポインタレシーバ。

ポインタコピー元の変数が割り当てられているメモリの一部分を変更したい、のかな。 引数に渡されると、コピーされる。そこが重要。

matzryo commented 6 years ago

更新するときはポインタか? 参照できればよくて、メモリ消費も気にしないときは変数か?

matzryo commented 6 years ago

Type swiches はポリモーフィズム?