A Tour of Go63~72学習メモ
- goroutineは軽量なスレッド
- go funcでfuncを別スレッドで実行できる
- 同期する際はチャネルを使う
- チャネルに値を受信するまで送信されないし、受信の準備ができるまでチャネルから送信されない
- ch := make(chan 型)の形で生成
- チャネルにはバッファ(許容量)があるmakeの第二引数に設定できる
- チャネルは先入先出
- v, ok := <-c でokがtrueならチャンネルは開いてる、falseなら閉じている
- rangeなどこれ以上くる値がないことを知らせる場合は送信側のチャネルをcloseで閉じる
- selectでgoroutineをcaseの条件で一致するまでブロックし、一致したcaseを実行、複数一致ならランダム
- selectでブロックしないで送受信するならdefault文を書く
演習問題は所々飛ばしてとりあえず文法を学ぶことを優先にやってきたA Tour of Goも今日で終わり!
明日からは自分が作ってるアプリを再開して早めに終わらせたいな。
A Tour of Go55~62学習メモ
- インターフェース型のerrorにError() stringという文字列を返すメソッドが定義されている
- 返すエラーを自分で定義する際はstructを定義して、Error() stringのメソッドを実装
- httpパッケージからHTTPリクエストの処理機能が提供されている
- インターフェース型のHandlerにServeHTTP(w ResponseWriter, r *Request)というメソッドが定義されている
A Tour of Go58の解答
package main import ( "fmt" "net/http" ) type String string type Struct struct { Greeting string Punct string Who string } func (str String) ServeHTTP(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "%s", str) } func (str *Struct) ServeHTTP(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "%s%s%s", str.Greeting, str.Punct, str.Who) } func init() { http.Handle("/string", String("I'm a frayed knot.")) http.Handle("/struct", &Struct{"Hello", ":", "Gophers!"}) http.ListenAndServe("localhost:4000", nil) }
悩んだところ
- yamlファイルのscript: _go_appの部分はscriptの前にスペース2個。pythonはこういうところが厳密なので注意。
- func init()で書かなければならない。今までmain()でチュートリアルが進んでいたのでここで詰まってしまった。
- fmt.Fprintfを使わないと表示されないので注意
- http://localhost:4000/string, structでアクセスしないといけないのにhttp://localhost:4000だけでアクセスしていた
14.3項を理由にAppleにリジェクトをくらった時の解決法
こんにちは。がわわです。
iPhoneアプリには審査がありガイドラインが規定されています。
14.3
Apps that display user generated content must include a method for filtering objectionable material, a mechanism for users to flag offensive content, and the ability to block abusive users from the service
引用:App Store Review Guidelines - Apple Developer
タイトルにある14.3項とは意訳すると「ユーザーが生成したコンテンツがある場合、そのコンテンツを表示しないようにする仕組みを作らなければならない」というものです。
僕はこれでリジェクトをくらいました。
解決法は以下全て(最後のはあると望ましいです)。
Appleに伝える際はiTunesConnectのマイAppの「App Reviewに関する情報」のメモに書いておけば良いでしょう。
僕の場合はリジェクトをくらった際に問題解決センターでやりとりしている際に説明しましたけど。
なにはともあれ、1ヶ月以上かかった審査も終わりました!
"Thank you for choosing iOS and the App Store."とか言われてもめげなくて良かった!
ちなみにアプリはこれです。
ダウンロードしてくださると嬉しいです。
A Tour of Go42~54学習メモ
- Goの関数はクロージャ
- クロージャとはそれ自身の外部から変数を参照する関数の値
- 43での実装例はadder関数がクロージャを返していて、sum変数が関数に関連づけられて保持されている
- switch文でcaseの最後で自動的にbreakする
- breakせずに通したい場合はfallthrough文をcaseの最後に記述(defaultでは書かない)
- メソッドはレシーバ(structで定義される)と関連付けた関数
- 他のパッケージからの型や基本型にはメソッドが定義できない
- インターフェース型はメソッド群で定義される
- 54はおそらく明示的にどのインターフェースを持っているか書かなくて良くて定義されているインターフェースのように振る舞えるということ(Javaみたいにclassにimplementsしなくて良いみたいな?)
うーん。暗黙的なインターフェースのところが理解できてるか自信ないな。
A Tour of Go44の解答
package main import "fmt" // fibonacci is a function that returns // a function that returns an int. func fibonacci() func(i int) int { j, k := 0, 1 return func(i int) int { switch i { case 0: return 0 case 1: return 1 default: j, k = k, j + k return k } } } func main() { f := fibonacci() for i := 0; i < 10; i++ { fmt.Println(f(i)) } }
switch文使ったり、引数にループ変数渡したりしちゃいましたけど実装できました。
A Tour of Go31~41学習メモ
こんにちは。がわわです。
sliceとmapが主な内容です。
参照渡し、値渡しって注意しないとなんだかよくわからなくなっちゃいますね。
【slice】
- sliceはarrayのように要素数を明示的に表示しない柔軟な配列
- sliceにsliceを代入する際は参照を渡す
- sliceやarrayにarrayを代入するときは値を渡す
- 容量は最大の要素数のこと
- sliceはs[start: last]でstart〜last-1までの値をスライスsから参照する
- Golangでは基本的にslice推奨のよう
- for文でのrangeはsliceやmapを反復処理する
- _(アンダーバー)は代入すると破棄される
- appendすると渡されていた参照がリセットされる
range使用例
//iはsliceの添字, vはslice[添字]の値 for i, v := range slice { fmt.Printf("i == %d, v == %d\n", i, v) }
appendの話
package main import "fmt" func main() { a := []int{11, 12, 13} b := a a[0] = 100 //a == [100, 12, 13], b == [100, 12, 13] a = append(a, 14) a[0] = 200 //a == [200, 12, 13, 14], b == [100, 12, 13] }
【map】
- delete(map, key)でmapのkeyに対応するvalue削除
- v, ok := map[key]でkeyに対応するvalueがあるか否かがokに代入される(true or false)
A Tour of Go41 Exercise: Mapsの解答
package main import ( "code.google.com/p/go-tour/wc" "strings" ) func WordCount(s string) map[string]int { m := make(map[string]int) for _, v := range strings.Fields(s) { m[v] += 1 } return m } func main() { wc.Test(WordCount) }
A Tour of Go16~30学習メモ
こんにちは。がわわです。
今のところ滞りなく進められているので楽しいです。
以下、学習メモ。(自分で調べたものも含まれています)
- iotaは定数の宣言で使用されconstが出るたびにリセットされて0になる、グループ内で定数を定義するごとに1増える
- <<は左シフト、>>は右シフトという。例えば左シフトは0を右側に挿入する(ex. 1<<2なら2進数で100と表示され10進数で4になる)
- for文の条件式の前後を省略できる、セミコロンも省略できる(要はwhile文)
- for文の条件式を省略することで無限ループになる
- math.Pow(x, y)でxのy乗を計算する
- if文の条件式で宣言された変数はif, elseのスコープ内でのみ使える