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

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

google-cloud-go の使ってみた操作まとめ

前から Google Cloud Storage には興味があったのでラーメンの写真を記録するサービスを作るのに使ってみました。機能ごとにもリンクを貼りますが、ひとまず公式ドキュメントとリポジトリは以下になります。

**実行環境**
“`
go: v1.18
cloud.google.com/go/storage: v1.22.0
“`
https://pkg.go.dev/cloud.google.com/go/storage

https://github.com/googleapis/google-cloud-go

※ 全体を通してエラーハンドリングは省略しています。
## 事前準備:クライアントの作成
クライアントの作成に使用するため、事前に GCP のアカウント作成と鍵ファイルをダウンロードしておきます。

今回はダウンロードした鍵ファイルを引数にとり [WithCredentialsFile] を使用します。(https://pkg.go.dev/google.golang.org/api/option#WithCredentialsFile)

“`
// これ

元記事を表示

LeetCodeのRoman to Integer を解いてみた

## LeetCodeを解いた動機
最近転職活動をしているのですが、面接のコーディング試験の出来が良くなくLeetCodeを解くように勧められました。
また個人の課題として開発進捗が遅いことがあって、LeetCodeの答えには擬似プログラミングがあるので合わせて練習したいなと思いました。
## 問題内容
こちら参照
https://leetcode.com/problems/roman-to-integer
## 自分で書いた擬似プログラミング
今回メモを消してしまったため、次回以降記載

## 自分で書いたコード

“`golang.go
func romanToInt(s string) int {
symbolArray := map[string]int{
“I”: 1,
“V”: 5,
“X”: 10,
“L”: 50,
“C”: 100,
“D”: 500,
“M”: 1000,
}
var splitS = strings.Split(s, “,”)
returnInt := 0

isSkip := false
for i, _

元記事を表示

【備忘録】Golangで日付の操作を実施する。

## 日付の操作
“`golang:main.go
package main

import (
“fmt”
“time”
)

func main() {
n := time.Now()

// fmt.Println(n.Format(“2006-01-02 15:04:05”))
year := n.Format(“2006”)
month := n.Format(“2006-01”)
day := n.Format(“2006-01-02”)
hour := n.Format(“2006-01-02 15”)
min := n.Format(“2006-01-02 15:04”)
sec := n.Format(“2006-01-02 15:04:05”)
fmt.Println(“year: “, year)
fmt.Println(“month: “, month)
fmt.Println(“day: “, day)
fmt.Println(“hour: “, hour)
fmt.Println(“min: “, min)
fmt.Prin

元記事を表示

GoでCRUD処理のREST APIを作ろう〜Reactを添えて〜

# はじめに
– 参考文献にも掲載しています以下記事を自分の勉強用にアレンジしてまとめ直したものになります。こちらの記事の方がハイレベルな実装になっていますが、もう少し簡素化してGoでAPIを作る大枠を理解したいと思ったのが執筆の動機です。そのためフロント側は簡単な説明のみです。ご了承ください。

https://dev.classmethod.jp/articles/go-sample-rest-api/

– バックエンド側はDockerを使用していますが、環境構築方法について本稿では触れません。こちらは以下記事をちょろっとカスタムして作っています。

https://zenn.dev/ajapa/articles/443c396a2c5dd1

– 網羅的な説明はしていないので、まずリポジトリをざっと見て処理の流れを追ってもらった上で読み進めていただいた方が読みやすいと思います。README.mdにも起動方法を記載しております。**“`masterブランチ“`は記事よりも手を加えてしまっているので、“`for_qiitaブランチ“`を参照ください。**

https://

元記事を表示

自分の得意なプログラミング言語でSymbolブロックチェーンを動かす方法

Symbolブロックチェーンはプログラミング言語を問わずスマートコントラクトが実装できるように設計されています。ところが、現在リリースされているsdkアルファ版はJavascriptとPythonのみサポートです。では、他の言語ではまだアプリ開発できないのでしょうか?と言われればそうでもありません。

**組み込みされたデジタル装置で署名**したかったり、**マルチシグ化した連署者アカウントの署名をサーバ側で機械的に実施**したり、**IoTなどほぼ単一のトランザクションを定期的に実施**したり、複雑なことは必要ないユースケースが実はたくさん眠っているかもしれません。

ここでは、そういった「あとはSymbolブロックチェーンにトランザクション投げるだけなんだが」といった方を対象にトランザクションの作り方を解説します。
なお、トランザクションの送信以外(例えばモザイクの生成やマルチシグの組成など)はウォレットなどを利用して準備する前提で進めます。

後記:
Symbol/NEMのコアチームからのSDKについての考え方を転載しておきます。
> 私たちは、コミュニティが(SDKではなく)直

元記事を表示

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のエラー

“`sh
curl: (7) Failed to connect to 127.0.0.1 port 3307: Connection refused
“`

* protoc実行環境を自前で整備しようとしているjob

“`yml
– name: Set up protoc
run: |
sudo apt-get update && sudo apt-get upgrade -y
sudo apt-get install -y c

元記事を表示

【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におけるドメインとは、ソフトウェアによって解決したい

元記事を表示

OTHERカテゴリの最新記事