GoでABCに挑むために必要な最低限の知識
Hello Go!
package main import "fmt" func main(){ fmt.Println("Hello Go!") }
これで
$ Hello Go!
できる。
GoでABCを解く
ABCを解く事を目標としたレベルの内容であり、厳密に学びたい場合はA Tour of Goとかでやってください。
agenda
基礎の基礎
基本的な形
冒頭で書いたhelloで察しはつくかもしれないが、ABCを解く程度なら基本的に
package main import "fmt" func main(){ // 必要な処理 }
この形はあまり変わらないだろう。
ABCを解く上では深く考える必要は無いが、Goのプログラムはパッケージから構成される。
ここで書いたコードは、fmt
パッケージをインポートしている。
これは書式入出力に用いられるパッケージだと思って良い。
インポート
もし他にもパッケージをインポートしたい場合は
import ( "fmt" "math" "hoge" "fuga" )
といった感じで追加出来る。
外部パッケージの関数を使う際は、最初の文字を大文字にする
宣言
Goでは変数、関数の宣言時、型の指定は名前の後で行う。
func add(a int, b int) { return a + y } func main() { var a int = 2 var b int = 3 var sum int = add(a, b) }
var
で変数を定義、名前をつけて型も決める。
上のコードは簡略化出来る
func add(a, b int) { return a + b } func main() { var a, b int = 2, 3 var sum = add(a, b) fmt.Println(sum) }
同じ型の宣言はまとめられる 変数の宣言はさらに簡略化できて
var a, b = 2, 3
で良い。初期化した場合は型を省略できる。
更に
a, b := 2, 3
にもできる
型
整数
int // 32bit環境では32bit、64bit環境では64bit int64 // 64bit uint // 符号なしint uint64 // 符号なし64bit整数
float32 // 32bit float64 // 64bit
文字列
string
キャスト
var a float64 = 4.5 var b int = int(a) // 型()でキャスト fmt.Println(a) // 4
書式指定子
- %d
- 10進数
- %f
- 指数なし少数
- %s
- 文字列
配列
var array [5]int primes := [6]int {2, 3, 5, 7, 11, 13}
みたいなの
スライス
配列とちがって可変長。配列への参照のようなもの。スライスに対する操作は配列にも反映される。
primes := [6]int{2, 3, 5, 7, 11, 13} // これは配列 var s[]int = primes[1:4] // primesの要素1~3
ループ
for
cに似ている
for i := 0; i < 10; i++ { sum += 1 }
みたいに書く。
初期化と後処理はしなくても良い
for ; ratio < 100;{ ratio += pt }
とか
while
while文はない。forでできるから。
for sum < 100{ // セミコロンも省略できる sum += a }
if
cに似てる。forと同じく()
は不要
if a > 0 { hoge }
if文でもforみたいに評価前に処理ができる
if sum := a + b + c; sum > 3 { return sum }
みたいに書ける elseは
if sum := a + b + c; sum > 3 { return sum } else if sum == 3 { return 1 } else { return 0 }
みたいなの
switch
Goのswitchはbreak
がいらず、case
が定数や整数である必要もない。
switch class := student.grade; class { case "1-1": first ++ case "1-2": second ++ case "1-3": third ++ default: others ++ }
みたいに書く
入出力
fmt.Println("文字列”,変数)
引数をデフォルトのフォーマットでフォーマットし、標準出力に出力し、改行をする
fmt.Printf("%d",変数)
指定されたフォーマットでフォーマットして標準出力に出力。改行はしない。
fmt.Scan(&変数)
標準入力からテキストを読み込み、スペースで区切られた値として、順番に引数に格納する。
fmt.Scanf("フォーマット指定子”,&変数)
フォーマット指定できるScan。
N個の要素をスキャンしたい時
fmt.Scan(&N) a := make([]int64, N) for i := range a { fmt.Scan(&a[i]) }
みたいにする