Echoのサンプルでindexとかが出てきて?となったので、
挙動を確認してみた。
https://github.com/hiyoki/study_go/commit/6d5bbae0acf7fcfa5c435215a605b50172b5fd2b
PHP/Android/MySql/Postgres/Go
Echoのサンプルでindexとかが出てきて?となったので、
挙動を確認してみた。
https://github.com/hiyoki/study_go/commit/6d5bbae0acf7fcfa5c435215a605b50172b5fd2b
なんとなくふと思い立って懐かしくなり書いてみた。
とくに意味はありません。
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)
}
}
}
ソースはこちら
エクササイズを参考に。
その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
goで環境変数の設定と取得方法。
package main
import (
"fmt"
"os"
)
func main() {
// env set
os.Setenv("HOGE", "hogehoge")
// env get
hoge := os.Getenv("HOGE")
// == "hogehoge"
fmt.Println(hoge)
// show env list
for _, e := range os.Environ() {
fmt.Println(e)
}
}
とても簡単。
ソースはこちら。
https://github.com/hiyoki/study_go/blob/master/env_sample.go
goqueryを使ってスクレイピング。
jqueryライクに書けるので簡単でした。
ちょっと書いてみた。
qiitaの検索結果を取得してくるだけのやつ。
他にもスクレイピングのライブラリがいくつかあるみたいなので試してみる予定。
iti
imports周りは基本省略されているので、随時拾っていく必要がある。
しれっと出てくる objx は以下のこと
“github.com/stretchr/objx”
ポインタの挙動の確認。
ポイントは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
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
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)
}