- 1. 【Golang】if文
- 2. GolangアプリをKubernetesにDeployしてIngressで公開までしてみる【minikube&docker hubを利用】
- 3. Goで対話式SSHクライアントパッケージを作成した
- 4. Go言語での集合(Set)の扱い方とテスト
- 5. A Tour of Goのリンク集
- 6. 【Golang】可変長引数
- 7. golangのrestのググりまとめ
- 8. 【Golang】クロージャー
- 9. 【Golang】関数
- 10. Goでリトライ可能エラーと致命的エラーを投げ分けて区別する試み
- 11. Goサーバーあれこれ mux
- 12. [Go言語]ターミナルの入力をリアルタイムに取得する方法
- 13. Go言語への道 〜その1〜
- 14. Golang の modules 管理 [Docker, go mod]
- 15. docker-composeで作ったgoサーバーを雑にawsのec2にデプロイする
- 16. GoでDeque(両端キュー)
- 17. 【Golang】Byte型
- 18. Golang1.14でt.Logの出力がちょっと変わったらしいので今更試してみた
- 19. 【Go】脱Go初心者のためにGoでオンライン交流会に役立つツールを制作してみた
- 20. aws-sdk-goでS3のオブジェクトを取得しようとして「SignatureDoesNotMatch」と言われたら
【Golang】if文
#【Golang】if文
Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。 基礎〜応用まで。“`
package main
//ifimport “fmt”
func main(){
a := 1
//if else if else
if a == 2{
fmt.Println(“2だ”)
}else if a == 1{
fmt.Println(“1だ”)
}else{
fmt.Println(“それ以外”)
}//内包表記
//1行で書く
//if 条件の; 結果がTrueなら{
//これを表示
//}
if b := 100; b == 100{
fmt.Println(“100だ”)
}
}
“`
GolangアプリをKubernetesにDeployしてIngressで公開までしてみる【minikube&docker hubを利用】
以前に、[DockerでサクッとGolangの環境作ってみた](https://qiita.com/takuya911/items/b13b03429204eb95289c)という記事を書いたGoのアプリをkubernetesで動かして、webブラウザで確認するところまでやってみる。
##必要なもの
minikube v1.9.0
docker 19.03.8
dockerhubのアカウント##成果物
https://github.com/atsugitakuya/golang_kubernetes## Docker Hubにリポジトリを作成する
[docker hub](https://hub.docker.com/)のアカウントを作成し、リポジトリを作成する。
今回は以下のものがリポジトリの情報です。(publicなので、誰でも利用可です)
・アカウント名:takuya911
・リポジトリ名:go-kubernetes-sample#はじめに
のっぴきならない事情でWindowsからLinuxホストに対話式にSSH接続する必要があり、Goで対話式SSHするためのクライアントパッケージを作成しました。
go-interactive-ssh
https://github.com/jlandowner/go-interactive-ssh#Google と Netflix の go-expect
「Go Expect」などで検索するとGoogleとNetflixのリポジトリが見つかります。
google/goexpect
https://github.com/google/goexpectNetflix/go-expect
https://github.com/Netflix/go-expectが、共にWindowsには対応していないとのことでした。
今回作成したものは必要最低限の機能しかないので、これらには及ばないと思いますが、シンプルなものになっていると思っています。#インストール
“`bash
go get -u “github.com/jlandowner/go-interactive
Go言語での集合(Set)の扱い方とテスト
# はじめに
Go言語には標準で集合(Set)は用意されていません。
# 実現方法
## 1. Slice
“`go
strSet1 := []string{“element1”, “element2”, “element3”}
“`シンプルな方法。
重複は許されるし、ただのスライス。
簡易的な場合はこれで十分。## 2. map[interface{}]struct{}
“`go
strSet2 := map[string]struct{}{
“element1”: struct{}{},
“element2”: struct{}{},
“element3”: struct{}{},
}
“``map`を利用する方法。
struct{}はメモリを圧迫することはない。## 3. github.com/deckarep/golang-set/mapset
“`go
strSet3 := mapset.NewSet()
requiredClasses.Add(“element1”)
requiredClasses.Add(“element2”)
A Tour of Goのリンク集
# 1. はじめに
## 1.1 背景と目的
### 1.1.1 背景– [A Tour of Go](https://go-tour-jp.appspot.com/list)で調べ事をしたいとき、自分の知りたいことがどこに書かれているかをすぐに見つけられない。
### 1.1.2 目的
– Go言語の勉強、理解を効率化させるために本記事を作成した。## 1.2 本記事でやっていること
– A Tour of Goのコンテンツをピックアップし、リンクを貼っている。## 1.3 読者の対象
– あくまでも自分自身
– 他に、A Tour of Goを用いたGo言語の学習をしている方にも役立つかもしれません。## 1.4 前提
– 自分自身が気になったページ、よく参照するページのみ、リンクを貼っています。A Tour of Goで紹介しているすべてのページに対応しているわけではありません。
– そのため、随時修正、変更が入ります。## 1.5 参照リンク
– [A Tour of Go](https://go-tour-jp.appspot.com/list)#
【Golang】可変長引数
#【Golang】可変長引数
Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。 基礎〜応用まで。“`
package main
//可変長引数
//複数の引数を渡す際、決まった個数でない場合。import “fmt”
//可変長引数 …int
func foo(params …int) {
//引数の長さ表示
fmt.Println(len(params), params)
//引数の長さ分繰り返す
//_にはインデックスが入る。
for _, param := range params {
fmt.Println(param)
}
}func main() {
foo()
//>>0 []
foo(10, 20)
//>>2 [10 20]
//>>10
//>>20
foo(10, 20, 30)
//>>3 [10 20 30]
//>>10
//>>20
//>>30//スライス作成
s := []int{1, 2, 3
golangのrestのググりまとめ
## golangでrestを試してみたくて、まずは記事を調べてみた。
[golangでシンプルなRESTful APIを作ってみよう!](https://qiita.com/sbenemerito/items/d94b811f14ce0a546a3f)
mux packageを使って、Readを試してみている。[RESTAPI WITH Go言語!](https://qiita.com/__init__/items/145462cdbb0f569a29cf)
mux packageを使って、CRUDを作り、ElephantSQL(postgresのPaaS)でdb接続もやっている。[【Go×WAF】うほうほ!!gorillaを分かりやすくまとめてみた【mux/context/schema】](https://qiita.com/gold-kou/items/99507d33b8f8ddd96e3a)
mux packageのrouterを丁寧に網羅してかいて、testも書き、gorilla packageでのformへのDecode&Encodeを解説してくれている。
【Golang】クロージャー
#【Golang】クロージャー
Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。 基礎〜応用まで。
“`
package main
//クロージャー
//変数に格納して、実行できる。import “fmt”
//クロージャーによるジェネレーター
//関数を返す関数、関数を引数に取る関数(渡された関数をそのまま実行する)
//返り値でfunc() intを返す
func incrementGenerator() func() int {
//変数宣言時のみ
x := 0
//ここまでがクロージャーで定義//funcを返す 2回目以降はここから
return func() int {
x++
return x
}
}//クロージャーの使い方
func circleArea(pi float64) func(radius float64) float64 {
return func(radius float64) float64 {
return pi * radius * radius
【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)