目次
覚書は、ある処理をどうやった書いたか、を残しておくメモです。
基本形
1 2 3 4 5 6 7 8 9 10 11 |
package main // 冒頭はパッケージの宣言 // 使う他のパッケージをimport。使わないパッケージがimport されているとエラー // _ "fmt" のように表示しながらにして使わないように指定 import( "fmt" ) // メイン関数を宣言( エントリポイント と呼ぶ ) func main(){ } |
メソッドシグネチャ の 基本形
1 2 3 4 |
// 引数の形の指定、戻り値の指定 func aaa(str string) (string) { return str } |
実行ファイルの引数の取得と即時終了
1 2 3 4 |
if len(os.Args) < 3 { fmt.Println("not enough arguments.") os.Exit(2) } |
ファイルを開く
1 2 |
fp01, err01 := os.Open("file.txt") if err01 != nil { panic(err01) } |
Go では 多くの関数が、複数の戻り値を使います。
これによって、失敗するかもしれない関数はエラーと共に返され、それを判定する流れになります。
panic は プログラムを異常終了させる関数です。
ソート可能配列の宣言
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
type Rows [][]string func(r Rows) Len() int{ return len(r) } func(r Rows) Swap(i,j int){ r[i],r[j] = r[j], r[i] } func(r Rows) Less(i,j int) bool{ a,_ := time.Parse("2006/1/2 15:04:05",r[i][3]) b,_ := time.Parse("2006/1/2 15:04:05",r[j][3]) //fmt.Printf("%s < %s: %s \n", a,b,(a.Unix()<b.Unix())) return a.Unix() < b.Unix() } |
二次元配列を作成するには、まずそのtypeを宣言します。
そしてソート機能を持つタイプ(構造体) にするには、 Len と Swap と Less の メソッドが紐づく必要があります。
sort.interfaceの実装です。
構造体に関数を紐づけるシグネチャを使います。
また時間のパースには、決まったtimeパッケージを使い、”2006/1/2 15:04:05″ を解析する文字列に合わせて変更し、解析にかけます。
配列の使い方
1 2 3 4 5 6 7 8 9 10 11 |
res_rows := make(Rows,0,10000) for _, r := range rows01 { if r != "" { res_rows = append( res_rows, strings.Split(r,",") ) } } for _, r := range rows02 { if r != "" { res_rows = append( res_rows, strings.Split(r,",") ) } } |
配列の宣言は main 外で行いますが、利用するのは main 内です。
make で作成し、 append で追加していきます。
1 2 3 4 5 |
for _, r := range rows01 { if r != "" { res_rows = append( res_rows, strings.Split(r,",") ) } } |
繰り返しは、 for range の構文で行います。
_ は インデックスが渡されますが、不要なので _ で受け取っています。
受け取る場合は、使わないとエラーになります。
1 |
sort.Stable(res_rows) |
実際のソートは sort 関数か stable 関数を用います。対象のtypeが指定のメソッドを実装していれば、ソートされます。
ファイルの書き込み
1 |
ioutil.WriteFile("output.txt", []byte(strings.Join(result,"\n")), os.ModePerm) |
HTMLをstringで取得
1 2 3 4 5 |
resp, _ := http.Get(url_rev_from) defer resp.Body.Close() byteArray, _ := ioutil.ReadAll(resp.Body) result := string(byteArray) // htmlをstringで取得 |
UTF-8 と Shift-JIS の 文字エンコードの相互変換
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
func transformEncoding( rawReader io.Reader, trans transform.Transformer) (string, error) { ret, err := ioutil.ReadAll(transform.NewReader(rawReader, trans)) if err == nil { return string(ret), nil } else { return "", err } } func jis2utf(str string) (string, error) { return transformEncoding(strings.NewReader(str), japanese.ShiftJIS.NewDecoder()) } func utf2jis(str string) (string, error) { return transformEncoding(strings.NewReader(str), japanese.ShiftJIS.NewEncoder()) } |
文字検索、文字分割、文字統合
1 2 3 4 5 6 |
if strings.Contains( data, "a") { // 含んでいるか } strings.Split(content, "\n") // 分割 strings.Join(rows,",") // 統合 |
HTTP で POST する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
func HttpPost(url, jsonStr string) (string, error) { req, err := http.NewRequest( "POST", url, bytes.NewBuffer([]byte(jsonStr)), ) if err != nil { return "Error for net/http new Request", err } // Content-Type 設定 req.Header.Set("Content-Type", "application/json") client := &http.Client{} resp, err := client.Do(req) if err != nil { return "Error for net/http client.do",err } defer resp.Body.Close() return resp.Status, err } |
必要なパッケージ(適宜利用)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import( "fmt" "os" "io" "io/ioutil" "strings" "golang.org/x/text/transform" "golang.org/x/text/encoding/japanese" "github.com/k0kubun/pp" "bytes" "encoding/json" "net/http" "net/url" "time" "sort" ) |