#Goの基礎を備忘録ってことで、綴っていきます。
初心者なので、間違ってたりしたら教えてください。
##変数を宣言する
明示的に変数を定義する場合
var [NAME] [TYPE]
暗黙的に変数を定義する場合
[NAME] := [VALUE]
後者に関しては、型を意識する必要がない。
#条件分岐 IF
単純にこう。
if <条件式> {
<処理>
} else if <条件式> {
<処理>
} else {
<処理>
}
ちなみに、複数の条件式があり、ANDを使いたい場合は&&
とすれば良し。
ORであれば、||
でOK。
##配列の長さを取得する
<長さを格納する変数> := len(<サイズを取得したい変数>)
##コマンドライン引数を受け取る FLAG編
まずは基本から
package main
import "flag"
import "fmt"
func main() {
flag.Parse()
argv := flag.Args()
fmt.Println(argv)
}
コマンドライン引数が渡されなかったときのエラー処理
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のやり方よりも簡単そうです。
fmt.Println(os.Args)
os.Args
に関しては、1つ目(os.Args[0]
で指定するもの)はファイル名みたいなものになってるから注意。
つまり、引数自体は[1]以降である。
##制御構文 FOR
基本はCのFOR文と同じみたいね
※n回ループする
for i := 0; i < n; i++ {
<処理>
}
##文字を表示させる
Cのように、書式指定子があるっぽい「が、」全て%v
で解決するらしい!
つまり、これで全てが解決するってこと。
fmt.Printf("%v\n", <表示させたい内容>)
##文字列の正規表現
あまり解説しているサイトがないからちょっと深く掘っていく
詳しくはここを見たらいいと思う
Goの正規表現【プログラミング初心者向け教材】
Goには標準で「MatchString関数」が入ってあるからこれを使う。
(regexpをIMPORTする必要あり!)
この関数はTrueかFalseを返すのでその帰り値によってIFとかやればいいと思う。
str := "I'm LabPixel." //確認する文字
regular := regexp.MustCompile("LabPixel") //正規表現確認の変数を作る
regular.MatchString(str) //TrueもしくはFalseを返す
##BOOL型の比較
例えば、前のやつでregular.MatchString(str)
がBOOLだけど、これをIF文で条件分岐させる。
if regular.MatchString(str) == true {
<処理>
} else if regular.MatchString(str) == false {
<処理>
}
このようにすればよい。
注意点としては、Trueとか"True"とかしないこと!
##文字列を数値に変換する AtoI
コマンドライン引数から受け取った文字列を数値に変換したいことってよくあるよねって話。
num, err := strconv.Atoi("123")
fmt.Println(num)
よくerr
のとこを_
って書いてる記事あるけど、これはエラーが出た場合に返すための変数。
開発元の説明書に書いてあります↓
https://pkg.go.dev/strconv
このerr
のなかにnilが入ると(err == nil
が正の時)正常終了したことを意味する
##複数関数を作りたいときっ!
関数をメインの外に作っ使いたいときって結構ある。
その時もpackage main
のところは変える必要がないみたい。
package main
import "fmt"
func ft_print(str interface{}) {
fmt.Println(str)
}
func main() {
ft_print("HelloWorld")
}
こんな感じで、メインの中で呼び出す。
###関数の引数と戻り値について
他に関数が作れることはわかったが、引数の渡し方について書く。
func <関数名> (<引数の名前> <引数の型>) (<戻り値1の型> ... <戻り値3の型>) {
<処理>
return <戻り値1> ... <戻り値3>
}
##たくさんImportする グループ化
沢山パッケージを使いたいときってよくあります。
import (
"fmt"
"os"
)
のようにすればOKです! これはグループ化と呼ばれる方法です。
Importの詳しい解説がここにありました!
【Go】import 書き方まとめ
##関数のエラー処理で「!変数名」って形
まず、!変数名
の形はBOOL型変数しか使えないらしいから注意。
だから、こんな感じでエラー処理を書いていく。
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) //戻り値2つを取る
if !ok { //OKが無かったら
<エラーの時の処理>
}
fmt.Print(s)
}
##文字列連結
型が同じであれば、+
で連結できる。
例えば、連結して変数に入れることもできる。
space := " "
apple_pen := "apple" + spece + "pen"
##スライス
スライスを扱う。
このような感じで、範囲を指定していく
var orig = []int{0, 1, 2, 3, 4, 5}
fmt.Printf(orig[0:6])
##スライスの作り方
空のスライスを容量と容量を決めて作成する。
スライスではlength(長さ)とcapacity(容量)があって、この2つには違いがある。
lenは実際のスライスの長さ、capはスライスを実装するために内部的に準備している配列の長さ。
myOwnSlice := make([]int, 0, 10)
このような感じで容量と内容を決めて空のスライスを作成することが出来る!
##スライスで要素を追加 APPEND
このような感じで、要素を追加できる。
ただしappend
に関しては、新しい配列を返すので、そこだけ注意。
func main(){
old_slice := [] string{"a", "b"}
new_slice := append(old_slice, "c")
fmt.Println(new_slice)
}
このように新しく変数を作ってやるとうまくいく。
複数個付け加えたいなら、append(old_slice, "c", "d")
とすると良き。
##スライスで要素を追加
追加する場所が決まっいるならappend
を使わなくてもいける。
このような感じで書けばOK
slice[追加したい場所] = <追加したい要素>
##コマンドラインオプション 書きかけ
どうやらflag
パッケージにて、オプションを作ったりするのが簡易化されてるっぽい
#参考文献
同じ記事が複数あったらごめんなさい。
同じのを見たってことでw