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

Go関連のことを調べてみた2020年02月29日
目次

Go 1.13 以降で発生する 410 Gone への対応

GOPRIVATE環境変数にリポジトリ名を設定する。
下記のような感じで、zshrcとかのシェルの設定ファイルに書く必要がある。

“`
export GOPRIVATE=”github.com/hiko1129/macrotrends”
“`

元記事を表示

golangのormであるxormを使ってみた

# はじめに
– こんにちはRIN1208です。今回はgolangのormであるxormに触れてみたのでそちらについて書いていきたいと思います。

# 実行環境
– DockerCompose
– Goの実行環境 ver.1.13
– VScode(お好みのエディタ)

以上の環境がある前提で書かせていただきます

# コンテナを立てる

“`docker-compose.yml
version: “3”
services:
mysql:
image: mysql:5.6
container_name: some-mysql
restart: always
environment:
– MYSQL_ROOT_PASSWORD=root
– MYSQL_DATABASE=hoge
command: >
–character-set-server=utf8mb4
–collation-server=utf8mb4_general_ci
–innodb_file_per_table

元記事を表示

プログラムの複雑さを下げるため、条件分岐を減らす方法を考える

## はじめに
if分岐を減らすコードの有用性⇒なぜか三項演算子の話に置き換えられるってのをTwitterで見かけたので、実例を挙げてみました。
言語に寄らない知識なので使う言語はなんでもいいのですが、私が今使っているgolangで説明させていただきます。

### なんで条件分岐が少ないと嬉しいのか?
個人的には、頭に優しくなるのが一番のメリットだと思っています。

– 頭に優しい
– どこに分岐があるのかを考える箇所が減る
– 今なんお分岐中なのか?を考える箇所が減る

もう少し客観的な理由をまとめます。

#### 影響範囲の複雑さを減らす

分岐処理がいたるところにあると、分岐処理が増えた時にいたるところに手を入れる必要があります。
しかし、これが分岐を減らして特定の場所に分岐がまとまっていくと、結果分岐に影響するコードの範囲が減ります。
疎結合なコードを作るのは大事ですよね

#### テストの複雑さを減らす
テスト設計、皆さんどうしていますか?
テスト観点には以下があります。

– 中身を気にしないブラックボックステストの網羅性(入力パターンを如何に網羅する

元記事を表示

GoのechoでRESTAPIを作る時にCORSで怒られた時の対処法

フロントエンドとバックエンドでドメインが違う場合、フロントエンドからバックエンドにfetchするとCORSで怒られる。
その際は以下のようにCORSWithConfigミドルウェアを設定してやればいい。

“`server.go
e := echo.New()
e.Use(middleware.CORSWithConfig(middleware.CORSConfig{
AllowOrigins: []string{“http:///*リクエスト送る側のurl*/”},
AllowHeaders: []string{“authorization”, “Content-Type”, “Access-Control-
Allow-Origin”},
AllowCredentials: true,
AllowMethods: []string{http.MethodGet, http.MethodPost},
}))

e.POST(“/login”, login)
e.GET(“/logout”, logout)

e.Logger.Fat

元記事を表示

Prometheus+Grafanaでk8s上のGoアプリケーションのメトリクスを回収して可視化

Prometheus+Grafanaで、k8s上で動かしているGoアプリケーションのMemoryやゴルーチン起動数などのメトリクスを回収し可視化する

# 最終的なグラフ

![](https://user-images.githubusercontent.com/19891114/71416134-8bc93c00-26a2-11ea-813f-195ab8c1bdd7.png)

# 構成図

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129577/6e593532-a986-3347-738b-45420c420773.png)

この記事では、Prometheus, Grafanaもk8s内で動作させます。
メトリクスの回収としては、GoのアプリケーションにPrometheus Exporterを入れてメトリクスを公開し、Promehteusはサービスディスカバリを使って、そのメトリクスを回収という挙動になります。

# 構築

## kubernetesクラスタを立ち上げる

元記事を表示

golangのmongo-go-driverを使うとstructのtime.TimeにUTCで日付が入るのでlocal-timeにする方法

“`go
ctx, _ := context.WithTimeout(context.Background(), 10*time.Second)
opt := options.Client().ApplyURI(“mongodb://localhost:27017”)

// findでstructにtime.Time型が設定されている状態で、取得するとUTCで設定されるのでLocalTimeZoneになるようにした。
rb := bson.NewRegistryBuilder()
// v1.2.1より前
// rb.RegisterDecoder(reflect.TypeOf(time.Time{}), bsoncodec.NewTimeCodec(bsonoptions.TimeCodec().SetUseLocalTimeZone(true)))
// v1.3.0以降 メソッドが変更になっている。。。
rb.RegisterTypeDecoder(reflect.TypeOf(time.Time{}), bsoncodec.NewTimeCodec(bsonoptions

元記事を表示

最も簡単にパワフルなGolangのvim開発環境をSpaceVimで構築する

## はじめに

Vimでgolangを書く環境を整えたいと思っていたところ、SpaceVimを使ってそれがとても簡単にかつ満足度高く実現出来たので書いていきたいと思います。

> 前提としてSpaceVimが適用されていることが前提となりますので、インストールされていない方は、[こちら](https://qiita.com/sayama0402/items/5a9621ee58cf5255d254)で設定を行なってください。
> Golangのインストールなどについても解説しません。

## layersの追加

[このlayer](https://spacevim.org/layers/lang/go/)を使います。

`~/.SpaceVim.d/init.toml`に以下の記述を追加します。

“`toml
[[layers]]
name = “lang#go”
“`

一度保存して、vimを開いてください。
vimのnormalモードで以下を実行します。

“`vim
:GoInstallBinaries
“`

上記実行後、gotagsをインストールするため

元記事を表示

関数とメソッドの違い【golang】

# オブジェクト指向言語では
# 関数
– オブジェクト関係なく、呼ぶと何か処理をする`プログラムの部品`

# メソッド
– オブジェクト指向で登場する用語で、`オブジェクトの動作を定義したもの`らしい。

# golangはオブジェクト指向??
– golangを勉強し始めて1週間。
– 今まで、同義的に使っていたメソッドと関数という言葉・・・
– golangがオブジェクト指向なのかはよくわからない([オブジェクト指向言語としてGolangをやろうとするとハマること](https://qiita.com/shibukawa/items/16acb36e94cfe3b02aa1))けど、まとめてみたらオブジェクト指向言語っぽく使えることを理解した。
– とにかく、**関数とメソッドは明確に違いがあるらしい**とのことでまとめてみた
– 諸先輩方、認識が違ったらご指摘お願いいたします。
– ※比較しやすいよう同じ処理をする

# 関数
– `func`で始まる処理の塊の中で構造体(型)に紐づけられていないもの

“`go:main.go

type Square struct {

元記事を表示

ランダムに抽選する関数の確率テスト(Golang)

自作した社員抽選Slack Botの抽選確率がランダムになっているか調査するテストを書いてみました

> Go + AWS LambdaでSlackの社員抽選botを作った話
https://blog.acall.jp/2019/11/develop-slack-lottery-bot/

## テスト対象関数
“`go:main.go
package main

import (
“math/rand”
“time”
)

func lotteryOneUserFromUsers(userIDs []string) string {
rand.Seed(time.Now().UnixNano())
userID := userIDs[rand.Intn(len(userIDs))]
return userID
}
“`
スライスを渡すと要素の1つがランダムで返ってきます
とてもシンプルな関数です

## テストコード
“`go:main_test.go
package main

import (
“fmt”
“math”
“testing”
)

func

元記事を表示

自分なりのGoアプリケーションDockerfileのベストプラクティス

最終的に作成されるDocker Imageが軽量になること
Docker Buildにかかる時間を短縮する

を目標としている

## フォルダ構成

“`bash
$ tree .
.
├── Dockerfile
├── Makefile
├── pkg_a
│   ├── pkg_a.go
│   └── pkg_a_test.go
├── pkg_b
│   ├── pkg_b.go
│   └── pkg_b_test.go
├── go.mod
├── go.sum
├── main.go
“`

標準的なGoアプリケーションの構成
ライブラリ管理はGo Modulesを使います。

## Dockerfile

Dockerfileは以下のようになっています。
工夫点はコメントで番号つけてます。詳細は後述します

“`Dockerfile
# ①
FROM golang:1.13 as builder

# ②
ENV CGO_ENABLED=0
ENV GOOS=linux
ENV GOARCH=amd64
WORKDIR /go/<アプリのリポジトリ名>

#

元記事を表示

Go言語製 抽選Botの精度が怪しいので検証してみた話

# いきさつ
ACALL株式会社では、slackで抽選をするbotがあって、会議のファシリテーターとか
誰か担当を決めるときにそのbotを使って決めています。

Go + AWS LambdaでSlackの社員抽選botを作った話
https://blog.acall.jp/2019/11/develop-slack-lottery-bot/

こんな感じで当選するのですが、
8c967525c648c218ea742cd5bfa515e8.png

このbotの精度がどうも怪しい。
私と弊社CTOがやたら当選する気がする!

d34c8bf56910f5a3db67231b5117a886.pngGolang製のSlackAPI(nlopes氏の)がレポジトリ引っ越したらしい(´・ω・`)

ちょうどSlackBotの開発をしていたところ気がついたのでメモ。

## 旧レポジトリ( 2020年2月27日時点 )

“`
レポジトリURL: https://github.com/nlopes/slack
“`

## 新レポジトリ( 2020年2月27日時点 )

“`
レポジトリURL: https://github.com/slack-go/slack
“`

## README( nlopes/slack )

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195292/8219701b-187f-be3f-9842-4b7ffee11517.png)

上記は2020年2月27日時点の `nlopes/slack` のREADMEですが以下の

>but no guarantees are made on how up to date it will be

からとりあえずこれから入るアップデートが必要な機能とかは保証されないうんぬんでちゃんと新レポジト

元記事を表示

leet code 83 Remove Duplicates from Sorted List の覚え書き

83 Remove Duplicates from Sorted List
https://leetcode.com/problems/remove-duplicates-from-sorted-list/

この問題が曲者すぎた。
ぱっと見で簡単やろうと思った自分を殴りたい。激ムズでっせ。
ListNodeの値は[1,1,3]

“`golang
func deleteDuplicates(head *ListNode) *ListNode {

cur := head
for cur != nil && cur.Next != nil {
if cur.Val == cur.Next.Val {
cur.Next = cur.Next.Next //これでheadも更新済み

fmt.Println(head, “headそのもの”)
fmt.Println(head.Next, “head.Next”)
fmt.Println(cur.Next, “cur.Next”)
} else {
cur = cur.Next
//ここでc

元記事を表示

GoでRace Conditionを発見する

goroutine を使う選択をしたときに、あなたはRace Conditionに注意しなければならない。

# countを5000回加算するコード(直列処理)

“`main.go

package main

import (
“fmt”
)

func main() {
var count int

for i := 0; i < 10000; i++ { count++ } fmt.Printf("count: %d\n", count) } ``` ## 結果 ``` $ go run ./main.go count: 5000 ``` # 愚直に並行処理にする この変更はRace Conditionを引き起こし問題になる ```diff import ( "fmt" + "sync" ) func main() { var count int + var wg sync.WaitGroup for i := 0; i < 5000; i++ { - count++ + wg.Add(1) + go func()

元記事を表示

go get でプライベートリポジトリをダウンロードできない時

公開リポジトリはダウンロード出来るけど・・・

“`
go get github.com/motemen/gore
“`
プライベートリポジトリはダウンロードできない!

“`
pi@raspberrypi:~ $ go get github.com/CreatorsLab/test-repository
# cd .; git clone — https://github.com/CreatorsLab/test-repository /home/pi/go/src/github.com/CreatorsLab/test-repository
Cloning into ‘/home/pi/go/src/github.com/CreatorsLab/test-repository’…
remote: Invalid username or password.
fatal: Authentication failed for ‘https://c61axxxxxxxxxxxxxxxxxxxxxxxxx:x-oauth-basic@github.com/CreatorsLab/

元記事を表示

プライベートリポジトリをgo getする方法。

#結論
①トークンを発行してね。
参考サイト
https://qiita.com/kz800/items/497ec70bff3e555dacd0

②トークンを.gitconfigに書き込んでね

“`
$ nano ~/.gitconfig
“`

“`~/.gitconfig
[url “https://xxxxxxxxxxxxxxx:x-oauth-basic@github.com/”]
insteadOf = https://github.com/
“`

####以下エラーが発生した場合トークンが間違ってるかも
“`
# cd .; git clone — https://github.com/CreatorsLab/test_repo /home/pi/go/src/github.com/CreatorsLab/test_repo
Cloning into ‘/home/pi/go/src/github.com/CreatorsLab/test_repo’…
remote: Invalid username or password.
fatal: Auth

元記事を表示

Goのアプリケーションをテンプレートから自動生成するCLIツール

## 作成したもの

**gogener**とは、テンプレートからGoのプロジェクトを自動生成するCLIツールです!
Chefのtemplateっぽく使えたらと思って作りました。

## 動作
![test](https://user-images.githubusercontent.com/21288308/70862524-d8b16200-1f80-11ea-812d-8ee6a92a140b.gif)

### モチベーション
新しくWebのAPIを作成する時に、
一から書くと時間かかって面倒臭いので、
テンプレートだけ作っておいて、いつでもプロジェクトを使えるようにしようとました

## どんなテンプレートがあるの?
テンプレートの取得には、gogener自身が持っている

元記事を表示

ログのクラスタリング分析の処理をGoで実装し、Cloud RunとPub/Subを使ってサーバレスで処理できる仕組みを作る

先日、Firebase + GAEを使って実装したサービス「[LogCrow](https://logcrow.firebaseapp.com/)」に新しい機能として、ログの登録を簡略化するために、ログファイルをアップロードして、ログの各行をクラスタリングし、類似ログ同士をまとめあげた上で、ログ登録できる機能を追加しました。

LogCrowのAnalyzeメニューにアクセスすると、ファイルをアップロードできるフォームがあります。ここに分析にかけたいログファイルをアップロードして実行すると分析処理がサーバサイドで走ります。

![AnalyzePage.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45851/7fce6520-87bb-4b1f-483d-9805afca1a6d.png)

![AnalyzePage2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45851/8c3eac53-6dbd-7f0e-2

元記事を表示

Go 1.14 で defer が速くなるのは 8 個まで

## TL;DR

[2020/02/25 にリリースされた Go 1.14](https://blog.golang.org/go1.14) では defer のインライン展開というランタイム高速化の改善が盛り込まれましたが、これは関数内の defer が 8 個までの場合に限り有効です。 8 個より多くの defer やループ内の defer を含む関数では従来と同じコードが生成され、パフォーマンスの改善はありません。

## 解説

2020/02/25 に開催された [Go 1.14 Release Party in Japan](https://gocon.connpass.com/event/167301/) の YouTube Live を視聴していて、 @tenntenn さんの defer トークで次のようなスライドを目にしました。

[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61759/9292a07c-8990-303f-e32d-7cee55174d1c.p

元記事を表示

Golangで、デザインパターン「Abstract Factory」を学ぶ

GoFのデザインパターンを学習する素材として、書籍「[増補改訂版Java言語で学ぶデザインパターン入門](https://www.hyuki.com/dp/)」が参考になるみたいですね。以前、取り上げられている実例は、JAVAベースのため、自分の理解を深めるためにも、Pythonで同等のプラクティスに挑んでみました。
[Qiita記事: “Pythonで、デザインパターン「Abstract Factory」を学ぶ”](https://qiita.com/ttsubo/items/30c86a265430a9e5050a)

今回は、Pythonで実装した”Abstract Factory”のサンプルアプリをGolangで実装し直してみました。

# ■ Golangで、Pythonクラスを実装し直す際の備忘録
**Golang では、Python等でお馴染みの、Inheritance(継承)ではなく、Composition(合成)のみが使われます。**

具体的、以下の2点を気をつけて、サンプルアプリの再実装に取り組みました。

– golangには、オブジェクトのクラス継承の概念が存

元記事を表示

OTHERカテゴリの最新記事