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

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

【業務システム向け】とにかく実装量が少ないWEBテンプレート作った(フロントエンド編)

# はじめに
業務システムあるあるの機能がそろった
ログイン→一覧→登録、編集機能のWEBテンプレートを作りました。

![ログイン.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1734544/2b4782c7-06b6-2f18-31c0-dcb65cb70b8c.jpeg)

ログイン画面は非常によくあるIDとパスワードによる認証画面です。
デザインはSemantic-UIを使用しているためとてもスタイリッシュに仕上がっています。
フォームのバリデーションとそのメッセージ表示機能を備えています。

![ログイン2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1734544/a90d84a5-e0b4-efa8-e747-086eb70f7c31.jpeg)

トップ画面では機能の紹介を載せていますが、ここはプロジェクトによってダッシュボードに変わったりするかと思います。
全画面共通のヘッダからサイドメニュー、ロ

元記事を表示

openapi-generator-cli (go-server)

こちらで行ったことと同じことを go-server で行いました。
[openapi-generator-cli (python-flask)](https://qiita.com/ekzemplaro/items/457ce1c8b93aed53b4b7)

>hello.yaml は同じです。

#Go のサーバーを作成#

“`bash
npx @openapitools/openapi-generator-cli generate \
-g go-server \
-i ./hello.yaml \
-o ./src \
–api-package=api \
–model-package=model \
–additional-properties=withSeparateModelsAndApi=true
“`

コードの修正

“`go:go/api_hello_service.go
/*
* Hello
*
* ユーザ名を与えると挨拶を返してくれるAPI
*
* API version: 1.0.0
* Generated by: Op

元記事を表示

初心者が使えそうだと思ったGoパッケージをまとめる

#はじめに
学習の一環としてGoの初心者がこれから個人開発をするにあたって使えそうだと思ったパッケージを逆引き的な感じでまとめました。
まだ途中なのでこれから開発が進むに連れてどんどん補充していく予定。

##timeパッケージ
Goの時間に関係するパッケージ
###時間を表示したい
“`Go
time.NOW()
//現在時刻を返す関数
//>>2021-10-24 16:02:29.28855 +0900 JST m=+0.000072118
“`

###特定の時刻を作成、表示したい
“`
t2 := time.Date(2020, 6, 10, 10, 10, 10, 0, time.Local)

//指定した時間を生成
fmt.Println(t2)
//>>2020-06-10 10:10:10 +0900 JST
fmt.Println(t2.Year())
//>>2020
fmt.Println(t2.YearDay())
//>>162
fmt.Println(t2.Month())
//>>June
fmt.Println(t2.Weekday())
//

元記事を表示

Github Actionsで、プライベートリポジトリのコンテナを使った自動テストを行う

# はじめに
世間には様々なCI/CDツールがありますが、GitHub Actionsは、GitHubを使用していれば気軽に導入できるため、使用している方は多いかと思います。
本記事では、DockerImageをプライベートリポジトリのGitHubコンテナレジストリに登録し、登録したDockerImage内で、GolangのUnitTestを動作させる方法を記載しています。

# 背景
筆者の開発環境は、VSCodeのDevContainerを使用しています。DevContainerはこちらの記事を参照してください。

https://qiita.com/kishibashi3/items/e20aecef45ed8341e739

開発には、ビルドに時間のかかるライブラリや、GitHubにコミットできない大容量の外部ライブラリが必要でした。DevContainerは、あらかじめ開発環境をDockerImage化することで、誰でも同じ環境で開発できます。
CIでも同様の環境を用意する必要があり、DevContainerを流用して、CI用の環境を作成することにしました。

# 手順
Do

元記事を表示

go get時にpackage embed: unrecognized import path “embed” (import path does not begin with hostname)が表示される

## go getでpackage embed〜が出る

“`
$ go get -u github.com/****/****
package embed: unrecognized import path “embed”: import path does not begin with hostname
“`

ちなみに、遊ぶ目的でojichatをインストールしようとしていた感じでした :joy: 笑
参考) https://github.com/greymd/ojichat

## embed packageとはなんぞや

リリースノート見てみると、go 1.16から追加された様子
https://go.dev/blog/go1.16

## バージョンを確認してみる

“`
$ go version
go version go1.15.14 linux/amd64
“`

ありゃ。
ということで、goのバージョンをあげます。
https://golang.org/dl/go1.16.linux-amd64.tar.gz

こちらからwgetでダウンロードしてきてイ

元記事を表示

relocation target type not definedが出たとき

Goのバージョン: 1.17.2

2021/10/24追記: 最新のmasterブランチで確認したところ、1.18では修正されて正常にビルドできそうです。

Go1.17を使用して、 `-gcflags=-G=3` を使ってジェネリクスの機能をonにしてビルドする際に
ジェネリクスな関数の中で、ジェネリクエスな引数を取るジェネリクスな関数を 匿名関数の中で呼ぶ場合に起きる(?)っぽい。

## どうするか

“`go:問題のコード
package main

func a[T any](t T){}

func b[T any](t T) {
func () {
a[T](t)
}()
}

func main() {
b[int](0)
}
“`

“`go:修正したコード
package main

func a[T any](t T){}

func b[T any](t T) {
a := a[T]
func () {
a(t)
}()
}

func main() {
b[int](0)
}

“`

ジェネリクスな関数を呼ぶ前に、変数に

元記事を表示

ディレクトリ、ファイルのコピーを Golang で書いてみる

# 概要
最近業務であるディレクトリの中身を丸ごとコピーしてたのですが、様々なサイトを見ても処理が分かりにくいものが多かったので今一度分かりやすいコードを書きたいと思います。
他の参考サイトを見ても分かりにくいと感じた点はおそらく以下の点です。

* 再帰処理の複雑さにより、各関数の役割が明確で無くなっている。

参考サイトによっては「ディレクトリを追加しながらファイルを読む関数」等があったりと個人的には分かりにくく、実際に業務においてレビューするのであれば指摘をするかなと。

# 環境
今回私が実行した環境は以下です。

* Go 1.16.8
* VSCode
* Windows10
* WSL2(Ubuntu)
* Docker Desktop

`Windows` の `Docker Desktop` を起動し、 `Ubuntu` 上でコンテナを立ち上げ、 `VSCode` のリモートコンテナより実行しました。
便利な世の中になりましたね。

なお、これから説明する完成したコードは以下に全て配置しています。

[GitHub – hfh3oa](https://github.c

元記事を表示

【go-oci8】GolangでAutonomous Database (ADB) に複数同時接続させた時のORA-12529エラー解消方法

# 経緯
Oracle Cloud Infrastructure (OCI) 上にある複数の Autonomous Database (ADB) にGoで同時接続させる必要があったが、2つ目以降のADB接続時に*ORA-12529エラーで接続タイムアウトされてしまい、非常に苦しめられた。
(SQL PLUSでは普通に接続できるので、接続文字列やtnsnames.oraの記載は間違っていない…)

[*ORA-12529エラー (公式リファレンス)](https://docs.oracle.com/cd/F19136_01/errmg/ORA-12500.html#GUID-BD6AAC21-3F15-4F70-B3C5-064ADCF5EC51)

:::note info
補足情報
セキュリテイに関して特に問題なければ、*ADB間のデータベースリンクを作成した方が、複数ADBに接続する必要がなくなるので、ラクに解消できるかもしれない…
:::
*[ADB間のデータベースリンク (Qiita投稿@TakuyaAma「Autonomous Database間のDBLINKの自分用メモ

元記事を表示

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ド

元記事を表示

OTHERカテゴリの最新記事