技術向上

プログラミングの学び、気になるテクノロジーやビジネストレンドを発信

Go

時間の切り捨て【Go】

Go

Time.Truncate(d duration)を使って、表示時間の切り捨てを行います。 fmt.Println(time.Now().Truncate(time.Minute)) // 2018-12-14 11:34:00 +0900 JST durationに指定した期間より後の内容は切り捨てられます。

JSONからstructに変換するツール【Go】

Go

便利なサイトです。 JSONのエンコーディングも付記されます。 JSON-to-Go: Convert JSON to Go instantly

os.Exit【Go】

Go

プログラムを強制終了させます。 os.Exitが実行されると、defer指定された関数も実行されません。 引数にはstatus codeを指定しますが、0を指定すると正常終了を意味し、1を指定すると異常終了を意味します。 func() { defer someFunc() // 実行されない os.…

httpのhandlerに引数を指定する方法【Go】

Go

htmlのtemplate【Go】 - 技術向上などで紹介した方法ですと、 各handlerで共通した、titleを取得する処理が行われています。 引数にtitleを渡すことで効率化できそうです。 ... func viewHandler(w http.ResponseWriter, r *http.Request) { title := r.URL.…

templateキャッシュ【Go】

Go

htmlのtemplate【Go】 - 技術向上で紹介した下記関数ですと、 同じtemplateであっても、処理毎に毎回templateの読み込みが行われてしまいます。 func renderTemplate(w http.ResponseWriter, templ string, p *Page) { t, _ := template.ParseFiles(templ + …

http.Redirect【Go】

Go

概要 文字通りhttpのredirectを行う機能です。 下記の通り、構文はシンプルです。 http.Redirect(w http.ResponseWriter, r *http.Request, url string, code int) 最後のコードはstatus codeです。「http.StatusFound」のように記述します。 今回の例は、vi…

htmlのtemplate【Go】

Go

概要 http.ResponseWriterにセットする内容量が多い場合(複数行に渡るhtml記述)、 template機能を使うべきです。 事前にhtmlファイル(今回はview.html)を同階層に作成し、 後で示すコードを記述したmain.goを実行します。 htmlファイルの記述 まずはtemp…

http.ListenAndServe【Go】

Go

簡易Web Application作成の流れ データベースではなくtxtファイルを使う、ごくごく簡易的なWeb Applicationを作成していきます。 流れと概要は下記の通りです。 .txtファイルを作成 アクセスするURLは上記ファイルのタイトルを含む http.RequestのPathからフ…

sqlite3【Go】

Go

go-sqlite3を使用します。 事前準備は sqlite3を使用する前の準備【Go】 - 技術向上 に記載しています。 CREATE var DbConnection *sql.DB func main() { DbConnection, err := sql.Open("sqlite3", "./example.sql") // 第1引数はDriver、第2引数はデータベ…

sqlite3を使用する前の準備【Go】

Go

go-sqlite3を使用します。 このpackageはC言語のライブラリをimportするため、 ビルドするには、事前に下記3点が必要になります。 sqliteのインストール Xcodeのインストール gcc(Xcodeのコマンドラインツール)のインストール 最初にsqliteをhomebrewにイ…

WebSocketとJSON-RPCでリアルタイムAPIデータ取得【Go】

Go

外部package、websocket - GoDoc を使います。 下記は、bitflyerのAPIを使用して、BTCとJPYの取引をリアルタイムに取得する例です。 type JsonRPC2 struct { // JSON-RPCのプロトコルをtype定義 Version string `json:"version"` Method string `json:"metho…

talib【Go】

Go

talib(GitHub - markcheno/go-talib: A pure Go port of TA-Lib (http://ta-lib.org))は、 金融商品の分析に使えるpackageです。 talibの使用に合わせて、quoteもインストールします。 GitHub - markcheno/go-quote: Yahoo finance/Google finance/Coinbas…

ini【Go】

Go

GitHub - go-ini/ini: Package ini provides INI file read and write functionality in Go.を使って、iniファイルの読み込みを行います。 下記iniファイルが同階層にある場合の例です。 config.ini [web] port = 8080 [db] name = stock.sql driver = sqlit…

semaphore(同時実行数制限)【Go】

Go

goroutineの同時実行数を制限することができるpackageです。 golang.orgから提供されていますが、goのmainツリーとは別のプロジェクトになります。 そのため、使用するには、下記コマンドを実行してインストールする必要があります。 $ go get golang.org/x/…

hmac【Go】

Go

hmacとはハッシュメッセージ認証コードの略で、API認証に利用される、認証方式のことです。 クライアントからサーバーへ秘密情報を送信せずに認証できるメリットがあります。 クライアントから送られるハッシュ化された情報を、 クライアントから送られてき…

json【Go】

Go

JSON形式から変数に、変数からJSON形式に変換する方法を見ていきます。 JSONから変数 まずは、JSON形式から変数への変換です。 type Person struct { // 各フィールド名の頭文字は、必ず大文字にする Name string Age int Nicknames []string } func main() …

http【Go】

Go

httpに関する処理を紹介します。 まずは簡単に取得をする例です。 resp, err := http.Get("http://example.com") if err != nil { log.Fatalln(err) } defer resp.Body.Close() // 必ずClose()する。怠ると、デフォルトで有効のkeep-alive要求によってTCPコ…

ioutil【Go】

Go

主にネットワーク関係のファイルの読み書きや、受信内容の読み込みに使用されます。 os系でも同じような結果を取得することはできますが、 利用用途によって、使い分けがされています。 ファイルの読み書きの例です。 content, err := ioutil.ReadFile("main…

context【Go】

Go

処理のキャンセル 時間がかかる処理を持つgoroutine関数に対して 時間制限を持たせる場合などに引数として渡します。 func longProcess( ctx context.Context, c chan string) { // 明示的にすべきとの観点から、contextは第1引数に渡すべきである、とgodoc…

iota(const内の連番)【Go】

Go

const内で連番を振る時に使用します。 const ( c1 = iota c2 = iota c3 = iota ) func main() { fmt.Println(c1, c2, c3) // 0 1 2 3 } constの性質を利用できるため、iotaは一度の記述でも問題ありません。 const ( c1 = iota c2 c3 ) func main() { fmt.Pr…

sort【Go】

Go

スライスの並び替えをすることができます。 intやstringなど対象の型によって、記述方法が異なります。 s := []string{"ai", "hy", "bg", "rc"} i := []int{1, 44, 100, 56, 89, 2} type st struct { // 後でstructのスライスに要素を追加しない場合は、[]st…

regex(正規表現)【Go】

Go

regex(正規表現)を扱うpackage、regexpを見ていきます。 match, _ := regexp.MatchString("([a-zA-Z0-9]+)le", "apple") // 第2引数に第1引数の正規表現文字列が含まれるかを、bool値で返す fmt.Println(match) 上記方法と同じ結果を返すのがこちらです。 …

time【Go】

Go

標準package、timeの使い方になります。 t := time.Now() // 現在時刻を取得 fmt.Println(t.Hour(), t.Day(), t.Month(), t.Year()) // 欲しい情報のみを取得 fmt.Println(t.Format(time.RFC3339)) // RFC3339型にフォーマット t.Format(time.RFC3339)は、特…

godocでローカルドキュメント【Go】

Go

godocの起動 ローカル環境のドキュメントを閲覧するページを立ち上げることができます。 godocが未インストールの場合は、下記を実行します。 $ go get golang.org/x/tools/cmd/godoc godocがインストールされている状態で、下記を実行します。 $ godoc -htt…

サードパーティによるpackage【Go】

Go

インストール GoDocから、もしくは直接githubで対象のpackageを確認します。 Installに記載されているコマンドを実行します。 今回のpackageはgo-talibです。 $ go get github.com/markcheno/go-talib インストールされたファイルは、 $GOPATH直下の srcフォ…

ユニット(単体)テスト【Go】

Go

テストファイルの作成 テストしたい対象のファイルと同階層に、テストファイルを作成することが推奨されています。 名称は、「<テスト対象のファイル名>_test.go」とします。 作成したファイルに、次のような内容を記述します。 package <package名> import "testing" f</package名>…

Public、Private【Go】

Go

packageを横断した時の変数について、 頭文字が大文字のものはPublicとなり、外部packageから参照が可能に、 頭文字が小文字のものはPrivateとなり、外部packageから参照が不可能になります。 structの場合、Publicにするには、中身の要素も頭文字を大文字に…

sync.Mutex【Go】

Go

channel以外の方法で異なるgoroutineがアクセスしても、 競合によるエラーが起きないようにするための機能です。 channelではなく、1つのmapに対して異なる2つのgoroutineがアクセスする 次のコードは、エラーが発生することがあります。 func main() { c :=…

channelのselectパターン、for break【Go】

Go

selectパターン 複数channelを同時並行に処理したい場合に利用します。 selectを用いることで、複数channelの状態を、ブロックすることなしに同時に監視できます。 値がchannelに入ったものから順に処理されます。 defaultが記載されていない場合で、かつど…

fan-out、fan-inパターン【Go】

Go

タスクを複数のgoroutineに分割して、順序通りに処理させたい場合に利用します。 fan-inは、複数の入力を1つのchannelにまとめて受信するパターンです。 fan-outは、複数の関数(goroutine)が、1つのchannelから値を読み取り送信するパターンです。 fan-out…