【プログラミングメモ】Golangの学習過程を公開!

golangDocker

環境設定

環境はDockerで作成、
Dev Containerを使ってサクッと勉強開始できるようにしてます。
私のGitHubで公開しているので、よろしければどうぞ!
Visual Studio Code(VSCode)前提です

VSCodeのDockerのターミナルでgo docコマンドが打てるようにしてあります。
goのパッケージのドキュメントを確認できるのでご活用ください。
fmtの説明を見たい場合↓

go doc fmt

基礎

Hello World!

まずはなんと言ってもHello World!笑
Gitのbasicフォルダ以下にソースコードを用意したので、
go run basic/hello_world.go
で実行してみます。

package main

import "fmt"

func main() {
	fmt.Println("Hellow World!")
}


packageの名前は、
外部から内部コードを参照する際の名称になるので、重要です。

ここのmainというpackage名は、特別な意味を持つものとなり、
Goのプログラムの起動時には、mainという名前のpackage内の
mainという名前の関数が自動で実行されます。
ここの名前が違っていると、
「package command-line-arguments is not a main package」
こんなエラーが出るので注意しましょう。

init()

main()関数はその名の通りメインの関数なので
重要なようですが、同じフォルダ内にmain()は1個じゃないとエラーになるようです。
※正確にはgo runで実行はできるが、VSCodeでエラー表示になる
「main redeclared in this block」
なので、ひとまずフォルダ分けしました。

  • basic/hello_world
  • basic/init
package main

import "fmt"

func init() {
	fmt.Println("init")
}

func something() {
	fmt.Println("Do something!")
}

func main() {
	fmt.Println("init main")
	something()
}

上記の実行結果は、以下のようになり、
※go run basic/init/init.go
init()関数が先にくるようです。初期化処理に使えそうですね。
init
init main
Do something!

import

importするパッケージはGoのサイトで確認できる
例えば、fmtのPrintlnはここ

importは
import “fmt”
import “time”
と書いてもいいですがimport2回は冗長なので
()で囲って、まとめてインポートします。

今回は、”time”をインポートして
現在時刻を出してみました。
go run basic/import/import.goで
以下のように出力されるでしょう※時間は実行日時で変わる
import!
Now 2023-06-10 23:56:10.438449428 +0000 UTC m=+0.000084168

package main

/*
import "fmt"
import "time"
*/

import (
	"fmt"
	"time"
)

func main() {
	fmt.Println("import!")
	fmt.Println("Now", time.Now())
}

ちなみに、コメントは
1行://コメント
複数行:/* コメント複数 */
でいけるみたいです。

変数

変数と言いつつ、定数もやってます。
値を変える必要がなければconstを使うといいです。
1個ずつ定義することも、()でまとめて定義することも可能です。

変数を使いたい場合は、varで定義します。
こちらも個別に定義、()でまとめて定義とありますが、
i := 1のように:=で定義すると、
その時の型は推定してくれるようです。

fmt.Printf(“%T %T %T %T %T “, i, f, s, bt, bf)で
型を表示していますので、確認してみてください。
※fmt.Printfはフォーマット指定で出力する関数、%Tは型表示です。
↓こんな感じで出ます。推定してくれてますね。
int float64 string bool bool 1 1.2 hoge true false

キャスト(型変換)はint(), string()で実施する。

配列は、var a [2]intのような形で
var 配列名 1配列の長さ 配列の型で定義する。

長さを指定しないarray?にsliceというものがある
具体的な定義は、このサイトが分かりやすかった。

mapはキーとバリューで値を保持できる。他の言語でもよくあるもの。
ただ、配列もそうだけど型の定義が後ろにきているのは(a [2]int感じで)
今までやってきた言語と違うので、若干戸惑いますね!笑

あとはbyte型というのもあって、
byt := []byte{65, 66}感じで定義するのですが、
これをstringにキャストするとA, Bになるのはなかなか面白い〜。
ASCIIコードの65、66がそれぞれ文字のAとBに該当するからです。

ASCII_A_B
package main

import "fmt"

/* const */
const number = 1

const (
	name     = "Coroccu"
	password = "test"
)

func main() {
	/* var */

	/*
		var i int = 1
		var f float64 = 1.2
		var s string = "hoge"
		var t bool = true
	*/

	/*
		var (
			i int     = 1
			f float64 = 1.2
			s string  = "hoge"
			t bool    = true
		)
	*/

	i := 1
	f := 1.2
	s := "hoge"
	bt := true
	bf := false

	fmt.Println(number, name, password)
	fmt.Printf("%T %T %T %T %T ", i, f, s, bt, bf)
	fmt.Println(i, f, s, bt, bf)

	// cast
	var x int = 1
	xx := float64(x)
	fmt.Printf("%T %v %f\n", xx, xx, xx)

	var y float64 = 1
	yy := int(y)
	fmt.Printf("%T %v %d\n", yy, yy, yy)

	// array
	var a [2]int
	a[0] = 10
	a[1] = 20
	fmt.Println(a)

	//slice
	b := []int{1, 2, 3, 4}
	fmt.Println(b)
	fmt.Println(b[2])  //3
	fmt.Println(b[:2]) //1 2
	fmt.Println(b[:])  //all=1 2 3 4
	b[2] = 5
	fmt.Println(b) //1 2 5 4

	// var c = make([]int, 5)
	var c = make([]int, 0, 5)
	for i := 0; i < 5; i++ {
		c = append(c, i)
		fmt.Println(c)
	}
	fmt.Println(c)

	//map
	m := map[string]int{"Dogs": 100, "Cats": 200}
	fmt.Println(m)
	fmt.Println(m["Dogs"]) //100
	m["Pandas"] = 300
	fmt.Println(m)
	fmt.Println(m["none"]) //0

	//byte
	byt := []byte{65, 66}
	fmt.Println(byt)
	fmt.Println(string(byt)) //AB ASCII Codes
}

条件分岐

if文とswitch文です。
あんまり他の言語と変わらない気はします。
下記のコードで色々と条件を変えてお試しを!

package main

import "fmt"

func main() {
	num := 4
	// num := 6
	// num := 10

	if num == 4 {
		fmt.Println("This is ", 4)
	} else if num == 6 {
		fmt.Println("This is ", 6)
	} else {
		fmt.Println("Others")
	}

	x, y := 10, 10
	// x, y := 10, 11

	if x == 10 && y == 10 {
		fmt.Println("And")
	}

	if x == 10 || y == 10 {
		fmt.Println("OR")
	}

	animal := "cat"
	switch animal {
	case "cat":
		fmt.Println("Cat!")
	case "dog":
		fmt.Println("Dog!")
	default:
		fmt.Println("Default!")
	}
}

ループ

TBD(コードアップ済み)

エラー処理

TBD(コードアップ済み)

応用

今後追記

コメント

タイトルとURLをコピーしました