環境設定
環境は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に該当するからです。
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(コードアップ済み)
応用
今後追記
コメント