Code & Book
golang

【Golang】Go言語_基本的な文法まとめ

go公式ドキュメント

実行方法

Hello Worldをprintするのみの処理

package main

import "fmt"

//起点となる関数は「main」と言う名前の関数名で固定、呼び出された時にmainが実行される
func main(){
	fmt.Println("Hello World")
}

>> Hello World

実行方法

// go拡張子のファイルをコンパイルする。同階層にコンパイルされたバイナリファイルが生成される。
go build {コンパイルするファイル名}

// コンパイルされたファイルを実行する
./{コンパイル後のファイル名}

// コンパイルと実行を同時に行う
go run {実行するファイル名}

配列

package main

import "fmt"


func main(){
	var a [2]int // 配列の宣言
	a[0] = 1
	a[1] = 2
	
	var b []int = []int{1, 2} // 宣言と同時に値を入れる
	b = append(b, 3) //配列に値の追加。配列のサイズは変更できないが、最初にサイズを宣言しなかった場合は変更可

	fmt.Println(a)
	fmt.Println(b)
}

>>> [1 2]
>>> [1 2 3]

map

pythonでいうdictのようなもの、キーと値がセットになっている。

package main

import "fmt"

func main(){
	m := map[string]int{"udon": 100, "soba": 200}
	m["ramen"] = 300 // 値の更新
	fmt.Println(m)
}

>>> map[ramen:300 soba:200 udon:100]

関数

package main

import "fmt"

func add(x int, y int) int {
	return x + y
}

func main(){
	a := add(10, 20)
	fmt.Println(a)
}

>>> 30

defer

  • 関数の実行を、呼び出し元の関数の終わりまで遅延させる
func main() {
	defer fmt.Println("world")
	fmt.Println("hello")
}

>>> hello
>>> world
  • 複数存在する場合はLIFOの順番(最初に渡した処理が最後に実行される)で実行される
func main() {
	defer fmt.Println("world")
	defer fmt.Println("hello")
}

>>> hello
>>> world

返り値の記載の省略

package main

import "fmt"

// 返り値のアノテーションで変数の宣言と返り値の指定をできる
func substract(x, y int) (result int){
	result = x - y
	return // アノテーションで指定しているので省略できる
}

func main(){
	a := substract(30, 10)
	fmt.Println(a)
}

>>> 20

無名関数

pythonでいうlambdaのような書き方

package main

import "fmt"

func main(){
	
	// 簡易的に関数を宣言できる
	f := func(){
		fmt.Println("poyo")
	}
	f()
}

>>> poyo

可変長引数

package main

import "fmt"

// 可変長引数
func arg_print(args ...int){
	for _, arg := range args{
		fmt.Println(arg)
	}

}

func main(){
	arg_print(10, 20)

	s := []int{1,2,3}
	arg_print(s...) // リストの中身を展開して入れてる
}

>>> 10
>>> 20
>>> 1
>>> 2
>>> 3

条件分岐

if文

  • よくあるelse if やelseが使える
  • 初期化ステートメントが使用できる。(省略化)
    • if文の最初に実行される
    • この時に宣言された変数はif文の中でしか使えない
if 初期化ステートメント; 条件式{
} else if 条件式{
} else {
}

package main

import "fmt"


func main(){

	if num := 10; num % 2 == 0{
		fmtPrintln("2で割り切れる")
	} else if num % 3 == 0{
		fmt.Println("3で割り切れる")
	} else{
		fmt.Println("2でも3でも割り切れない")
	}
}

switch文

  • 上から下に評価していき、条件が合致した時点で
  • if文と同様に初期化ステートメントが使用できる

package main

import "fmt"


func main(){

	switch os := "aa"; os{
	case "mac"
		fmtPrintln("Macだよ")
	case "windows"
		fmtPrintln("Windowsだよ")
	default
		fmtPrintln("MacでもWindowsでもないよ")
	}

}

条件式のないswitch

  • if文の代わりのような感じで書ける
    • if elseが長く続く様であればこちらを採用するなど
package main

import "fmt"


func main(){
	time = 20
	switch {
	case t.Hour() < 12:
		fmt.Println("朝だよ")
	case t.Hour() < 17:
		fmt.Println("昼だよ")
	default:
		fmt.Println("夜だよ")
	}
}

for文

  • 初期化ステートメント: 最初のイテレーションの前に実行される
  • 条件式: イテレーション毎に評価される
  • 後処理ステートメント: イテレーション毎の最後に実行される
for 初期化ステートメント ; 条件式 ; 後処理ステ=トメント{

}

他言語のwhileのような書き方

  • 初期化と後処理ステートメントを省略するとwhileのような書き方ににある
  • その場合はセミコロンを省略化
for 条件式{

}

無限ループ

  • 全て省略すると無限ループになる
for {
}

おわり

最近go言語を触り始めてみたので基本的な文法をまとめてみました。
goは型に対して制約が厳しい印象だったので型推論で変数を宣言できるところは意外だった。
現場で書く時はどのように書くのかな。

ではまた。( ´ ▽ ` )