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

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

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ド

元記事を表示

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

元記事を表示

OTHERカテゴリの最新記事