初心者による初心者のためのGo｜製作途中だからどんどん書き加えていくよ

#Goの基礎を備忘録ってことで、綴っていきます。
初心者なので、間違ってたりしたら教えてください。

##変数を宣言する
明示的に変数を定義する場合

```go
var [NAME] [TYPE]
```

暗黙的に変数を定義する場合

```go
[NAME] := [VALUE]
```

後者に関しては、型を意識する必要がない。

#条件分岐　IF
単純にこう。

```go
if <条件式> {
    <処理>
} else if <条件式> {
    <処理>
} else {
    <処理>
}
```

ちなみに、複数の条件式があり、ANDを使いたい場合は```&&```とすれば良し。
ORであれば、```||```でOK。

##配列の長さを取得する

```go
<長さを格納する変数> := len(<サイズを取得したい変数>)
```

##コマンドライン引数を受け取る　FLAG編
まずは基本から

```go
package main

import "flag"
import "fmt"

func main() {
    flag.Parse()
    argv := flag.Args()
    fmt.Println(argv)
}
```

コマンドライン引数が渡されなかったときのエラー処理

```go
package main

import "fmt"
import "flag"

func main() {
	flag.Parse()
	args := flag.Args()
	args_size := len(args)
	if args_size == 0 {
		fmt.Printf("エラーだよ :( ")
	}
	fmt.Println(args)
}
```

##コマンドライン引数を受け取る　OS編
FLAGのやり方よりも簡単そうです。

```go
fmt.Println(os.Args)
```

```os.Args``` に関しては、１つ目（```os.Args[0]```で指定するもの）はファイル名みたいなものになってるから注意。
つまり、引数自体は[1]以降である。


##制御構文　FOR
基本はCのFOR文と同じみたいね

※n回ループする

```go
for i := 0; i < n; i++ {
    <処理>
}
```

##文字を表示させる
Cのように、書式指定子があるっぽい「が、」全て```%v```で解決するらしい！
つまり、これで全てが解決するってこと。

```go
fmt.Printf("%v\n", <表示させたい内容>)
```

##文字列の正規表現
あまり解説しているサイトがないからちょっと深く掘っていく
詳しくはここを見たらいいと思う
<a href="https://tokitsubaki.com/go-regex/444/">Goの正規表現【プログラミング初心者向け教材】</a>

Goには標準で「MatchString関数」が入ってあるからこれを使う。
（regexpをIMPORTする必要あり！）
この関数はTrueかFalseを返すのでその帰り値によってIFとかやればいいと思う。

```go
str := "I'm LabPixel." //確認する文字
regular := regexp.MustCompile("LabPixel") //正規表現確認の変数を作る

regular.MatchString(str) //TrueもしくはFalseを返す
```

##BOOL型の比較
例えば、前のやつで```regular.MatchString(str)```がBOOLだけど、これをIF文で条件分岐させる。

```go
if regular.MatchString(str) == true {
    <処理>
} else if regular.MatchString(str) == false {
    <処理>
}
```

このようにすればよい。
注意点としては、Trueとか"True"とかしないこと！

##文字列を数値に変換する　AtoI
コマンドライン引数から受け取った文字列を数値に変換したいことってよくあるよねって話。

```go
num, err := strconv.Atoi("123")
fmt.Println(num)
```

よく```err```のとこを```_```って書いてる記事あるけど、これはエラーが出た場合に返すための変数。
開発元の説明書に書いてあります↓
<a herf="https://pkg.go.dev/strconv">https://pkg.go.dev/strconv</a>
この```err```のなかにnilが入ると（```err == nil```が正の時）正常終了したことを意味する

##複数関数を作りたいときっ！

関数をメインの外に作っ使いたいときって結構ある。
その時も```package main```のところは変える必要がないみたい。

```go
package main

import "fmt"

func ft_print(str interface{}) {
    fmt.Println(str)
}

func main() {
    ft_print("HelloWorld")
}
```

こんな感じで、メインの中で呼び出す。

###関数の引数と戻り値について

他に関数が作れることはわかったが、引数の渡し方について書く。

```go
func <関数名> (<引数の名前> <引数の型>) (<戻り値１の型> ... <戻り値３の型>) {
    <処理>
    return <戻り値1> ... <戻り値３>
}
```

##たくさんImportする　グループ化

沢山パッケージを使いたいときってよくあります。

```go
import (
    "fmt"
    "os"
)
```

のようにすればOKです！ これはグループ化と呼ばれる方法です。
Importの詳しい解説がここにありました！
<a herf="https://qiita.com/taji-taji/items/5a4f17bcf5b819954cc1">【Go】import 書き方まとめ</a>

##関数のエラー処理で「!変数名」って形

まず、```!変数名```の形はBOOL型変数しか使えないらしいから注意。
だから、こんな感じでエラー処理を書いていく。

```go
package main

import (
	"fmt"
	"os"
)

func hoge(str_number []string) (string, bool) {
	fmt.Println(str_number)
	return_string := "なんか出力"
	return return_string, true
}

const ERROR_MSG string = "Arguments is invalid."

func main() {
	s, ok := calculationStr(os.Args) //戻り値２つを取る
	if !ok { //OKが無かったら
		<エラーの時の処理>
	}
	fmt.Print(s)
}
```

##文字列連結

型が同じであれば、```＋```で連結できる。
例えば、連結して変数に入れることもできる。

```go
space := " "
apple_pen := "apple" + spece + "pen"  
```

##スライス

スライスを扱う。
このような感じで、範囲を指定していく

```go
var orig = []int{0, 1, 2, 3, 4, 5}
fmt.Printf(orig[0:6])
```

##スライスの作り方

空のスライスを容量と容量を決めて作成する。
スライスではlength（長さ）とcapacity（容量）があって、この２つには違いがある。
lenは実際のスライスの長さ、capはスライスを実装するために内部的に準備している配列の長さ。

```go
myOwnSlice := make([]int, 0, 10)
```

このような感じで容量と内容を決めて空のスライスを作成することが出来る！

##スライスで要素を追加　APPEND

このような感じで、要素を追加できる。
ただし```append```に関しては、新しい配列を返すので、そこだけ注意。

```go
func main(){
     old_slice := [] string{"a", "b"}
     new_slice := append(old_slice, "c")

     fmt.Println(new_slice)
}
```

このように新しく変数を作ってやるとうまくいく。
複数個付け加えたいなら、```append(old_slice, "c", "d")```とすると良き。

##スライスで要素を追加

追加する場所が決まっいるなら```append```を使わなくてもいける。
このような感じで書けばOK

```go
slice[追加したい場所] = <追加したい要素>
```

##コマンドラインオプション　書きかけ

どうやら```flag```パッケージにて、オプションを作ったりするのが簡易化されてるっぽい

#参考文献

同じ記事が複数あったらごめんなさい。
同じのを見たってことでｗ

https://qiita.com/HiromuMasuda0228/items/65b9a593275f769f6b69

https://qiita.com/Yaruki00/items/7edc04720a24e71abfa2

http://hydrocul.github.io/wiki/programming_languages_diff/list/size.html#go

https://qiita.com/rock619/items/14eb2b32f189514b5c3c

https://tokitsubaki.com/go-regex/444/

https://code-graffiti.com/boolean-types-in-golang/

http://capm-network.com/?tag=Go%E8%A8%80%E8%AA%9E_%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%83%A9%E3%82%A4%E3%83%B3%E5%BC%95%E6%95%B0

https://leben.mobi/go/strconv/package/

https://qiita.com/gorilla0513/items/7e734c4e0680b5ea341d

https://qiita.com/taji-taji/items/5a4f17bcf5b819954cc1

https://qiita.com/ono_matope/items/d5e70d8a9ff2b54d5c37

https://qiita.com/k-penguin-sato/items/daad9986d6c42bdcde90

https://go-tour-jp.appspot.com/moretypes/11

https://qiita.com/kskumgk63/items/3310e1c44f66b3e74e2b

https://qiita.com/k-penguin-sato/items/daad9986d6c42bdcde90

https://blog.monochromegane.com/blog/2014/01/23/go-flags/