Go関連のことを調べてみた2021年01月20日

Go関連のことを調べてみた2021年01月20日
目次

Goの複数バージョン管理をanyenv+goenvで行う

Go言語で開発している際にローカルで複数バージョン使い分けしたい時がしばしば発生するので、その対策としてgoenvおよびanyenvを使ってバージョンの切り替えを容易にする方法を紹介します。

# goenvとは

https://github.com/syndbg/goenv

pyenvやrbenvをモデルに作られたGoのバージョン管理ツールです。
これを使うことによってバージョンの切り替え、Goの開発プロジェクトごとにバージョンを変更、環境変数でGoのバージョンの切り替えなどを行うことができるようになります。

# anyenvとは

https://github.com/anyenv/anyenv

〜env系のツールを管理するツールです。
上述のgoenvやpyenv,rbenvに加え、nodenvやtfenvなど様々な言語のバージョン管理ツールを制御することができます。
今回の記事ではGoだけを取り扱うのでanyenvはなくても大丈夫なのですが、今後他の言語のバージョン管理する可能性あることを考えて一緒に紹介しておきます。

# インストール

## anyenvのインスト

元記事を表示

Golangでのゼロ埋め

# Golangでのゼロ埋め
0~9の場合は数字の前に0を付け、
10以上の場合は0を付けない場合は以下の様に実現できる

“`
s := 3
str := fmt.Sprintf(“%02d”, s)
fmt.Println(str)
// 03

s2 := 13
str2 := fmt.Sprintf(“%02d”, s2)
fmt.Println(str2)
// 13
“`

知らずに以下の様な回りくどい方法で実現したので知ったときは衝撃だった…

“`
if num < 10 { ​ numStr = "0" + strconv.Itoa(num) ​ } else { ​ numStr = strconv.Itoa(num) ​ } ```

元記事を表示

Goでスライス内の最大値・最小値を抽出する関数

## はじめに
Goでコードを書いているとスライス内の最大値、もしくは最小値を算出する処理を
何度か利用したので忘れないためにもメモ

### スライス内の最大値を取得
“`
func maxInt(a []int) int {
sort.Sort(sort.IntSlice(a))
return a[len(a)-1]
}
“`

### スライス内の最小値を取得

“`
func minInt(a []int) int {
sort.Sort(sort.IntSlice(a))
return a[0]
}
“`

### サンプルコード

以下コードを[The Go Playground](https://play.golang.org/)でコピペして実行

“`
package main
import “fmt”
import “sort”

func main() {
test := []int{7, 8 ,1, 4, 3, 21}

fmt.Println(“max:”, maxInt(test))
fmt.Println(

元記事を表示

Go(Echo) Go Modules × Dockerで開発環境構築

# はじめに

フレームワークに`Echo`
ライブラリ管理に`go mod`
ホットリロードに`fresh`
を使用したGoの開発環境をDockerを使って構築したいと思います。
Goのバージョンは`Go 1.15`です。

この記事ではDockerのインストール方法や細かい解説等はしません。

# 最終的なディレクトリ構成
“`
.
├── app
│ ├── Dockerfile
│ ├── go.mod
│ ├── go.sum
│ └── main.go
└── docker-compose.yml
“`
[GitHub](https://github.com/suganuma3510/go-docker)
# 急いでいる人向け
[ここ](https://github.com/suganuma3510/go-docker)からコードをダウンロードして`docker-compose up`すればできます。

# Dockerfile作成

まず最初に適当なディレクトリを作成(私の場合go-dockerというディレクトリを作成)
上記のディレクトリ構成を参考

元記事を表示

go.modの補足 パッケージ

前回の続きです。

“`[go.mod]
module example.com

go 1.15

require github.com/labstack/echo/v4 v4.1.17
“`

上記のgo.modの一番上の
“`module example.com“`
の部分ですが、ここがimportして自分のパッケージを使う時の名前になります!
以下のような構成のプロジェクトの場合↓

test
 |–samplea–aaaaa.go
 |–sampleb–bbbbb.go
 |–main.go
 |–go.mod
 |–go.sum

“`[main.go]

package main

import(
“example.com/samplea”
“example.com/sampleb”
)
“`
このようにして使います。
ディレクトリの名前とモジュールの名前を同じにしたければ

“`[go.mod]
module

元記事を表示

Go + MySQL + nginxの開発環境をDocker(docker-compose)で作る

# やりたいこと

– Go、MySQL、nginxの開発環境をDocker(docker-compose)で作る
– Goの外部パッケージはGo Modulesで管理
– Goのプロジェクトを実践的なものにする
– DBのテーブル管理はマイグレーションを使う
– testはテスト用のDBを使う

# こんな人におすすめ

– GoとMySQLでAPIサーバーの開発がしたい
– 環境構築はDockerで手っ取り早く済ませたい
– 拡張しやすいGoのプロジェクトが欲しい

# 使用するフレームワーク、バージョン

| | バージョン |
| —- | —- |
| Go | 1.15 |
| MySQL | 5.7 |
| nginx | 1.19 |

Goのフレームワークは[Gin](https://github.com/gin-gonic/gin)、ORMに[GORM](https://gorm.io/docs/)を使用。

# ディレクトリ構成

“`
├── docker-compose.yml
├── Dockerfile
├── ap

元記事を表示

Slack ソケットモードの最も簡単な始め方 (Go 編)

### slack-go/slack がソケットモードに対応 :tada:

広く使われている Go SDK の [github.com/slack-go/slack](https://github.com/slack-go/slack
) がソケットモード対応しました :tada: @mumoshu さんと @kanata2 さんの素晴らしい仕事です :clap:

https://github.com/slack-go/slack

### ソケットモードアプリ起動までの手順

この記事では、[Slack ソケットモードの最も簡単な始め方](https://qiita.com/seratch/items/1a460c08c3e245b56441)で使ったサンプルアプリと同じものを、この Go SDK を使って動かす方法を解説します。

#### プロジェクトをつくる

ここで紹介するサンプルは v0.8.0 以上で動作します。

“`
go mod init socket-mode-app
go get github.com/slack-go/slack@v0.8.0
“`

元記事を表示

GoのHTTP実装を読んだ知見をまとめる~FIFOを5通りで実装する~

# はじめに
引き続き、GoのHTTP実装と絡めて書く。今日はFIFO実装について。
経緯は[こちら](https://qiita.com/behiron/items/78d023be96058224e583#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB)

[Russ CoxによるHTTPクライアントのFIFO実装](https://github.com/golang/go/blob/682a1d2176b02337460aeede0ff9e49429525195/src/net/http/transport.go#L1242-L1306)が工夫されていて非常に興味深かった。
コメントを見ると、[Okasaki’s purely functional queue](https://www.amazon.co.jp/-/en/Chris-Okasaki/dp/0521631246)を元に、少し工夫したものらしい。

今回はそれらに触れた上でGoでFIFOを5通りの方法で実装していきたいと思う。

実装およびテストコードは[GitHub](https://gi

元記事を表示

Goでテストを書くために、まずinterfaceを設計するということ

## Goでテストコードを書くことになった場合に

あなたが、勤務先で上長から「テストコードを書いてください」と指示されたとき、
テストが書ける設計になっているでしょうか。

この記事では、**S3からファイルを取得して読み取る**というユースケースに対して
テストを書くことについて考えていきます。

## テストが書きづらいケース

“`main.go
var awssess = newSession()
var s3Client = newS3Client()

const defaultRegion = “ap-northeast-1”

func newSession() *session.Session {
return session.Must(session.NewSessionWithOptions(session.Options{
SharedConfigState: session.SharedConfigEnable,
}))
}

func newS3Client() *s3.S3 {
return s3.New(awssess, &aws.Conf

元記事を表示

【Go】go-oidcを使ってOpen ID Connectを利用する

## Open ID Connect
– outh2の進化版でトークン発行の処理がある
– アプリケーション自体にユーザーパスワードなどの認証情報を持たせずに、別のプロバイダー(ここではGoogle)に委任する
– プロバイダーはいろいろある
– Google
– AzureAD
– AWS Cognito
– outh0
– `state`という概念があり、クロスサイトスクリプティングなどのなりすましを防止

## 公式パッケージ
https://github.com/coreos/go-oidc

## インストール

“`bash
git cloen https://github.com/coreos/go-oidc
“`

## exampleのREADMEの通りにセットアップする

“`
cd go-oidc/example
“`

“`
yuta:~/go-oidc/example (v3=) $ cat README.md
# Examples

These are example uses of the oidc packag

元記事を表示

【Golang】サポートする GOOS と GOARCH を一覧で確認するコマンド(ビルドの対応プラットフォーム確認)

> `go build` する際に指定可能な `$GOOS` と `$GOARCH` の一覧を**コマンドで確認**したい。

なんか、Go 言語のバージョンだけでなく環境によってもビルドできる(サポートされた)OS やアーキテクチャが異なるようだったので、シェル・スクリプトで事前にチェックしたいのです。

[「golang GOOS 一覧 確認 コマンド」でググって](https://www.google.com/search?q=golang+GOOS+%E4%B8%80%E8%A6%A7+%E7%A2%BA%E8%AA%8D+%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89)もピンポイントな記事が出てこなかったので、自分のググラビリティとして。

## TL; DR

> `go tool dist list`

## TS; DR

“`shell-session
$ go tool dist list
aix/ppc64
android/386
android/amd64
android/arm
…(以下省略)

$ go version
go

元記事を表示

Macでgqlgenのserver.goを起動するとファイアウォール警告が出る

GoのGraphQLサーバライブラリであるgqlgenの開発サーバ(GraphQL Playground)をMac上で起動すると、ファイアウォールの警告が出てしまってめんどくさい。
![20210108160313.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9148/5e192904-6f03-13d6-85c8-5c0daf851b80.png)

通常はMacの環境設定のセキュリティとプライバシーのファイアウォール設定で例外を設定するのですが、うまくいかなかったので別の方法で解決します。

server.goの最後で次のようになっています。

“`go
log.Fatal(http.ListenAndServe(“:”+port, nil))
“`

これだと「0.0.0.0」でlistenするようです。0.0.0.0はすべてのネットワークインタフェースを指し、過剰です。

以下のように「localhost」まはは「127.0.0.1」を明示するように変更します。

“`go
log.Fa

元記事を表示

LINE Bot からDropboxに写真をアップロードする

タイトルの通り、LINE Bot からDropboxに写真をアップロードするシステムを作ってみました。現状は課題だらけですが、主要機能が実装できたので投稿します。

LINE Botに画像を送ると、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/951392/9964bfae-caa5-bcb8-6cda-0e575d2335c7.png)

Dropboxにアップロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/951392/215a2172-9836-91d7-5724-dac47a84a336.png)

ソースコード

“`go:main.go
package main

import (
“io”
“log”
“net/http”
“os”

“github.com/dropbox/dropbox-sdk-go-unofficial/dr

元記事を表示

go moduleを使う

## 環境変数で有効化する
“`
go env -w GO111MODULE=on
go env | grep MOD
“`

## 初期化処理

“`
go mod init test
“`

go.modが作成されている

“`go.mod
module test

go 1.13
“`

## 起動
自動的にgo getされていないパッケージがインポートされる

“`
go run main.go
“`

元記事を表示

Go.modの使い方

GOPATHを使っているとimport出来ないライブラリとか出てきて変なエラーが出てくる事があると思います。
GoModulesのgo.modを使えば解決するかもしれないので記載しておきます。

【環境】

windows10
VScode

ターミナルでgo envと打って設定を確認します

VScodeからターミナル→新しいターミナルで開いてgo envと打ち込みます。
ずらーっと色々設定が並んでくると思いますがその中の
“` GO111MODULE=“`
これがデフォルトだとonになっていないので設定をonにします。

GO111MODULE=をonにする

ターミナルで
“`go env -w GO111MODULE=on“`
と打ち込みましょう。
もう一度go envと打って確認すると
set GO111MODULE=onとなっているはずです。
※筆者はこの時、なぜかonにならず原因が分からなかったので
一度Go言語を再インストールしたところうまくいきました。

go.modを配置する<

元記事を表示

「世界一美しい数式」をプログラムで表現する

# はじめに

$e^{iπ} = -1$
は、「世界一美しい数式」といわれているオイラーの等式です。
確かに美しいというか無駄がないという感じですが、これをプログラムで出力してみたいと思いました。
ただ、それだけです。

とはいえ、一見簡単そうな数式ですが、プログラムで表現するのは少しだけ手間です。

* $e$や$π$といった無理数を扱う必要がある。
* 複素数を扱う必要がある。
* さらに、複素数のべき乗を扱う必要がある。

# 実行環境
オンラインでコンパイル可能な以下のいずれかで実行確認しました。
[Paiza.io](https://paiza.io/ja)
[TIO](https://tio.run)

# D言語の場合

* $e$は`E`、$π$は、`PI`という定数定義が`std.math`で用意されている。
* 複素数は、`complex`テンプレートが用意されている。
* べき乗は`^^`演算子を利用できる。

“`d:
import std;

void main()
{
auto x = complex(cast(real)0.0, PI);

元記事を表示

GoをHerokuにデプロイするときに Push rejected, failed to compile Go app. のエラー

# エラーについて
Goで作ったAPIをHerokuにデプロイしようと思い、
`git push heroku main`
コマンドをしたところ

“`
! Push rejected, failed to compile Go app.
! Push failed
“`
上のようなエラーで失敗。

# 解決した方法
ログを遡ってみると、

“`
—–>
!! The go.mod file for this project does not specify a Go version
!!
!! Defaulting to go1.12.17
!!
!! For more details see: https://devcenter.heroku.com/articles/go-apps-with-modules#build-configuration
!!
—–> New Go Version, clearing old cache
“`

のような記述があった。最初はこれが原因だとは思ってい

元記事を表示

キーエンス プログラミング コンテスト 2021のメモ

# 前置き

Atcoderをやってみたので、自分用のメモです。
あとから加筆・修正する予定です。

# 問題

https://atcoder.jp/contests/keyence2021

# A

“`Q_A.go
package main

import (
“bufio”
“fmt”
“os”
“strconv”
)

var sc = bufio.NewScanner(os.Stdin)

func nextInt() int64 {
sc.Scan()
i, e := strconv.ParseInt(sc.Text(),10,64)
if e != nil {
panic(e)
}
return i
}

func main() {
sc.Split(bufio.ScanWords)

var N int
fmt.Scanf(“%d”, &N)

var a int64
var c int64
b := make([]int64,

元記事を表示

オレオレgoimportsを作ってみた

# やりたいこと、作ったもの

## `goimports`最高

`goimports`はGoのCLIツールで、`*.go`ファイルに対して↓を実行してくれます。

– `import`していない外部パッケージを`import`してくれる
– 使っていない`import`は削除してくれる
– 最後に`gofmt`もかけてくれる

## でも`goimports`は変な空行を入れてくる

[github.com/golang/go/issues/20818](https://github.com/golang/go/issues/20818) のIssueにある通り、`goimports`は変な空行を入れてきます。
こうなっている理由は単に「仕様が決まっていないから」で、Issueでも4年間くらい議論され続けています。

## 空行を最低限にする`goimports`を作った

こういう状況ならオレオレ`goimports`を自作するしかないだろうと思って作ってみました。

https://github.com/rinchsan/gosimports

どれだけ空行を入れていようが順番

元記事を表示

DATA-DOG/go-txdbでDB接続を含むテストを楽に書こう

# DB接続を含むテストはツライ

– テスト用のデータをテストケースごとに用意しないといけない。
– DBの変更結果が他のテストケースに影響を与えないようにリセットしないといけない。
– DBへの変更が他のテストケースに影響を与えるので並列実行できない。

# DATA-DOG/go-txdbを使うと改善できる

– [DATA-DOG/go-txdb](https://github.com/DATA-DOG/go-txdb) で生成することのできるDBコネクションには↓のような特徴があります。
– `sql.DB`と互換性がある。
– すべてのクエリが独立したトランザクション内で実行される。
– `.Close()`を呼ぶとそのトランザクション内で実行されたクエリがすべてRollbackされる。
– これをうまく使うと、テストケースごとに独立したトランザクション内でクエリを実行することができ、テスト終了後にDB変更がRollbackされるので、テストケースごとのデータ処理が必要なくなり、他のテストケースへの影響もなくなるのでテストを並列実行することができます。
– 実際

元記事を表示

OTHERカテゴリの最新記事