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

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

go でGithub Copilot を軽く触ってみた

# なんの記事?

golang でGithub copilot の基本機能を使ってみたログと所感

# Github Copilot とは

“`
関数名とコメントから、関数のコードを丸ごと自動補完するAIプログラミング機能
“`

https://copilot.github.com/

https://www.itmedia.co.jp/news/articles/2106/30/news063.html

# 基本操作

– `Tab`で補完
– `Option+]` (or `Option+[`) で次/前の候補 (Mac OS)
– `Esc` で補完を消す
– `ctrl + enter` で他の候補の一覧

# 実際にgo で触ってみる

環境:VSCode, Mac

vscode でインストール後やることはシンプルでコードを入力してタブで補完するだけ。
提案方法には
– 関数名から補完する方法
– コメントから補完する方法

があるようで、どちらも試してみた。

## 関数名で補完

func main() なんて書いてみると適当な加算のサンプルコードが提案さ

元記事を表示

【Golang】相関係数の算出

## 概要
Goで相関係数を求める

## 数理パッケージ
gonumはちょっと用途に合わなかったので、[montanaflynn/stats](https://github.com/montanaflynn/stats)のCorrelation関数を使う

## 使い方

“`go
package main

import “github.com/montanaflynn/stats”

func main() {
cor, _ := stats.Correlation([]float64{1, 2, 3, 4, 5}, []float64{1, 2, 3, 5, 6})
fmt.Println(cor)
// Output: 0.9912407071619302
}
“`

元記事を表示

【要約版】net/httpでつくるHTTPルーター自作入門

先日、[net/httpでつくるHTTPルーター 自作入門](https://zenn.dev/bmf_san/books/3f41c5cd34ec3f)という薄い本を書いたのですが、もっと手短に内容を伝えたいと思ったので、本の要約を書いてみました。

コードだけ見たいという場合は以下を参照してください。
[bmf-san/introduction-to-golang-http-router-made-with-net-http/blob/main/trie.go](https://github.com/bmf-san/introduction-to-golang-http-router-made-with-net-http/blob/main/trie.go)

合わせて筆者が自作したHTTPルーターも見てもらえると嬉しいです。
[bmf-san/goblin](https://github.com/bmf-san/goblin)

# 何の話?
Goで標準パッケージだけを使ってHTTPルーターを自作するための考え方とやり方の話です。

以下のようなHTTPルーターを自作します。
[

元記事を表示

【1】GolangでWebアプリケーションを作成する【MySQL/CRUD】

# はじめに
この記事は[GolangでWebアプリケーションを作成する](https://qiita.com/blackmax1886/items/7ca44fd1519dbac59dd2 “概要と設計”)の続きです。
今回はtaskのCRUDを作成します。

CRUDは主に[こちらのチュートリアル](https://www.golangprograms.com/example-of-golang-crud-using-mysql-from-scratch.html)を参考にしています。

# 環境
– go1.16.5 windows/amd64
– Goland
– MySQL Ver 8.0.26 for Win64 on x86_64

# 実装
## MySQL DBの準備
localにteamtaskというdatabaseと、その中にtaskテーブルを作成する。
とりあえずフィールドはnameとcontentのみ

“`sql
create database teamtask;
use teamtask;
create table task (id int, n

元記事を表示

【業務システム向け】とにかく実装量が少ない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:

元記事を表示

OTHERカテゴリの最新記事