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

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

Golangでform dataから受け取った画像をS3にアップロード

# はじめに
GolangでAPIサーバーを構築しており、APIで受け取った画像データをS3にアップロードする処理を実装したので、方法を共有しようと思います。初心者Golangerなので受け取った画像をリサイズなどせずにそのままアップロードする方法しかわからなかったので、その点は悪しからず。むしろ方法をご教示いただきたい所存。。。S3以外の処理は省略します。

# 完成コード
“`golang:s3Handler.go
func (app *Application) imageUpload(w http.ResponseWriter, r *http.Request) {
err := godotenv.Load(fmt.Sprintf(“./%s.env”, os.Getenv(“GO_ENV”)))
if err != nil {
log.Fatalln(err)
}
ak := os.Getenv(“AWS_ACCESS_KEY”) // .envのAWS_ACCESS_KEY
ask := os.Getenv(“AWS_SECRET_ACCESS

元記事を表示

Go製のORM である Facebook / ent を使ってみたらなかなかイケてた話

# はじめに
Facebookが開発しているGo製のORMであるentを業務で使い始めたので、基本的な構文などをまとめます。

# 導入
– CRUD操作についての確認
https://entgo.io/docs/crud

– validatorの定義方法の確認
https://entgo.io/docs/schema-fields/#validators

– migrationの実行方法及びversioned migrationの調査
https://entgo.io/docs/migrate#auto-migration
https://entgo.io/docs/versioned-migrations#generating-versioned-migration-files
https://entgo.io/docs/versioned-migrations#apply-migrations

– association(entだとedge)の定義方法の確認
https://entgo.io/docs/schema-edges/

# datetimeを更新しようとした

元記事を表示

Github ActionsでGolang & gRPCのテストを実行する

# はじめに
golangとgRPCを用いたapiの自動テストを実行するための設定手順です。

# protoc のセットアップについて

CIコンテナ内で `protoc` コマンドを利用できるようにするためのセットアップをおこなった際に、少しハマりどころがあったので説明をしておきます。

以下の様に自前でprotocの環境構築を行うと、protocコマンド実行環境整備完了後に、なぜかMySQLの`connection refused`エラーが発生した。

* MySQLのエラー
“`
curl: (7) Failed to connect to 127.0.0.1 port 3307: Connection refused
“`

* protoc実行環境を自前で整備しようとしているjob
“`
– name: Set up protoc
run: |
sudo apt-get update && sudo apt-get upgrade -y
sudo apt-get install -y curl gnu

元記事を表示

【Go】VSCodeでGo言語の開発環境を整えてみよう【Golang】【主にWindows・初心者向け】

#### Visual Studio Code(VSCode)でGoによる開発しよう

 クラウドやコンテナ界隈でもよく聞くGo言語。最近入門したので備忘録を兼ねて、このエントリではVSCodeを使ったGo開発環境構築の手順を記してみます。
 以下、主にWindowsを想定していますが他のOSでもそれほど変わりませんので、適宜読み替えてください。

余談ですがGo公式のブログには[Go’s New Brand](https://go.dev/blog/go-brand)記載のカラーや[Go fonts](https://go.dev/blog/go-fonts)記載の公式Goフォントなどもあり、スライド資料作成や画像作成などに使えます。ロゴやマスコットのゴーファー君も透過PNGの画像が用意されていてありがたいです。

#### Go言語のインストール手順

 ネット上でも各所に載っていますが、この記事でもまとめてみます。

https://go.dev/

– 公式サイトの[Downloads](https://go.dev/dl/)ページから、Windws/Mac/Li

元記事を表示

【備忘録】Golangで文字列型(YYYY-MM)から月を取得する

“`go:main.go
package main

import (
“fmt”
“strconv”
)
func main() {
// YYYY-MM形式から月を保存する。
str := “2021-04”
str2 := str[5:]
month, _ := strconv.Atoi(str2)
fmt.Println(“month: “,month)

str = “2021-12”
str2 = str[5:]
month, _ = strconv.Atoi(str2)
fmt.Println(“month: “,month)
}
“`

“`shell:実行結果
~/go/src/array_slice $ go run main.go
month: 4
month: 12
“`

元記事を表示

【備忘録】GolangでMapを利用する。

## GolangでMapを利用する。

“`go:main.go
package main

import “fmt”

func main() {
// ユーザIDと名前のMapを作成する。
userIDToNameMap := map[int]string{123: “tanaka”, 234:”takeru”, 345: “kkfactory”}
fmt.Println(“userIDToNameMap: “,userIDToNameMap)

// Keyに対するValueを取得する。
fmt.Println(“userIDが123の値は”, userIDToNameMap[123])

// 要素を追加する。
userIDToNameMap[456]=”takeshi”
fmt.Println(“userIDToNameMap: “,userIDToNameMap)

// Valueの値を更新する
userIDToNameMap[123]=”kouji”
fmt.Println(“userIDが123の値は”, userIDToNameMap[12

元記事を表示

【備忘録】Golangでスライスを利用する。

## Golangで1次元スライスを利用する

“`golang:main.go
package main

import “fmt”

func main(){
// 1次元スライス
s1 := []int{1, 2, 3}
s2 := []int{5, 6, 7}

// 1次元スライスに要素を追加する。
s1 = append(s1, 4)

fmt.Println(“s1: “,s1)

// 1次元スライスに1次元スライスを追加する。
s1 = append(s1, s2…)

fmt.Println(“s1: “, s1)
}
“`

“`shell:実行結果
~/go/src/array_slice $ go run main.go
s1: [1 2 3 4]
s1: [1 2 3 4 5 6 7]
“`

## Golangで2次元スライスを利用する
“`golang:main.go
package main

import (
“fmt”
)

func main() {
s1 := [][]int{{1

元記事を表示

インターフェースとローカルな構造体

ginのsessionsを見ていた際にこんなのがあったのでメモとして。
外部にはインターフェイスとして公開し内部ではローカルな構造体として定義しそれで処理を行なっている。

“`golang
type Session interface {
MethodA()
MethodB()
}

type session struct {
}

func (s *session) MethodA() {
}

func (s *session) MethodB() {
}
“`

元記事を表示

GOの構造化ロガーlogrusが非推奨になったため代替ロガーZerologを使ってみる

# はじめに

昨今ログ集計用に構造化ログは必要不可欠となっており、logrusとはGO用の構造化ロガーで多くのプロジェクトで使われていました。

しかし現状はメンテナンスモードとなっており、今後新機能は追加される予定はないようです。(※以下原文)

README原文から抜粋
>Logrus is in maintenance-mode. We will not be introducing new features.
This does not mean Logrus is dead. Logrus will continue to be maintained for security, (backwards compatible) bug fixes, and performance (where we are limited by the interface).

https://github.com/sirupsen/logrus

REAEME原文から抜粋
>Logrus would look like those, had it been re-designed with

元記事を表示

【Golang】ビルド/コンパイル時に利用するファイルを、特定の Go バージョンに限定する【下位互換の持たせ方の一案】

go:build で Go バージョン別指定

> Go 言語(以下 Golang)でビルドを実行する際に、**Golang のバージョンによってコンパイル時に含める・利用するファイルを限定したい**。

つまり、`go:build` で特定の OS や `cgo` の有無で利用するファイルを分岐させるように、コンパイル時に利用している Golang バージョン別に分岐させたいのです。

[「golang “go:build” ビルド時 特定のGoバージョンでのみ利用 コンパイル」でググって](https://www.google.com/search?q=golang+%22go%3Abuild%22+%E3%83%93%E3%83%AB%E3%83%89%E6%99%82+%E7%89%B9%E5%AE%9A%E3%81%AEGo%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%81%A7%E3%81%AE%E3%81%BF%E5%88%A9%E7%94%A8+%E3%82%B3%E3%83

元記事を表示

Go の気になったコミット (2022 年 4 月)

[golang/go](https://github.com/golang/go) の master ブランチに行われたコミットから個人的に気になったものをリストにしたものです。

前回作成したリストはこちら。

https://qiita.com/sg0hsmt/items/d74d96095b83f15746de

軽く説明を追加していますが勘違いや誤りがあるかもしれません。

## Topic

## Commits

### 2022-04-01

https://github.com/golang/go/commit/37065847d87df92b5eb246c88ba2085efcf0b331

楕円曲線暗号で使用する P-256 の処理で panic を起こす問題が修正されています。 [^1] [^2]
この修正はバックポートされており Go 1.17.9 および Go 1.18.1 がリリース済みです。

[^1]: https://github.com/golang/go/issues/52075
[^2]: https://github.com/advisorie

元記事を表示

golang インターフェースからコードの自動生成

調べているうちにそもそもVSCodeにこの拡張機能があったのでやめたが、その作業記録として。

# Work
https://github.com/progllama/interface-realize

# .gitignoreの導入
## OS
### macOS
https://github.com/github/gitignore/blob/main/Global/macOS.gitignore

## IDE
### VSCode
https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore

## Language
### Go
https://github.com/github/gitignore/blob/main/Go.gitignore

# VSCodeの設定
## Official
https://code.visualstudio.com/

## spell checker
https://qiita.com/diescake/items/98c5a099e8

元記事を表示

カスタムプロバイダを自作したらTerraformの仕組みをよく理解できた

# はじめに
個人で使うにはAWSお金かかりすぎますよね。格安VPSをお手軽に使えるようにTerraformで管理したいと思い調べたところ、ConoHA VPSとさくらのVPSが対応していると分かりました。でももっと安いVPS、WebARENA Indigoがあり、これをTerraformで何とか使いたいと思い、カスタムプロバイダを自作してみました(作ってみたものの結局、実用的かと言われると怪しい笑)。

# Terraform Custom Provider
Terraformの説明はいまさらなので省略するとして、どうやらカスタムプロバイダが作れるようなので軽く調べてみました。Qiitaにもいくつか記事がありますが、バージョンが古かったりと結局は[公式ドキュメント](https://learn.hashicorp.com/collections/terraform/providers)を参考にしました。

## Terraform plugins
ざっくりまとめると、CRUDに対応したクラウドAPIを呼び出すプラグインを[SDK](https://github.com/hashico

元記事を表示

VSCode devcontainerでGinの開発環境を構築するテンプレートを作りました

# 概要
今回作成したテンプレートを使うと、ローカル環境を汚すことなく、コード補完、静的解析、デバッグ等のGoの開発ツールの恩恵を受けつつGinアプリケーションを開発できる環境を構築できます。
コード内容は以下のリポジトリより確認できます。

https://github.com/rootsuke/gin-devcontainer-template/tree/master

# 構築される環境
* Go 1.18
* Gin
* air
* gopls, staticcheck, dlv等のGo開発ツール

# 動作環境
* Docker
* VSCode
* Remote – Conatainers (VSCodeの拡張機能)

# 使用方法
1. Open Folder in Conatainerをクリック
2. コンテナのビルドが完了したらターミナルを開いて `air` と入力

上記手順が完了すると `localhost:8080` にてサンプルコードのJSONが表示されます。
以降はairがホットリロードを行ってくれますので、変更内容が自動で反映されます。

実際のアプリケー

元記事を表示

DDDの各層について

# はじめに
この記事は正しくは「DDDで採用されることの多いアーキテクチャが持つ層について」です。
#### 対象読者
DDDについて軽く勉強した人
DDDを採用していて、アーキテクチャについて調べ直したくなる時がある人

#### 記事で論じないこと
そもそもDDDとは何か
DI、DIPといったアーキテクチャの話

#### 記事で論じること
DDDで採用されるアーキテクチャの各層について

# 概要
DDD(ドメイン駆動設計)で採用されることが多い、レイヤードアーキテクチャ、クリーンアーキテクチャ、オニオンアーキテクチャ、etc..が持つ**層**について理解を深める

#### 層とは
本記事で指す層とは、プレゼンテーション層、アプリケーション/ユースケース層、ドメイン層、インフラストラクチャ層である

#### 備考
本記事では主にアプリケーション/ユースケース層、ドメイン層について記載
内容の不備/間違いはご指摘ください
Go的な観点で書いています

# ドメイン層
#### 役割
ドメインモデルを表現すること
※DDDにおけるドメインとは、ソフトウェアによって解決したい

元記事を表示

【MySQL】【Go】this user requires mysql native password authentication.

go-sql-driverで`this user requires mysql native password authentication.`エラー

# 結論
my.ini
“`
[mysqld]
default_authentication_plugin=mysql_native_password
“`

# 詳細
このエラーで調べると、 `AllowNativePasswords: true` を設定するように書いているのですが、これだけだと繋がらない場合はmysql側の設定を見直します。
https://qiita.com/ushio_s/items/ab64e7e9222bb5a67a11

# 参考
https://github.com/go-sql-driver/mysql/pull/644/files

元記事を表示

JSON Schema の力で書きやすいオレオレ YAML ファイルを作る

YAML を用いる独自の設定ファイル(いわゆる「オレオレ YAML」)を作る際は、その YAML ファイルのスキーマ (その設定ファイルがどのような key, value を持つべきなのかの情報) を [JSON Schema](https://json-schema.org/) として書いて紐付けを行うと、エディタのサポートが得られて便利、という話をします。

## JSON Schema を用意すると、YAML Language Server が補完等を行ってくれる

YAML ファイルの記述を支援するツールとして、[YAML Language Server](https://github.com/redhat-developer/yaml-language-server)[^1] があり、YAML ファイルのバリデーション、入力の補完や、値の説明などを行ってくれます。

[![](https://raw.githubusercontent.com/redhat-developer/vscode-yaml/main/images/demo.gif)](https://github.

元記事を表示

[golang]list内の重複した値を消す

“`
package main
import “fmt”
func main() {

people := []string{“tanaka”, “sato”, “koike”, “tanaka”, “sato”}

unique := make([]string, 0, len(people))

m := make(map[string]struct{})

for _, v := range people {
if _, ok := m[v]; ok { //重複している際はok(true)となる
fmt.Println(ok)
continue //continueが終わった後再びforループの先頭に戻る
}
unique = append(unique, v)
m[v] = struct{}{} //重複を消す処理

}
fmt.Println(unique) //出力:tanaka sato koike
}
“`

元記事を表示

GoでLambda Function URLs ハンズオン

# はじめに
この記事はGoでLambda Function URLsをハンズオンしてみる内容となっています。
筆者がLambdaでGoを扱うこと自体が初めてだったため備忘録として簡単に環境構築からデプロイまでの手順も載せています。

# 環境
MacBook Air M1

# ハンズオン

ランタイム Go1.xを選択後、
Lambdaの関数の作成画面で詳細設定を開き “関数URLを有効化”をチェックします。
(認証はパブリックな利用を想定してNONEを設定しました。)
![function_urls.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1391445/8b50af02-81e4-6645-cfa6-748df1ee3db9.png)

ランタイム設定のハンドラが`hello`となっているので適当な名前に変更します。
![runtime_setting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1391

元記事を表示

【個人開発】今スーパーで安い食材と関連レシピをラインで探せるボットの友達が1000人超えたのでログを晒していく

以前「[レシピ作家のレシピを検索できるトイアプリがちょいバズったので爆速でLINE Botを作った話](https://qiita.com/kazukinagata/items/e40dd5ecc143532329e8)」という記事で紹介させていただいたラインボットの友達が1,000人を超えていたので、ユーザーの利用状況をログから分析して晒していきます。

![screenshot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1201783/db8c51e1-3700-efc1-1a16-49351d2fa767.png)

※ラインボットやスクレイピングなどの技術的な話は前記事に譲って、本記事では技術については触れません。

## どんなボットなのか

1. イオン、イトーヨーカ堂、西友3社のネットスーパーから、今安くなってる食材を検索できる
2. 食材名から、リュウジさんや山本ゆりさんなど著名な料理研究家さんの関連レシピを探せる

というのが主な機能です。

OTHERカテゴリの最新記事