http
http.HandlerFuncはhttp.Handlerインターフェイス
Request *
- req.ParseForm()しないとreq.Formやreq.PostFormを使用することはできない
Client *
- CheckRedirect(req *Request, via []*Request) error でリダイレクトを制御する
デフォルトは10回リダイレクトをしたらリダイレクトを止める
reqはこれから実行するRequest
viaはリダイレクトされたRequestが古いものから先に入っている
Transport *
- DefaultTransport *
url *
- Valuesは
map[string][]string
json
stringからmapへ
mapからstringへ
package main
import (
"encoding/json"
"fmt"
)
func main() {
var data interface{}
s := `{"id": 1, "name": "foo", "data": [{"abc": "efg"}, 1234]}`
json.Unmarshal([]byte(s), &data)
fmt.Println(data)
b, _ := json.Marshal(data)
fmt.Println(string(b))
}
// map[data:[map[abc:efg] 1234] id:1 name:foo]
// {"data":[{"abc":"efg"},1234],"id":1,"name":"foo"}
time
- Durationはint64
net/http *
Client
Jar
はnet/http/cookiejar
のJar
Header
- Headerは
map[string][]string
である
その振る舞いはMIMEHeaderにキャストして実行される
Cookie
- requestにcookieを付与するにはAddCookie()を使用する
req.AddCookie(&http.Cookie{Name: "a", Value: "b"})
req.AddCookie(&http.Cookie{Name: "c", Value: "d"})
// Cookie: a=b; c=d
reflect
-
StructField.PkgPath, Method.PkgPathが
""
の場合はpublic
である -
ポインタとその値は別のものとして扱われる。ポインタから値に紐づいたメソッドを得ることはできない。
その逆もできない。 -
Set系の操作をする際はValueOf()にポインタを渡しているか確認する
-
値fooはインターフェイスBarか
rv := reflect.ValueOf(foo)
t := reflect.TypeOf(*(Bar)(nil)).Elem()
if rv.Type().implements(t) {
...
}
Channel
channelがcloseされたらとまる
for v := ch {
...
}
stringを格納するChannelを返す関数
func foo(bar string) <-chan string {
}
v, isClose = ch
Library
-
sync.Onceは一度だけ実行するときに使用する
-
sync.Cond.WaitはL.Unlock()してL.Lock()する
Syntax
-
…Tはslice
-
v…はsliceを要素に分解する
-
init()はimportされたときに実行される
-
メンバーは継承元と継承先で共有される
package main
import "fmt"
type Foo struct {
v string
}
func (f *Foo) foo() {
fmt.Println(f.v)
}
type Bar struct {
Foo
}
func (b *Bar) bar() {
fmt.Println(b.v)
}
func main() {
b := &Bar{}
b.v = "1234"
b.foo()
// 1234
b.bar()
// 1234
}
switch
switch t {
case Foo:
return ...
default:
return ...
}
switch v {
case v < 1:
return ...
default:
return ...
}
fmt
-
printのフォーマット *
-
func Fprint(w io.Writer, a …interface{}) (n int, err error) *
-
func Scan(a …interface{}) (n int, err error) *
standard input精査する -
func Sprintf(format string, a …interface{}) string *
-
func Sscan(str string, a …interface{}) (n int, err error) *
指定した文字列を精査する
Interfaces
-
io.Writer
bytes.BufferはReaderでもWriterでもある
Cast
type FooFunc func(int, int)
func (f FooFunc) ServeHTTP(w, req int) {
f(w, req)
}
func Foo(w, req int) {
fmt.Fprintln(w, req)
}
handler := FooFunc(Foo)
Map
// okはキーが存在しているか
_, ok := dict[key]