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

Go関連のことを調べてみた2022年08月23日
目次

Goから外部コマンドの呼び出しではPATHの「~」が展開されない

## Goから外部コマンドの呼び出しではPATHの「~」が展開されない

Goで書かれたプログラムから外部コマンドを呼び出す場合、環境変数PATHに~(チルダ:ホームディレクトリ)は展開されないので、~/bin/のようにPATHを通している場合、実行に失敗します。原因がわからず結構はまりました。

以下のように~を使わず、$HOMEを展開し回避します。

“`
export PATH=”$HOME/bin:$PATH”
“`

たまにはまっている人がいる問題のようなので([例](https://github.com/kubernetes-sigs/aws-iam-authenticator/issues/136))、記事として日本語で共有しておきます。

## やりたかったのは

WSL2の環境で、chezmoiから1Password CLIを利用しているのですが、Linux版のCLIはWSL2のホストで動いている1Password GUIと通信してくれません。そのため、1Passwordの長いマスターパスワードを打ち込む必要があります。
一方、Windows版の1Password

元記事を表示

Go における HTTP リクエストの受け取り方

## 前回

https://qiita.com/BitterBamboo/items/6119f7986a04c5a0ac57

## HTTPリクエストの構造

`net/http` におけるハンドラ(関数)は、以下のように `*http.Request` という引数を持っているのでした。

“`go:とあるハンドラ(関数)
func hoge(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, “hoge”)
}
“`

このハンドラ(関数)の引数にある `http.Request` の構造は下記のようになっています。

“`go:net/http
type Request struct {
// 省略
Header Header
// 省略
Body io.ReadCloser
// 省略
Form url.Values
PostForm url.Values
MultipartForm *multipart.Form
// 省略
}
“`

`net/http` を用いた Web アプリで

元記事を表示

GoのswaggerでAPIを登録しているのにAPI一覧が表示されない

# はじめに

GoでSwaggerを利用したのですが、APIを設定しているのに表示されなくなったのでまとめていきます
始めて利用する際に起きそうな現象でしたので参考になればと思います

# 問題

APIを1つ登録していたのですが、そのAPIが突如表示されなくなりました
とくにエラーがでているわけでもない、変なコードを加えたり修正したりした記憶がなく困りました

# 解決方法

コメントしている位置が原因でした

これがAPIが表示されないコードで
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/c706107a-ddc7-7868-36be-47e2c19cf963.png)

これが修正後のコードです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/3606056b-ae46-91f5-79d2-763a22b2c107.png)

コメントと関数の間に改行を

元記事を表示

GOのSwaggerでPostのFormデータを設定できるようにしたい

# はじめに

Goのgin-swaggerを設定する際にswaggerを始めて設定した私がつまづいた箇所があったのでまとめます

# 問題

gin-swaggerを利用してPOSTのAPIを登録しました
そのAPIでは`form-data`として`email`と`password`を受け取ります

いくつかの記事をみると`query`の設定の仕方は以下のようになっていました

“`
// @param none query string false “必須ではありません。”
“`

しかし、`form-data`を設定する方法がなかなか検索で出てこなかくて困りました

# 解決方法

Goは公式ドキュメントを読むと解決することが多く、今回はまさに[公式ドキュメント](https://github.com/swaggo/swag)に書いてありました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/ba0ca1b1-5272-59e5-8625-8e06f339fd2c

元記事を表示

GoのSwaggerでFailed to load API definitionエラーが発生する

# はじめに

仕事でGo開発を始めてREST APIのためにgin-swaggerを導入したのですが、記事通りにやってエラーが発生しました
そこで2度同じ現象につまづいたのでまとめていきます

# 問題

gin-swaggerを設定してブラウザを開いたところ以下の画面になりました

“`
Failed to load API definition
“`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/b9b5252d-3792-44a5-017a-6b13819c97a5.png)
[こちらから引用](https://www.thecodebuzz.com/resolved-failed-to-load-api-definition-undefined-swagger-v1-swagger-json/)

# 解決方法

これは`doc`をインポートしていないことで、swaggerがswaggerに関する設定ファイルを読み込めていないことで起きていました。

インポ

元記事を表示

【Go/Gin】手早くサイトを作るチートシート

# はじめに
とりあえず手早くサイトを作りたい、話はそれからだ、という人向けにGo, Ginを用いて手早くサイトを作るチートシートをここに残します。

# まずはGinのインストール
コマンドプロントで下記を入力。
“`
go get github.com/gin-gonic/gin
“`

# mainテンプレート
まずは基本骨格です。これをベースに味付けしていきます。
“`Go:main.go
package main

import (
“github.com/gin-gonic/gin”
)

func main() {
router := gin.Default()
router.LoadHTMLGlob(“templates/*.html”)

//トップページ
router.GET(“/”, func(ctx *gin.Context) {
ctx.HTML(200, “top.html”, gin.H{
})
})

router.Run()
}
“`
main.goと同じ階層にtemplatesディレクトリを作成し、その中に”top.ht

元記事を表示

Goで go invalid memory address or nil pointer dereference エラーが発生する

# はじめに

最近Goを仕事で初めて、色々な記事を参考にREST APIを作成していました
そこで変数のポインタに関するエラーが発生したのでまとめます

初心者ならやりそうなミスだと思うので多くの方の参考になればと思います

# 問題

以下のコードで変数DB(gorm)の初期設定を行いました

“`go:base.go
var DB *gorm.DB
var err error

func init() {
checkDB()
dsn := config.Config.DBName
DB, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
log.Fatalln(err)
}
migrate(DB)
}
“`

そしてそこで設定した変数DBを利用して以下の関数でユーザーを取得します

“`go:user.go
func GetUserByEmail(e string) User {
user := User{}
DB.Where(“Email = ?”, e).First(&

元記事を表示

高級言語で`string`とか`slice`を使う際に気をつけている効率化のためのTips

## この記事は

株式会社Nucoで golang でバックエンド開発をやっているhitoshi44と申します。

Qiitaの記事を書いてくれと言われたので、自分がコードを書くときにちょっとこだわっていることをTipsにしてみます。
カレーはルーが右で福神漬けが奥みたいなレベルのこだわりですが参考になれば幸いです。

slice型 (と実質的なsliceである`string`型)を扱う時にこうするとエコだよねと言う話です。

言語は今業務で使っている golang を例に出しましたが、言語によらない話です。

## `slice`型(と`string`型)の仕組み

`slice`型は本質的には動的配列を覗くための窓のようなものですが、まずはどんな仕組みになっているか見てみましょう。

golang, Rustの`slice`型はECMAScriptだとDataViewが近いです。
またほとんどの言語で`string`は`slice`の兄弟のようなものです。

“`go
data := []int{1,2,3}
“`

この時、変数 `data` はこんな形をしています

`

元記事を表示

Serverless frameworkでGoをデプロイしたらPath errorが発生する

# はじめに

この記事は2022年8月にまとめていた「細かいつまずいたことをメモしておく(8月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 問題

https://blog.mmmcorp.co.jp/blog/2020/06/07/aws-lambda-with-golang-gin/

https://zenn.dev/sti320a/articles/f60aa3ef305075

この記事をみて設定をしていたがいざデプロイすると以下のエラーが発生

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/982f825a-772f-921b-3286-d61806242e96.png)

# 解決方法

“`Makefile
build:
go mod download
env CGO_ENABLED=0 GOARCH=amd64 GOOS=linux go build -ldflags=”-s -w” -o bi

元記事を表示

Goでgooseコマンドを打っても実行できない

# はじめに

この記事は2022年8月にまとめていた「細かいつまずいたことをメモしておく(8月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 問題

“`
$ go install github.com/pressly/goose/v3/cmd/goose@latest
“`

https://github.com/pressly/goose

で`goose`をいれて、`goose status`を叩いても実行ができず`goose help`と同じ内容がでる
/dbに`dbconf.yml`を設定しているがそれが読み込まれていないようだった

# 調査

以下のコマンドでgooseを実行すると成功した

“`
$ goose mysql “root:password@tcp(db:3306)/techblog?parseTime=true” status
“`

これは

“`
goose mysql “ユーザー名:パスワード@tcp(ホスト名:3306)/DB名?parseTime=true
“`
と読み替える

元記事を表示

GoのPostでBindJSONで値が取得できない

# はじめに

この記事は2022年8月にまとめていた「細かいつまずいたことをメモしておく(8月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 問題

以下の記事を参考にPOSTを作成していたがPostmanで送った値が取得できなかった

https://qiita.com/katsuomi/items/d1e6625ae9a5b663e11f

# 解決方法

ここで私が解決に至った手順を載せる

## 1. 構造体にJsonで送る際の名前を設定する

“`go:model.go
type Item struct {
Title string `json:”title”`
Description string `json:”description”`
}
“`

`josn:”title”`のようにつけないとPostmanのデータで`title`というKeyで送ることができない(Tが大文字で構造体には設定されているため)

## 2. PostmanではJSONで送信する必要がある

これがかなり沼っ

元記事を表示

GoのAPIにReactのAxiosでアクセスするとエラーになる

# はじめに

この記事は2022年9月にまとめていた「細かいつまずいたことをメモしておく(9月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 問題

Goで作成したユーザー一覧をJSONで返すAPIにReactでAxiosを使ってアクセスするとエラーになってしまった

# 解決方法

CROS?という方は以下の動画をまずみましょう

ここではginを利用している場合の解決策を載せる
原因はGo側にあるのでReactの立っているlocalhost:3000からのアクセスを許可するように設定してあげたらアクセスができた

“`go:main.go
func main() {
engine := gin.Default()

config := cors.DefaultConfig()
// config.AllowAllOrigins = true
config.AllowOrigins = []string{“http://localh

元記事を表示

Go言語~リフレクション活用事例~

こんちには!
LIFULLエンジニアの吉永です。

本日は私の普段の業務でメイン言語として利用しているGo言語のリフレクションを活用した実装事例を紹介したいと思います。
※[Go 強化月間](https://qiita.com/official-events/ae80b010f51f7018891a)を開催中らしいので、ビッグウェーブに載ってみました!

リフレクションは結構取り扱いが難しく、自分もあまり積極的に過去の実装で採用したことはなかったので、どんな場面で使う?のイメージが曖昧でした。

この記事では私と同じように、リフレクションの存在は知ってるけど、具体的にどんな場面で使うの?っていう一つの事例として参考になれば幸いです。

## リフレクションとは?

リフレクション自体はGo言語特有の機能ではなく、現在一般的に利用されているプログラミング言語ではほぼ対応している機能となります。

https://ja.wikipedia.org/wiki/%E3%83%AA%E3%83%95%E3%83%AC%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3_(%E

元記事を表示

aws-sdk-goでDynamoDBを取り扱うサンプル

## テーブルのセット
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293481/74ed0553-eae6-f118-79eb-cc2b853ec6cc.png)

この3つの項目で構成する

– userid number
– priolity number
– description string

## PUT

“`go
package main

import (
“fmt”

“github.com/aws/aws-sdk-go/aws”
“github.com/aws/aws-sdk-go/aws/session”
“github.com/aws/aws-sdk-go/service/dynamodb”
)

func main() {
ddb := dynamodb.New(session.New(), aws.NewConfig().WithRegion(“ap-northeast-1”))

param1 := &dynamodb.PutIte

元記事を表示

Goでレイアウトを読み込んでいるが白いページになる

# はじめに

この記事は2022年月7にまとめていた「細かいつまずいたことをメモしておく(7月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 問題

Udemyの講座でGoのレイアウトを読み込む設定をしていたがなぜか読み込めなかった
コードは正しそうだった

# 解決方法

これはコードコピーでゼロ幅スペースが入っていることが原因だった
VSCodeの拡張機能`Gremlins tracker for Visual Studio Code`をいれるとゼロ幅スペースが視覚的にわかりやすくなり、消したところ問題なく動くようになった

元記事を表示

go.modを使わずに自作パッケージを読み込む

# はじめに

この記事は2022年月7にまとめていた「細かいつまずいたことをメモしておく(7月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 問題

`go.mod`を利用することで自作したパッケージを読み込むことができていた

“`
import go-pkg/sample
“`

これを

“`
import sample
“`

のようにインポートしたかった

# 解決方法

Dockerfileに以下の環境変数を追加したら読み込むことができた

“`Dockerfile
ENV GO111MODULE off
“`

そしてGOPATH/srcいかのパスを指定した

それと地味にはまったのが
`/go/src/app/hello`の場合`import app/hello`と指定することだった

# 参考

https://teratail.com/questions/375192

元記事を表示

goのパッケージインストールでgetとinstallがあるがどう違うか

# はじめに

この記事は2022年月7にまとめていた「細かいつまずいたことをメモしておく(7月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 問題

Goには`go get`を使ってインストールするものと`go install`を使っていインストールするものがあったり、
`go get`はなるべく`go install`に変えたほうがいいという記事をみかけたりよくわからなかった

# わかったこと

自分で調べた感じでは以下の認識
間違っている場合は教えていただきたいです

`get`でいれると`$GOPATH/pkg/mod/`にパッケージが入り
`install`なら`/go/.bin`にはいる
`go get`は`go.mod`が必要になる

airのように`air -c`で実行するものは`install`でいれる
またパッケージによっては`install`に対応していない

ここまでが初心者としての違いの認識でした

元記事を表示

VSCodeのRemoteContainerのGo拡張機能に必要なライブラリをインストールする

# はじめに

この記事は2022年月7にまとめていた「細かいつまずいたことをメモしておく(7月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 問題

VSCodeのRemoteContainerでGoコンテナの中に入って拡張機能をインストールすると、`gopls`など依存するライブラリを入れる必要があり、推奨されたインストールを何回か実行してインストール待ちが発生してしまうので、コンテナに必要なものを入れておいて、RemoteContainerではGo拡張だけをインストールするようにしたかったです

# 解決方法

以下をDockerfileに加えた

“`Dockerfile:Dockerfile
RUN go install golang.org/x/tools/gopls@latest
RUN go install github.com/ramya-rao-a/go-outline@latest
RUN go mod tidy
“`

元記事を表示

MySQLでsql: Scan error on column index 1, name “created_at”: unsupported Scan, storing driver.Value type []uint8 into type *time.Time

# はじめに

この記事は2022年月7にまとめていた「細かいつまずいたことをメモしておく(7月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 問題

GoでMySQLを利用してレコード取得をしようとすると以下のエラーが発生しました

“`
sql: Scan error on column index 1, name “created_at”: unsupported Scan, storing driver.Value type []uint8 into type *time.Time
“`

# 解決方法

DBの接続の語尾に`?parseTime=true`をつけたら成功しました

“`go:main.go
var connect = fmt.Sprintf(“%s:%s@%s/%s?parseTime=true”, “root”, “password”, “tcp(db:3306)”, “myapp”)
“`

# 参考

https://budougumi0617.github.io/2019/03/31/go_d

元記事を表示

VSCodeのGoの拡張機能でエラーがでる (DockerでGoをやるうえでの注意)

# はじめに

この記事は2022年月7にまとめていた「細かいつまずいたことをメモしておく(7月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 問題

VSCode+WSL2+Docker+Goの環境でGOの拡張機能をいれたところ、起動時にVSCodeの左下に以下のエラーがでるようになりました

“`
failed to find the “go” binary in either goroot()….
“`

# 解決方法

これはローカルにGOをインストールすることで解決できました

https://blog.nya-n.net/posts/post-1853/

https://qiita.com/sola-msr/items/93fbf9c988ee81a2f196

またインストールしたところ以下のエラーに変わりました

“`
the “gopls” command is not available. run “go install -v golang.org/x/tools/gopls@latest” to in

元記事を表示

OTHERカテゴリの最新記事