Go関連のことを調べてみた2020年05月16日

Go関連のことを調べてみた2020年05月16日

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 main

import (
“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 main

import (
“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 main

import (
“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

元記事を表示

OTHERカテゴリの最新記事