適当に目についた用途を実装してGoに慣れる。
今回は外部APIの取得(& Jsonパース)と実行オプション値の受け渡し。
APIを叩くパッケージ
主な要素はhttp
アクセスとjson
パースです。
http
パッケージですがhttps
でも問題なく使えます。
JSON
は構造体を用意しないといけないので面倒ですが、以下のサイトを使うことでかなり楽になります。
とはいえ、複雑なデータを返されるとごちゃごちゃするのはしかたない。
main
に組み込むと管理しきれないのでパーッケージに分けて書きます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
package api import ( "fmt" "net/http" "encoding/json" ) type ResultBF struct { MidPrice float64 `json:"mid_price"` Bids []struct { Price float64 `json:"price"` Size float64 `json:"size"` } `json:"bids"` Asks []struct { Price float64 `json:"price"` Size float64 `json:"size"` } `json:"asks"` } const url = "https://api.bitflyer.jp/v1/board"; //パブリックメソッドは大文字で始める func GetBtcBF()(float64) { if resp, err := http.Get(url);err != nil { fmt.Println("error:http get\n",err) return 0 }else{ defer resp.Body.Close()//関数終了時の後始末 var result ResultBF if err := json.NewDecoder(resp.Body).Decode(&result); err != nil { fmt.Println("error:json\n",err) return 0 } return result.MidPrice } } |
Result
構造体は必要なものだけ記述しても大丈夫です。
今回の関数だとBids
とAsks
はなくてもいいですね。
先ほど作ったパッケージをメインでインポートして使うことができます。
1 2 3 4 |
import "./pkg/api" func main(){ btc := api.GetBtcBF() } |
Postはいくつかやり方があってPostFormを使うのが簡単そうです。
1 2 3 4 5 6 7 |
values := url.Values{} values.Add("param1","AAA") values.Add("param2t","BBB") resp, err := http.PostForm("https://xxxx", values) if err != nil { fmt.Println(err) } |
リクエストヘッダの設定をするにはClientクラスを使う必要があります。
1 2 3 4 5 6 7 8 9 10 |
req, err := http.NewRequest( "POST", "url", strings.NewReader(values.Encode()), ) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") client := &http.Client{} resp, err := client.Do(req) |
CLIでコマンドオプションを付ける
他プログラムから利用したいときなんかに実行時オプションで値渡しできる。
main内でも問題ないけど初期化に使われるinit関数で呼ぶのがいい気がする。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
package main import ( "flag" "fmt" ) var( arg1 string arg2 *string ) func init() { flag.StringVar(&arg1, "a", "init value1", "var describe1") arg2 = flag.String("b", "init value2", "var describe2") flag.Parse()//パース実行 } func main() { fmt.Println("args\n",arg1,*arg2) } |
実行ファイルのオプションに使えるが、run実行でも使える。
1 |
go run cli.go -a "new value" -b "change value" |
オプション付きで変数の中身を変えています。
また、-h
オプションや存在しないオプション指定時に使い方を返します。