- 1. 【Golang】関数
- 2. Goでリトライ可能エラーと致命的エラーを投げ分けて区別する試み
- 3. Goサーバーあれこれ mux
- 4. [Go言語]ターミナルの入力をリアルタイムに取得する方法
- 5. Go言語への道 〜その1〜
- 6. Golang の modules 管理 [Docker, go mod]
- 7. docker-composeで作ったgoサーバーを雑にawsのec2にデプロイする
- 8. GoでDeque(両端キュー)
- 9. 【Golang】Byte型
- 10. Golang1.14でt.Logの出力がちょっと変わったらしいので今更試してみた
- 11. 【Go】脱Go初心者のためにGoでオンライン交流会に役立つツールを制作してみた
- 12. aws-sdk-goでS3のオブジェクトを取得しようとして「SignatureDoesNotMatch」と言われたら
- 13. fizzfazzを噛み砕く
- 14. 【Go言語】2つの日付間の日付リスト/月リスト/時刻リストを作成する
- 15. golang でpostgresにinsert
- 16. 【Golang】マップ(辞書)
- 17. [習作] シングルバイナリでWebサイト作りたかったのでGolangで画像抽出Webアプリ作ってみる
- 18. 【Golang】スライス
- 19. Go + Google Cloud SDK の環境を Docker で準備する
- 20. Golang ゴールーチンで並列数を指定して実行
【Golang】関数
#【Golang】関数
Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。 基礎〜応用まで。
“`
package main
//関数import “fmt”
/*
//定義
func 関数名(引数 引数の型)戻り値型{}
*///funcで関数宣言(引数の型)(返り値の型)
//同じ型の場合(x, y int)と省略できる。通常は(x int,y int)
//return で返す場合は返り値の型が必要。
func add(x, y int) (int, int) {
return x + y, x – y
}//ネームドリターンバリュー
//引数、返り値を見ただけで、何をするのかが分かるので推奨。
//reslut int で変数名と返り値の型指定
//最初に返り値を指定しているので、returnは省略できる
func cal(price, item int) (result int) {
//返り値で指定しているので、:=にしなくてもいい
result = price * item
return
}
Goでリトライ可能エラーと致命的エラーを投げ分けて区別する試み
## やりたいこと
Java系の言語だとtry-catchブロックで例外の種類ごとに例外処理を記述できます。例外が100種類あるんだけど、うち50種類はリトライ可能で、リトライ処理を一括で書きたい場合に以下のように書けるわけです。
“`java
try {
throw new FooException(); // FooExceptionはRetryableExceptionを継承している
} catch (RetryableException e) {
// リトライ処理
} catch (Exception e) {
// 致命的エラーなので諦めて死ぬ
}
“`Go初心者の私はGoで同じことをやりたくなったんですが、ピンとくる方法がみつからなかったので試しに実装してみました。
## エラーのwrapと`errors.Is()`を使う方法(Go 1.13以降が必須)
私の実装を紹介します。
“`go
package mainimport (
“errors”
“fmt”
)var RetryableError = errors.New(“R
Goサーバーあれこれ mux
# サーバー立ち上げ
`Methods`でアクセスできるメソッドを指定できる。
`mux.Vars(r)`でurlパラメータを取得できる。“`go
func main() {router := mux.NewRouter()
router.HandleFunc(“/book/{id}”, handler).Methods(http.MethodGet)
http.ListenAndServe(“:8080”, router)
}func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, “Hello, %q \n”, html.EscapeString(r.URL.Path))//urlパラメータの取り出し
vars := mux.Vars(r)
id := vars[“id”]
fmt.Fprintf(w, id)
}“`
# ミドルウェアの使用
基本的には下の書き方
これで`/post`にアクセスしようとすると、まずさきにミドルウェアに飛ばされて、その後、`
[Go言語]ターミナルの入力をリアルタイムに取得する方法
## はじめに
本記事では、Go言語を使用してターミナルの入力をリアルタイムで取得する方法をご紹介します。
今回ご紹介するのは、UNIX系OSに限った話です。
Windowsの場合は、Microsoftが用意してるAPIで実現できるらしいが……(調査不足)## 目次
– [はじめに](#はじめに)
– [目次](#目次)
– [結論](#結論)
– [動作環境](#動作環境)
– [カノニカルモードとは](#カノニカルモードとは)
– [非カノニカルモードとは](#非カノニカルモードとは)
– [サンプルコード](#サンプルコード)
– [Rawモードとは](#rawモードとは)
– [サンプルコード](#サンプルコード-1)
– [参考サイト](#参考サイト)
– [おわりに](#おわりに)## 結論
ターミナルを非カノニカルモードにすること、即時に入力を取得可能です。
非カノニカルモード
Go言語への道 〜その1〜
# 目的
とある開発案件で、はじめてGo言語を使ったWebアプリケーションを開発することになりました!
なので、自分用の学習メモとして記録を残しておこうと思いこの記事を書いています。
また、同じシチュエーションでこれからGo言語を始める方の参考になれば幸いです。# 開発環境
* macOS Catalina 10.15.4(19E287)
* go 1.14.2# Go言語とは
2009年にGoogleが開発したオープンソースのプログラミング言語であり、Google社内におけるソフトウェア開発の生産性や拡張性のために開発されました。開発者は、UNIX開発に携わったロブ・パイク氏と、UNIX開発とC言語を開発したケン・トンプソン氏が設計しました。
対応OSは、Linux、MacOS X、Windows、Android、iOSとなっており主要なものはサポートされています。
ちなみに、正式名称は「Go」なのですが、それだけだと別の意味に捉えられることもあるので、「Golang」や「Go言語」と呼ばれることが多いようです。本記事では、「Go言語」と呼びます。## Go言語の特
Golang の modules 管理 [Docker, go mod]
# はじめに
バックエンドは Ruby, TypeScript 等を触ってきて、「Go やるか!」と思って手を出してみたものの、みごとにハマりました。(悪い意味で)[他言語から来た人がGoを使い始めてすぐハマったこととその答え](https://qiita.com/mumoshu/items/0d2f2a13c6e9fc8da2a4)
こちらの記事を読ませていただいて、そこでやっと色々と解決できました…ここには、上記の記事を読むだけでは解決できなかった課題に立ち向かった記録を残しておきます。
# 使用環境
– macOS Catalina 10.15.4
# Docker で環境構築
Docker コンテナ内で動かしたいので、golang の公式イメージを使って環境を作ります。
テキストエディタの補完だったりに必要そうであればローカルにもインストールしておきます。Go には「`GOPATH` 以下に作業環境を作る」という特徴があるようで、ここが第一つまづきポイントでした。
Docker で作業する場合でも、これに従った構成にします。## docker-compo
docker-composeで作ったgoサーバーを雑にawsのec2にデプロイする
# はじめに
以前docker-composeで作成したgoサーバを簡易的にデプロイする必要があるタイミングがあったのですが、いい感じにハマりまくって地獄を見たのでとりあえずでawsにデプロイする方法を簡単にまとめておきたいと思います# ローカルでdocker-composeで動くgoサーバを作る
まずはソースツリーから、、、“`
test-docker
│
├── docker
│ ├── app
│ │ └── Dockerfile
│ └── db
│ └── conf.d
│ └── mysql.conf
├── docker-compose.yml
├── go.mod
├── go.sum
├── main.go
├── models
│ └── init.go
└── start.sh
“`
## Docker周り“`dockerfile:docker/app/Dockerfile
FROM golang:latest
RUN mkdir test-docker
WORKDIR /test-docke
GoでDeque(両端キュー)
– Golangの標準ライブラリにDeque両端キューが見つからなかったので自作した
– sliceの先頭に追加する処理は(実装によるだろうが)遅かったので採用していない“`golang
package mainimport (
“fmt”
)func newDeque() *deque {
return &deque{}
}type deque struct {
prep []interface{}
ap []interface{}
}func (d *deque) push(item interface{}) {
d.ap = append(d.ap, item)
}func (d *deque) unshift(item interface{}) {
d.prep = append(d.prep, item)
}func (d *deque) empty() bool {
return len(d.ap) == 0 && len(d.prep) == 0
}func (d *deque) pop() interface{} {
【Golang】Byte型
#【Golang】Byte型
Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。 基礎〜応用まで。“`
package main
//バイト型
//ネットワーク系、ファイルの読み書き系で使われるimport “fmt”
func main() {
//バイト型 アスキーコード
//初期化
b := []byte{72, 73}
fmt.Println(b)
//>>72,73//string() 文字列に変換
fmt.Println(string(b))
//>>HI//バイトのスライスに変換
c := []byte(“HI”)
fmt.Println(c)
//>>72,73//文字列に変換
fmt.Println(string(c))
//>>HI
}
“`
Golang1.14でt.Logの出力がちょっと変わったらしいので今更試してみた
# □ 背景っぽいもの
最近golangの最新情報追えてないなーと思いながら、[golang1.14のリリースノート](https://golang.org/doc/go1.14
)を眺めていたらにこんな事が書いてありました。> Testing
> go test -v now streams t.Log output as it happens, rather than at the end of all tests.引用 https://golang.org/doc/go1.14
英語が苦手なニワトリが和訳に自信がなかったので、Google先生に頼んで翻訳してもらうと
*「go test -vt.Logすべてのテストの最後ではなく、発生時に出力をストリーミングするようになりました。」*
とのこと。正直これを見て
「ほーん、なるほど(え?大して変わってなくない?)」
程度にしか感じていなかったのですが、何事も知ったかぶりは良くない。
慢心、ダメ絶対。というわけで、「そうだ試してみよう」と思い立ったので試した結果をまとめていきます。
# □ 試してあそぼう
と
【Go】脱Go初心者のためにGoでオンライン交流会に役立つツールを制作してみた
# はじめに
Go案件に携わりたいなと思い、お勉強のがてらこんなツールを作りました。
制作過程をまとめようと思っていたんですけど、つまづいたポイントをまとめただけになりました。。
合間を見てどんどん機能を追加していこうと思います!・デモGIF
![gif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113263/927f2061-54bd-c89d-d27c-b2b0567e5930.gif)・URL
https://group-shuffle-app.herokuapp.com/・Github
https://github.com/yagi-eng/group_shuffle_gui# ツールの説明
以下の問題解決を目的としたツールです。– 交流会などで、複数回参加者をシャッフルしてグループ分けする
– なるべく重複しないようにする## おおまかな流れ
1. 参加者の組み分けをランダムに生成し、以下の評価方法に基づき評価
2. 1.を複数回繰り返し、一番評価が良い組み分けを最
aws-sdk-goでS3のオブジェクトを取得しようとして「SignatureDoesNotMatch」と言われたら
# signed urlを使っているわけでもないのにSignatureDoesNotMatchと言われる
ACLを設定していない、signed urlも使っていないバケットに対して接続してオブジェクトの取得をするコードを実装したら、 `SignatureDoesNotMatch: The request signature we calculated does not match the signature you provided. Check your key and signing method.` と言われてしまいました。
同じようなエラーにハマった人の手助けになれば幸いです。## TL;DR
* バケット名に `/` を含めないようにする。
## コード
“`golang:コードは適当ですが雰囲気はこんな感じです.go
func hogehoge() error {
config := aws.Config{
Region: aws.String(os.Getenv(“REGION”)),
}
sess := session.New(&config)
fizzfazzを噛み砕く
あんま噛み砕けてないわ・・・w
##近況報告
一歩踏み出すことを助けてくれることば
・思い立った日が吉日,その日以降は凶日(トリコ)
・運命が僕を追いかけるくらいに清潔な衝動に正直でいたい(ポルノグラフィティ)
・本気でそれをなしたいと思えば世界があなたに味方をしてくれる(アルケミスト)
・選択しなかった道は最悪の結末が待っている(ラブホスタッフ上野さん)やってから考える。死ぬこと以外かすり傷。
# 今日のお題
while文を用いた演算処理## 背景
某社のオンラインテストでボコボコにされたので勉強した## ruby
### 1から100までの総和“`
i = 1
def calc(i)
sum = 0
while i <=100 do sum += i i += 1 end puts sum end calc(i) ``` ### fizzfazz(3の倍数と5の倍数で) ``` def fizzFazz(i) while i <16 do if i%3 == 0 && i%5 == 0 puts "fi
【Go言語】2つの日付間の日付リスト/月リスト/時刻リストを作成する
最近は(個人的な趣味により)分析タスクの前処理など、できるだけGoで書くようにしています。
PythonやRではかんたんに書ける処理ですしGoのベーシックな処理なので今更感もありますが、検索してすぐに見つからなかったので自分用のメモを兼ねて。もっと良い方法があればコメントいただけると幸いです。
# 日付リストを出力
開始日と終了日を指定し、その間にある日付リストを表示します(開始日・終了日を含む、以降同様)。
“`golang
start, _ := time.Parse(“2006/01/02”, “2020/04/18”) // 開始日
end, _ := time.Parse(“2006/01/02”, “2021/05/05”) // 終了日for d := start; !d.After(end); d = d.AddDate(0, 0, 1) {
fmt.Println(d.Format(“2006/01/02”))
}// 2020/04/18
// 2020/04/19
// 2020/04/20
// …
// 2021/05/03
/
golang でpostgresにinsert
### とりあえず一行をInsertしてみた。
“`
package mainimport (
“database/sql”
“fmt”_ “github.com/lib/pq”
)const (
host = “localhost”
port = 5432
user = “postgres”
password = “1234”
dbname = “sample”
)func main() {
psqlInfo := fmt.Sprintf(“host=%s user=%s password=%s dbname=%s sslmode=disable”, host,user,password,dbname)
fmt.Println(psqlInfo)
db, err := sql.O
【Golang】マップ(辞書)
#【Golang】マップ(辞書)
Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。 基礎〜応用まで。“`
package main
//map 連組配列 Pythonでいう辞書
//関数では参照渡しされるので、本体の値も変わる。配列とは違う。import “fmt”
func main() {
//宣言
//mapを作成 pythonの辞書型のような感じ
//map[キーの型]値の型{中身}
m := map[string]int{“a”: 100, “b”: 200}
fmt.Println(m)
//>>map[a:100 b:200]
//値取り出し
fmt.Println(m[“a”])
//>>100//宣言
//make(map[キーの型]値の型, キャパシティの初期値)
//make(map[キーの型]値の型)// キャパシティの初期値は、省略も可能
//初期化。空を作成
m2 := make(map[string]int)
fmt.Println(m2)
//>>
[習作] シングルバイナリでWebサイト作りたかったのでGolangで画像抽出Webアプリ作ってみる
こんにちはみなさん
お仕事でWebサイト作るのであれば普通にPHP使うのですが、私のメイン機であるWindowsでかんたんに動かせるWebサイトとなると、環境が心もとないというか、動く環境と作る環境が違うとどうしてもちゃんと動くか不安になるというもの。
そういうときに、環境とか関係なくバイナリで動くWebサイトが作れれば強いなぁって思うわけです。そんなわけで、Goの練習がてら、Webサイト作ってみます。
# 課題
まずは、どんなアプリを作るかを考えます。
今回はかんたんだけどいろんな技術を触れそうということで、以下のようなツールを作ってみます。– ローカルで動くWebアプリである
– URLを入力する
– そのサイトに有る画像を抽出して画面に表示する
– 気に入った画像を選択してローカルに保存できる
– シングルバイナリで動くえ、何に使うかって?
そりゃ、あれですよ、あれ。なんにせよ、作るものを決めたので、実際に作ってみるとしましょう。
# 成果物
https://github.com/niisan-tokyo/image-crawler
# 開発環境
まずは
【Golang】スライス
#【Golang】スライス
Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。 基礎〜応用まで。“`
package main
//スライス 可変長配列
//関数では参照渡しされるので、本体の値も変わる。配列とは違う。import “fmt”
func main() {
//宣言
//スライス = 可変長配列
//[]にするとサイズ変更できる。
var a []int = []int{100, 200}//宣言
b := [] string{“A”, “B”}
fmt.Println(b)
//>>[A, B]//宣言
//[]を作る nil メモリーに確保しない。bとは違う。
//メモリーは深い領域なので、最初は、あまり気にしなくてもいい
var c []int
fmt.Printf(“len=%d cap=%d value=%v\n”, len(b), cap(b), b)
fmt.Printf(“len=%d cap=%d value=%v\n”, len(c), cap(c), c
Go + Google Cloud SDK の環境を Docker で準備する
# なぜ Docker
詳しい理由は
[Cloud Functionsで消耗したくない人のために、開発環境のベストプラクティスをまとめていったらDockerに行き着いた話](https://qiita.com/pannpers/items/244a7e3c18d8c8422e4f)
こちらの記事が参考になりそうです。軽くまとめると
– ローカル環境を汚さなくて良い
– コマンド一発で同じ環境ができるので楽
– Google Cloud SDK の認証情報をコンテナに閉じ込められる => 複数アカウント、プロジェクトの管理がしやすいあたりの理由になるかなと思います。
ここで Node.js で説明されている部分を Go に置き換えたのがこの記事、くらいに思っていただければささっと読めるかもしれません。
# docker-compose で書く
docker-compose で書くのが好きなので、中身を置いておきます。“`
version: “3.8”
services:
gcloud:
image: tktcorporation/google-clou
Golang ゴールーチンで並列数を指定して実行
“`golang
package mainimport (
“sync”
“time”
“fmt”
)func sub(message string) {
fmt.Printf(“%s start\n”, message)
time.Sleep(5 * time.Second)
fmt.Printf(” -> %s end\n”, message)
time.Sleep(1 * time.Second)
}func getMessages() (messages []string) {
messages = []string{
“a”,
“b”,
“c”,
“d”,
“e”,
“f”,
“g”,
“h”,
}
return
}func main() {
// 並列数
concurrency := 4
// 並列キューを作成
limit := make(chan int, concurrency)
// Wa