Go 勉強
別の場所に記載してあったものをそのまま持ってきたためMarkdown形式なっている
/icons/hr.icon
(https://go-tour-jp.appspot.com/) を参考に、Goのメモをしていく。
## 始める前に
基本的にgoは英語Docしか無いらしい。
- 公式Doc(https://go.dev/doc)
日本語資料で読めそうなやつは以下
- go-tour-jp(本学習で利用)(https://go-tour-jp.appspot.com/)
- Go完全入門(https://docs.google.com/presentation/d/1RVx8oeIMAWxbB7ZP2IcgZXnbZokjCmTUca-AbIpORGk/edit#slide=id.g4f417182ce_0_0)
- Goでの並行処理を徹底解剖!(goルーチンによる非同期処理学習)(https://zenn.dev/hsaki/books/golang-concurrency/viewer/goelement#%E3%83%81%E3%83%A3%E3%83%8D%E3%83%AB)
- 非公式のGo プログラミング言語仕様(https://hiwane.github.io/gospec-ja/)
とりあえずざっと書いたけど、以下で既にまとまってました。
Goコミュニティ代表の人のブログなので信憑性は高いと思われる。
執筆時期が2013と古い点にだけ注意。
- Go言語の初心者が見ると幸せになれる場所(https://tenntenn.dev/ja/posts/qiita-0e33a4959250d1a55045/)
## 20230208
Table Of Contents(リンク踏んでも飛べないので注意)
toc
### コード管理
Go はパッケージ単位でコードが管理される。
コード実行のスタートは \main\ から。
### import 文
\\`\go
import "fmt"
import "math"
\\`\
でも書けるし、
\\`\go
import (
"fmt"
"math"
)
\\`\
とも書ける。Go 的には後者推奨。
### Exported names
外部パッケージからエクスポートされたものは、頭文字を大文字にしてアクセスする。
\\`\go
package main
import (
"fmt"
"math"
)
func main() {
fmt.Println(math.Pi)
// Pi の部分が大文字
}
\\`\
### Functions
関数は 0 個以上の引数を受け取れて、複数の戻り値を返すことができる。
引数の型宣言は 2 つまとめて宣言できたりもする。
型は変数の後ろで定義する。戻り値が複数ある場合はカッコで記述する。
\\`\go
package main
import "fmt"
// x string, y string を x, y string にしている
func swap(x, y string ) (string, string) {
return y, x
}
func main() {
a, b := swap("hello", "world")
fmt.Println(a, b)
}
\\`\
### Variable
\var\ステートメントを利用すれば、変数宣言ができる。
変数宣言時に初期化することができ、初期化した場合は型宣言を省略できる。
**関数の中では**、\var\`宣言の代わりに、\`:=\を利用して暗黙的な型宣言ができる。
関数の外では\var\宣言が必要。
変数宣言は\import\と同じで、まとめて宣言可能。
変数を初期化せず宣言した場合、ゼロ値が与えられる。
- int, float -> 0
- bool -> false
- string -> ""
\\`\go
package main
import "fmt"
var i, j int = 1, 2
var (
i = 1
j = 2
)
func main() {
var c, python = true, false
java := "no!"
fmt.Println(i, j, c, python, java)
}
\\`\
### Basic types
Go言語の型は以下の通り。
- \bool\
- \string\
- \int\`, \`int8\`, \`int16\`, \`int32\`, \`int64\
- \uint\`, \`uint8\`, \`uint16\`, \`uint32\`, \`uint64\`, \`uintptr\
- intの符号なし版
- \byte\
- uint8 の別名
- \rune\
- int32 の別名で、Unicode のコードポイントを表す
- \float32\`, \`float64\
- \complex64\`, \`complex128\
\rune\については以下記事参考。
(https://qiita.com/seihmd/items/4a878e7fa340d7963fee)
### Type conversions(型変換)
型変換は対象の変数を囲う。
Go言語で型変換をする場合、明示的な型変換が必要。
\\`\go
package main
import (
"fmt"
"math"
)
func main() {
var x, y int = 3, 4
var f float64 = math.Sqrt(float64(x*x + y*y))
var z uint = uint(f)
fmt.Println(x, y, z)
}
\\`\
### Type inference(型推論)
明示的な型を指定せずに変数を宣言する場合( := や var = のいずれか)、変数の型は右側の変数から型推論される。
\\`\go
package main
import "fmt"
func main() {
v := 42 // change me!
fmt.Printf("v is of type %T\n", v)
}
\\`\