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学習メモ

  • インターフェース型のerrorError() 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に伝えておく)
  • 利用規約を作る
  • コンテンツを生成したユーザーを非表示にする(僕の場合は実装していませんがあると望ましいです)

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のスコープ内でのみ使える

A Tour of Go1~15学習メモ

こんにちは。がわわです。

GolangAPIを書いていて、わからないことが多くてしんどいことが多いので、基本を勉強するべきだと思い"A Tour of Go"の学習を開始しました。

実行環境が用意されているので楽しく勉強できます。
自分の学習法は

  1. 一度動かしてみて結果を確認する
  2. 中身を別のテキストエディタにコピペする
  3. 写経する
  4. もう一度実行して先の結果と一致したら次に進む

というふうに行っています。


プログラミングは書かないと覚えられないので、見てるだけではダメです。


さて、学習した中で知らなかった部分はここにまとめます。

  • 小文字のメソッド名:importした際に参照できない、大文字のメソッド名:importした際に参照できる
  • 戻り値パラメータに名前がつけられているメソッドはreturnだけ書けばそのパラメータが戻り値となる
  • :=の省略する形式は関数外ではエラー
  • fmt.Printfの中で%Tで型, %vで値を表示できる
  • fmt.Printlnだと"%T(%v)"で後ろにパラメータ書いても型や値が入らない
  • complex64は32ビットの複素数型, complex128は64ビットの複素数
  • 定数は:=で宣言できない