[Golang]goでfizz buzz

なんとなくふと思い立って懐かしくなり書いてみた。
とくに意味はありません。

package main

import (
    "fmt"
)

func main() {
    for i := 1; i < 100; i++ {
        if i%15 == 0 {
            fmt.Println("fizz buzz")
        } else if i%5 == 0 {
            fmt.Println("buzz")
        } else if i%3 == 0 {
            fmt.Println("fizz")
        } else {
            fmt.Println(i)
        }
    }
}

ソースはこちら

[Golang] echo を作ってみた

エクササイズを参考に。

その1

package main

import (
    "fmt"
    "os"
)

func main() {
    var s, sep string
    for i := 1; i < len(os.Args); i++ {
        s += sep + os.Args[i]
        sep = " "
    }

    fmt.Println(s)
}

ソースはこちら

その2

package main

import (
    "fmt"
    "os"
)

func main() {
    s, sep := "", ""
    for _, arg := range os.Args[1:] {
        s += sep + arg
        sep = " "
    }

    fmt.Println(s)
}

ソースはこちら

ほぼ写経。
最近PHPばっかりだったから新鮮で面白い。

iti

[Golang]ポインタの挙動の確認

ポインタの挙動の確認。

ポイントは2つ

  • ポインタはアドレスを持つ
  • デリファレンスして実体を操作する

サンプル

func main() {
    var p *int // int型のポインタの宣言

    fmt.Println(p) // == nil

    v := 2
    fmt.Println(&v) // vのアドレス

    p = &v
    fmt.Println(p) // vのアドレスと同じ

    // *をつけるとデリファレンス(ポインタ型を通してデータ本体を参照すること)できる
    fmt.Println(*p) // == 2

    // pを通してvの値を更新
    *p = 5
    fmt.Println(v) // == 5

    // 関数を使ったポインタの挙動確認
    i := 1

    // 関数の引数は値コピーなので呼び出し元には関係ない
    inc(i)
    inc(i)
    fmt.Println(i) // == 1

    // ポインタを使って変更する
    inc_p(&i)
    inc_p(&i)
    inc_p(&i)
    fmt.Println(i) // == 4

}

func inc(i int) {
    i++
}

func inc_p(i *int) {
    *i++
}

ソースはこちら

iti

[Golang]flagとテンプレート

Go言語によるwebアプリケーション
1.3.1 テンプレートの活用

べた書きしていたポートの指定をflagを使って実装する。
ついでに テンプレートでも使う。

フラグを使う

var addr = flag.String("addr", ":8080", "アプリケーションのアドレス")
flag.Parse() // flagを解釈します

こんな感じにすると、

./chat -addr=":3000"

みたいな感じで使える。
もしパラメータなしで起動した場合は初期値(例では8080)が使用される。

## テンプレートを使う

テンプレートには以下の形式でデータを埋め込める。

{{ }}

 こんな感じ。

socket = new WebSocket("ws://{{.Host}}/room");

ソースはこちら

iti

[Golang]mapの挙動の確認

mapの挙動の確認。

省略記法が便利。

package main

import (
    "fmt"
)

func main () {
    // 宣言
    //var m map[int]string

    // makeで作る
    m := make(map[int]string)

    m[1] = "hogehoge"
    m[30] = "hugahuga"
    m[-1] = "hahahah"

    fmt.Println(m)

    // mapリテラルで作る
    m2 := map[string]string{
        "us": "america", 
        "jp": "japan", 
        "hoge": "hogehoge", // カンマが必要
    }

    fmt.Println(m2)

    // sliceをもつmap
    m3 := map[int][]int {
        1: []int{1},
        2: []int{1,3},
        3: {4,3,3}, // 省略することも可能
    }

    fmt.Println(m3)

    // mapの要素がmapの場合 宣言が複雑なのは仕方ないのか。。
    m4 := map[int]map[float64]string {
        1: { 3.14 : "円周率" },
    }

    fmt.Println(m4)

    // 要素の参照時にキーがない場合に初期値が返されてしまう。
    // その回避方法
    m5 := map[int]string{1: "a", 2: "b", 3: "c"}
    s, ok := m5[1]
    fmt.Println(s,ok)
    s2, ok2 := m5[5]
    fmt.Println(s2,ok2)

    // よくある書き方
    if _, ok := m5[2]; ok {
        // キーが存在する場合に処理
        fmt.Println("キーが存在するよ")
    }

    // forで回す
    // キーの順序は保証されない
    for k,v := range m2 {
        fmt.Println(k,v)
    }

    // 要素を削除する
    delete(m5, 2)
    fmt.Println(m5)
}