GO
goについて
go言語を始めようと思います
ネットワークからos、モバイルなどgoで出来ることはとっても広いです
初学からどこまで行けるかがんばります^^
関数について
関数はpythonみたいな感じがします...触ったことないけど..
戻り地などは珍しく関数名の後に記述するタイプ
func add() (int){
x := 1
y := 2
return x + y
}
面白いことに変数名と戻り地が同じ場合は暗黙的に返却される
func ret() (x,y int){ //ちなこれも暗黙的に初期化される var x int = 0 var y int 0
x = 1
y = 2
return //暗黙的に返却される
}
あっ こんな感じにすればファイルのエラーチェックできますよー
func file_check() error { //errorという方があるらしいstring
path := os.Args[1]
fileInfo, err := os.Stat(path) //Statでfile情報を取得
if err != nil {
return err //存在しないとき
}
if fileInfo.IsDir(){ //fileinfoがディレクトリなら
fmt.Printf("%s is a directory\n",path)
}
return nil
}
コマンドライン引数について
自動的にargsにれられる cも一緒
os.Args
len(os.Args) //cで言うargc
os.Args[1] //1個目
statとopenの違い
特徴 | Head | Head |
---|---|---|
エラー | 存在しない、権限なし、パス不正など | 存在しない権限なし、ロック中など |
リソース | ファイルハンドルを開かない | ファイルハンドルを開く(Close()必須) |
エラー文の返却
戻り地について CPPのtry chatchみたいな感じ
import(
"errors"
)
//戻り値はerror
return errors.New("エラーメッセージ")
fmt.Println("error: %v" error)//戻り値
deferについて
これは動作の前に記述します
defer inputFile.close() //ファイルが閉じる処理を遅延実行する
バッファのクリーンなどでとても使えるもの。
権限に関しては実行エラーを見たほうが良い
file.Mode()関数があるあが、一般的ではない。むしろ実行エラーの際に返すと良い
goの常識
・パッケージは一個しか宣言できない
・グローバル変数は暗黙的な宣言だと使用できない ※明示的な場合は可能
・明示的と暗黙的(環境依存)のint型は、同じ型だとしても計算は不可能
・%Tは型表示
・要素の自動カウント[...]
arr := [...]string{"A","B"}
・同じ要素は配列ごと代入できる
・interface型は演算などはできない、けど色んな値が入る
・大文字か小文字かでprivateかpublicを分離できる 大文字の場合別のパッケージから読み込める
・変数は型を超えて宣言できない、だが定数の場合は超えて宣言が可能
・iotaは連番を生成 コンパイル時に決まるためケースバイケース
・runeは一文字や記号を表すのに使われる型
同時宣言時の初期化について
const (
A = 1
B
C
D = "A"
E
F
)
この場合のBCは1で初期化される EFは”A”で初期化される
Goのルール
変数名は短いほうがいい
requestはreqなど ※別の場所で使用する場合はわかりやすく説明もつける必要がある。
無名関数と関数について
無名関数は変数に代入する形で使うことができる
f := func(x,y int) int {
return x + y
}
fmt.Println(f(1,2)) // 3
goのconstは優秀
固定値なので、算術演算を許されないが
const (
a = 1
b = 9223372036854775807 + 1 // unist64を超える数値でも定義可能
c = iota + 10 //iotaが使える
)
だが
const(
d int 32 = 4294967295 + 1 //型の範囲を超えるためエラー
e []int = []int{1,2,3} //配列やスライスはエラー
f map[string]int = map[string]int{ //mapもエラー
"tokyo": 10
}
)
typeとは
めちゃくちゃいいねこれ 自分で型を作れちゃう
type Myint = int
var num1 Myint = 10
var num2 int = 10
result := a + b //同じ型なので計算可能
fmt.Println(result)
初期化しなくても型が使える
intは0
stringは""
boolはfalse
errorはnil