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

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

Go で API 作る

# はじめに

https://qiita.com/pure-adachi/items/3732d7d488c6dce8c060

`Go`を勉強し始めたので、`API`サーバーも体験しておこうということで、作ってみました。

`Docker`で環境構築して動かして、`Insomnia`とかから`API`の結果を見れるようにしてみます。

※途中から`Todo`データを`CRUD`する感じの`API`を作り始めますが、`DB`の話はしないので、ご了承ください。

# 早速作ってみる

https://github.com/pure-adachi/go-sample-api-server

`/api/sample`にアクセスすると、`{ “message”: “Hello World!!” }`が帰ってくるサンプルを作ってみました。

`Docker`でのサーバー起動コマンドは`go run cmd/main.go`で動かしています。

とりあえず標準ライブラリの`net/http`を使ってます。

“`go:cmd/main.go
package main

import (

元記事を表示

【Golang】gRPC単位のテストで、テスト雛形を自動生成したらだいぶ楽になれた話

gRPC単位の結合テストを書く際、雛形を自動生成してテストを書けるようにした話です。
gRPCのテストでなくても、他の様々なテストに似たような活かし方ができそうと思ったので書いています。

# GoでgRPC単位のテストを書くときの難点
Goで単体テストを書く場合、InteliJやVSCodeのプラグインには、コードの雛形を自動生成してくれる機能があります。
しかしgRPCやAPIなど、リクエスト単位のテストを書く際は、テストファイルを作って、テストを書いて…というステップをすべて自分で行う必要があります。

そのため、自動化できるところは自動化してしまおうと思ったのが今回の試みのきっかけです。
また、Go製のコード自動生成ツールはいくつかあるのですが、今回自動生成するものは割と小さめなコードでパターンがほとんど決まっていたので、お手製で自動生成するコマンドを作成しました。

# テストファイルの単位
gRPC単位テストでやりたかったことは、「gRPCを叩いてそのレスポンスをアサートする」というのを、基本的にすべてのAPIに対して1テストケースは用意しておこうというものでした。

元記事を表示

Goのポインタに関するお話

### 今回のお話
今回のお話はGoのポインタです。

Goは基本的に守備範囲外なのですが、面白かったので自分なりにまとめます。
### 目次
– ポインタとは
– ポインタのメリット
– ポインタの取得方法
– ポインタ型変数
– ポインタから変数を取得する方法
– 実際に使ってみよう

### ポインタとは
ポインタとは、メモリ上のどこに変数の値が保存されているのかを表したものになります。

いわば、変数の住所のようなものですね。

ちなみに、ポインタというのはGoの世界での呼び名であり、他の言語ではアドレスと呼ぶこともあるようです。

ポインタは基本的に16進数で表されます。

“`go:ポインタの例
0xc123456789
“`
### ポインタのメリット
ポインタの一番のメリットは、「スコープ外の変数を利用できる」という点です。

スコープとは、変数が利用できる範囲のことですね。

一般に、変数はその関数の外側に持ち出すことができません。
以下がその例です。

“`go:スコープによる制限の例
func main(){
a := 10
addOne(a) //

元記事を表示

あったらいいなと思っていたスキルマップアプリをVueとGoで作ってみた

# 作ってみたもの
作ったWebアプリは [Graphyee](https://graphyee.com) と名付けました。
技術と技術は関連しているものなので、「スキルマップをグラフ構造で表現できたら分かりやすくて面白いかな」と思いついたのが経緯です。
まだβ版としていますが、一旦使える感じになったのでノリと勢いで公開してみました。

こんな感じで [サンプル](https://graphyee.com/sample/1) は誰でも使えます。

:::note warn
サンプルは実績を入力しても保存できないのでご注意下さい。
:::

![sample.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2201222/57ea423b-20f5-3dcf-8370-b8c19134a8d5.gif)

ユーザ認証すると、より細かい [スキルマップ](https://graphyee.com/graph/1) が使えます。

:::note info
ユーザ認証していただければ、入力した実績が

元記事を表示

goldenファイルを使用したテストデータとgo structのマッピング

# 概要
– DDDアーキテクチャで構築したプロジェクトにて、usecase層のテストを書こうとした。
– しかし、usecase層からは抽象化されたrepositoryを経由してDBアクセスしているため、repositoryの実装クラスからのDBアクセスをテストでどのように再現するかに行き詰まった。
– そこで、抽象化されたrepositoryを継承するmockを用意し、実装ではダミーのDBデータを返却するようにした。
– その際のデータ管理にgoldenファイルを使用し、go構造体とマッピングすることによりダミーのDBデータ返却を実現した。
– 本記事の内容ではmockやinterfaceといった作法は無視して書きます。(ソース用意するのが大変なので。。。)

# goldenファイルとは
– JSON構造のファイルのこと。
– goの構造体のフィールド名、あるいは `json:”title,omitempty”“といった記述にマッピングすることができる。

# 前提

– go v1.17.2
– github.com/google/go-cmp v0.5.5
– 構造体比較の

元記事を表示

GoのポインタがよくわからなかったのでJSに置き換えて考える

# はじめに
備忘録です。
JSで開発している人がGolangを触ると `&` や `*` で何だこれとなると思います。
なので、何をしているかJSに置き換えてみました。
個人解釈なので、認識違いがあるかと…

## Goにおける `&`
「参照渡し」を明示的に行うためにつける。(Goは基本「値渡し」のため)

“`golang
func main() {
name := “名前”
p = &name // 明示的に参照渡しする 別アドレスにnameのアドレスに紐付かせるイメージ
name2 = name // 値渡し 別アドレスに別の値として格納
p = “ポインタ君”
name2 = “値渡し君”
fmt.Println(name, p, name2)
// ポインタ君, ポインタ君, 値渡し君
}
“`

“`javascript
const a = { p: ‘ap’ };
const b = obj; // 参照渡し
const c = { …obj }; // New Object で違うメモリ使う
b.p = ‘bp’;
c

元記事を表示

dockerを用いたgoreのinstall方法

みんなのGoという書籍を見ながら、goreをインストールしようとしたができなかったので、dokerを用いてgoreをインストールしてみた。

##公式レポジトリのREADNEに書いてあるとおり、以下を実行していく。

###1. まずはgit clone

“`
git clone https://github.com/x-motemen/gore.git
“`

###2. goreのディレクトリに移動し、dockerのbuildとrunを実行
“`
cd gore
docker build -t gore .
docker run -it –rm gore
“`

####追記

書籍に書いてあるgo getを用いた方法は、筆者のGo 1.17.2のバージョンでは動作しなかった。

“`
go get github.com/motemen/gore/cmd/gore
“`

これはGo1.16からのアップデートで、go getの代わりにgo installを使う仕様変更があったため。

####参照記事、書籍

・改訂2版 みんなのGo言語

・Clone

元記事を表示

go pprof snippet

cpu, trace, memory, block and goroutine

“`go
cw, err := os.Getwd()
if err != nil {
panic(err)
}

f, err := os.Create(path.Join(cw, “cpu.prof”))
if err != nil {
panic(err)
}
defer f.Close()
if err := pprof.StartCPUProfile(f); err != nil {
log.Fatal(“could not start CPU profile: “, err)
}
defer pprof.StopCPUProfile()

tf, err := os.Create(path.Join(cw, “trace.out”))
if err != nil {
panic(err)
}
defer tf.Close()
if err := trace.Start(tf); err != nil {
log.Fatalf(“profile:

元記事を表示

Goでエクセルから読み込んだ情報を変換してファイルに書き出す

## 目標

データベースを更新するために、エクセルの情報を変換してsqlファイルに書き出すスクリプトをGoで書きます。
エクセルファイルの中身は下記です。呪術廻戦は見たことありません。

| 0001 | gojou@satoru.u-jujutsu.co.jp |
| —- | —- |
| 0002 | ryoumen@sukuna.u-jujutsu.co.jp |
| 0003 | itadori@yuuji.u-jujutsu.co.jp |
| 0004 | |
| 0005 | fushiguro@megumi.u-jujutsu.co.jp |

### yyyyMMddHHmm形式のファイル名のsqlファイルを作成
“`go
t := time.Now().Format(“200601021504”)
file, err := os.Create(“/hoge/fuga/” + t + “.sql”)
if err != nil {
fmt.Pri

元記事を表示

Go言語の時刻のフォーマットが終わってるので書きやすくするパッケージを書いた

Go言語の時刻フォーマットをまずご覧ください

“`go
const (
stdLongMonth = “January”
stdMonth = “Jan”
stdNumMonth = “1”
stdZeroMonth = “01”
stdLongWeekDay = “Monday”
stdWeekDay = “Mon”
stdDay = “2”
stdUnderDay = “_2”
stdZeroDay = “02”
stdHour = “15”
stdHour12 = “3”
stdZeroHour12 = “03”
stdMinute = “4”
stdZeroMinute = “04”
stdSecond = “5”
stdZeroSecond

元記事を表示

Go言語とwebviewで簡単デスクトップアプリを作ろう

Go言語でデスクトップアプリを作るのは、なかなかハードルが高いと感じています。それで、ブラウザベースの「webview」を使うと、手軽にUIが作れます。(ちなみに、[日本語プログラミング言語「なでしこ3」](https://nadesi.com)でWin/Mac向け配布パッケージを作ったので、その技術的調査のまとめです。)

# webview/webview を使う場合

[webview/webview](https://github.com/webview/webview)はSafari/EdgeなどOSに最初からインストールされているブラウザのコンポーネントを利用してHTMLを表示するパッケージです。これを使うことで、配布サイズがElectronなどのアプリに比べて小さくなるのが特徴です。Win/Mac/Linuxで同じように使えます。

非常にによくできたパッケージです。ただし、欠点があって、Windowsでうまく動かないことが多いです。また、macOSではalertなどのダイアログが表示されません。

使い方は以下の感じです。最初にパッケージをインストールします。

“`

元記事を表示

ebitenで走査線シェーダーを作ってみた

 ebitenのシェーダーで「走査線シェーダー(昔のブラウン管テレビの走査線を模倣する)」を作ったので、メモ代わりで公開します

 走査線処理的には、Windows版餓狼伝説MOWのドットの境界線を走査線で強調するパターンです

“`golang
package main

func Fragment(position vec4, texCoord vec2, color vec4) vec4 {
if int(position.y) % 3 != 0 {
return imageSrc0At(texCoord)
}

var clr vec3
clr.r = imageSrc0At(texCoord).r * 0.5
clr.g = imageSrc0At(texCoord).g * 0.5
clr.b = imageSrc0At(texCoord).b * 0.5

return vec4(clr, 1.0)
}
“`

 ファミコンの頃の像解度をNintendo Switchで表示すると3×3倍になるので、「% 3」のmod処理で余りを調べて、Y軸で3ド

元記事を表示

2.7inch e-Paper HatをRaspberry Piで使用する go言語

# はじめに
[e-Paper](https://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=EEHD-58WK)を購入したけど使っていなかったので、とりあえず試してみた。
あと、Pythonのプログラムがあるけど、go言語でやりたいので調べたらライブラリがあるのでとりあえずテストしてみた。

# ソースコード

“`go:main.go
package main

import (
“time”

“github.com/otaviokr/go-epaper-lib”
)

func main() {
// New EPaperDisplay handler for model 2.7 inches, black-and-white..
epd, err := epaper.New(epaper.Model2in7bw)
if err != nil {
panic(err)
}

// Run mandatory initialization.
epd.Init()

// Clear screen to av

元記事を表示

Go-lang の文字列を宣言&代入する

Go言語の勉強メモ

`:=` ってなんや?ってやつ。

`var` がいらない && 暗黙の型定義するときに使うらしい

下はすべて同じ意味

“`go
var msg1 string = “Hello World”
var msg2 = “Hello World”
msg3 := “Hello World”

var msg4 := “Hello World” // syntax error
msg5 string = “Hello World” // syntax error
msg6 = “Hello World” // syntax error

“`

## refers
https://qiita.com/HiromuMasuda0228/items/65b9a593275f769f6b69
https://qiita.com/tfrcm/items/e2a3d7ce7ab8868e37f7

あと文字列内で変数展開ができないという衝撃
https://qiita.com/KEINOS/i

元記事を表示

GoのHTTPサーバにてログ用途などのためにrequestのbodyを”消費”させない読み取り方とそれに関連するnet/httpの実装

# はじめに 〜 やりたいこと

Request Bodyをログ用に引っ張ってもアプリの読み取りに影響が無いようにしたい。

# 前提

本記事でのライブラリコードでの日本語のコメントは筆者による日本語訳と筆者自身のコメントが混ざっているのでご注意ください。

## 環境

“`terminal
$ go version
go version go1.17.2 darwin/amd64
“`

# 読み取りが失敗してしまう実装

“`go:失敗してしまう実装
package main

import (
“fmt”
“io/ioutil”
“net/http”
)

// HTTPサーバ
func hello(w http.ResponseWriter, req *http.Request) {
bufForLog, _ := ioutil.ReadAll(req.Body) // 読み取り済みフラグがtrueになり次回はもう読み取れなくなる
fmt.Println(bufForLog) // [123 10 32 32 32 32

元記事を表示

API Gateway + Lambda でリダイレクトする方法(Go言語)

# 目的
API Gateway + Lambda でリダイレクトさせたいときの Go 言語のコードを紹介します。

# リダイレクトさせる Go 言語のコード

APIGatewayProxyResponse は、リクエストに対して API Gateway によって返されるレスポンスを構成します。よって、APIGatewayProxyResponse にリダイレクト(3xx)のステータスコードとリダイレクト先 URL をセットしてあげれば、クライアントにリダイレクトさせることが可能です。

“`golang
package main

import (
“net/http”

“github.com/aws/aws-lambda-go/events”
“github.com/aws/aws-lambda-go/lambda”
)

func handler(request events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {
return events.APIGatewayProxy

元記事を表示

【Go】Qiita デイリー LGTM 数ランキング【自動更新】

# 他のタグ

[`AWS`](https://qiita.com/items/8c4aeec4fc98e4b1ba0e) [`Android`](https://qiita.com/items/9c6bf21a9880e242a0d6) [`Docker`](https://qiita.com/items/70aa655b580ed4f91756) [`Git`](https://qiita.com/items/36cfb2318aabe8b3f8df) [`Go`](https://qiita.com/items/16809f8444e0329bed8a) [`iOS`](https://qiita.com/items/da7fabcf41ed103528ae) [`Java`](https://qiita.com/items/9003b8beb47a46292028) [`JavaScript`](https://qiita.com/items/31e7365a838b890f7cc3) [`Linux`](https://qiita.com/items/7bcae94b268b

元記事を表示

git hooksでpre-commit hooksを使って自動化した話

git のcommit前にlintやらを差し込みたいなということgit hooksを使って設定してみました。

# git hooksとは
gitが提供している公式の機能でgitの特定のイベントをトリガーにして自分が設定したscriptを実行させる機構です。
例えば、push前にtestを実行をさせたり、commit前にlintを走らせたりできます。
今回は、commit前にlintを走らせる処理を書きました。

## 設定方法(pre-commit)
git hooks自体はgitに内蔵されています。
具体的には.gitの中にscriptのサンプルファイルがあります。

terminal でgitで管理しているプロジェクトのrootに移動して
下記のコマンドでhooksファイルがあるディレクトリに移動しましょう。

“`shell
cd .git/hooks/
“`

すると、以下のファイルがあり、 `.sample` という文字列をファイル名が除外して

“`
chmod a+x <ファイル>
“`
と権限を与えればhooksが有効になります。

“`
applypat

元記事を表示

Goでcsvデータを読み取り、DBに保存

# はじめに
csvのデータをDBに保存しなけらばならなくなり
csvデータをDBに保存する 機能を作成しましたのでメモ程度に記載します。

環境は echo+gorm+docker です

##ディレクトリ

“`
Project
├──docker
| ├──go
| | └──Dockerfile
| └──mysql
|
├──docker-compose.yml
└── src |
└──go
├── controllers
├── database
├── csv
| └──schooldata.csv
|
├── db (migationとかseedとか)
├── dbconfig.yml
├── go.mod
├── go.sum
├── main.go
└── fresh.conf
“`
##実行するgoファイル

今回は
schoolsとい

元記事を表示

【Go】mongo-go-driverでコレクションの全件を取得する

## 概要
MongoDBで全件検索したい時、[[Mongo] findメソッドのいろいろな使い方(MySQLと比較)](https://www.yoheim.net/blog.php?q=20150601)の記事にある通り単純にfindメソッドを使えばOKです。では、GolangでMongoDBを使用する際に使う、mongo-go-driverで全件取得するにはどうすれば良いのか。
[[Mongo] findメソッドのいろいろな使い方(MySQLと比較)](https://qiita.com/h6591/items/a1898bddb6819b27d88f#find%E6%9B%B8%E5%BC%8F)の記事を見ると、Findメソッドは`Find(context.Context, 検索条件, Find オプション)`とあり、検索条件の部分はnilを設定すれば良いのかなと思いnilを設定したところ、エラーとなりました。

## 対応
[こちら](https://pkg.go.dev/go.mongodb.org/mongo-driver/mongo#Collection.Find)のド

元記事を表示

OTHERカテゴリの最新記事