この記事はGO言語を自分が勉強していくにあたって使うメモ記事です。なので内容が整理されていなかったり、間違っていたりする可能性があります。
const (
a = iota //0
b //1
c //2
d //3
)
s := []string{@,@,@}
for i, v:= range s { //i(キー), v(値)
// for _, v := range s {}でインデックス省略できる *ブランク修飾子
fmt.Println()
}
func 関数名(引数 型) 返り値の型(必要なら) {
処理
}
or
func 関数名(引数 型) (返り値変数 返り値の型) {
処理
return
}
でも指定した返り値が返される
func swap(a, b int) (int, int){
return b,a
}
switch 変数 {
case 変数条件:
処理
default:
処理
}
or
switch {
case 条件:
処理
default:
処理
}
Stype user struct { //フィールド
name string
score int
}
u := new(user)
//fmt.Println(u) => &{ 0} で空文字と0がポインタで返却される
u.name = "mary"
//(*u).name = "mary"も可
(*u).score = 20
fmt.Println(u) //&{mary 20}
m := user{"kary", 50}
// m := user{name: "kary",score: 50}も可
fmt.Println(m) //{kary 50} <=ポインタはかえって来ない
func (u user) show(){ //値渡し、コピーのみ渡す
//func (u *user) show()で参照渡し(アドレスで渡し変更が本体にも適用される
)もできる
fmt.Printf("name: %s, score: %d\n", u.name, u.score)
}
type greeter interface { //インターフェース部分
greet() //ここの記述によりgreet()メソッドを実装した構造体はgreeterインターフェースに自動的になる
}
type japanese struct {}
type american struct {}
//japanese, aamericanがgreeter interfaceの実装部分
func (j japanese) greet(){
fmt.Println("こんにちは")
}
func (a american) greet(){
fmt.Println("Hello")
}
// greet()メソッドが実装されたのでjapanese, aamericanはgreeter interfacになる
func interfaceF(){
greeters := []greeter{japanese{}, american{}}
//greeter interfaceとしてjapanesse, americannを一つのスライスに格納可能
for _, greeter := range greeters {
greeter.greet()
}
}
func show(i interface{}){ //どんな型でも受け入れられる。Genericsみたい
//型アサーション
_, tf := i.(japanese) // 値, japaneseかどうか
if tf {
fmt.Println("私は日本人")
} else {
fmt.Println("I'm American.")
}
//型switch
switch i.(type) {
case japanese:
fmt.Println("よろしゅう")
case american:
fmt.Println("Have a nice day!")
default:
fmt.Println("???")
}
}
func longTask(){
}
func shortTask(){
}
func gorutineF(){
go longTask() //goを前につけることで同時実行
go shortTask()
time.Sleep(time.Second * 4) //勝手にタスク終了することを防ぐ
}
たぶん非同期的に値を取得する方法。goroutineは値を返すようになっていないのでgoを使う関数に引数としてチャネルの変数を渡してあげる。
func f1(result chan string){
time.Sleep(time.Second * 2)
fmt.Println("Long task was finished!")
result<- "result is this"
}
func f2(){
fmt.Println("Easy task was finished!")
}
func channelf(){
result := make(chan string) //chanがチャネルだよっていう合図
fmt.Println("task start")
go f1(result)
go f2()
fmt.Println("run and wating")
fmt.Println(<-result) //読み込まれた時点でresultの中身がない場合f1でresultに代入があるまで出力されない
time.Sleep(time.Second * 4)
}
実行結果
task start
run and wating
Easy task was finished!
Long task was finished!
result is this
defer : 遅延実行する
defer r.Body.Close() // ファイルを閉じる作業を一番最後に実行する。