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

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

Golangにおけるgormを利用したDB接続の方法

# 概要

私は個人的にGoを学習しています。

その中でデータベースとやりとりするのに`gorm`というORMを知りました。

なので今日は`gorm`を利用した**データベースとの接続方法**について書き残したいと思います。

# 環境

今回はDockerComposeを使用して実践していきます。

まず下記のようなDockerfileを使用します。

“`Dockerfile
FROM golang:1.20-alpine3.16
ENV ROOT /app
WORKDIR ${ROOT}
RUN apk update && apk add –no-cache git
COPY go.mod go.sum ./
RUN go mod download
COPY
EXPOSE 8080
CMD[“go”, “run”, “main.go”]
“`

本番環境で利用する場合、マルチステージビルトを採用して

ビルドステージと本番用ステージを記載した方がいいと思いますが今回はスコープ外とします。

“`docker-compose.yml
version: ‘3.8’
ser

元記事を表示

GoLandにPlantUMLを導入する

## PlanutUMLとは
PlantUMLはオープンソースのUML描画ツールです。ドメインモデル図やER図など様々なUMLを書くことができるツールで、コードベースで記述できることが特徴です。もちろん無料。

ずっとPlantUMLを使っていたのですが、最近プロジェクトの関係で少しLucidCartでUMLを作成していました。

ただ、Lucidだと

– ドキュメントをバージョン管理できない(履歴機能はあるけど重すぎて使い物にならない)
– 図の一部を消してしまったり、不注意によるミスが起こりやすい
– 動作が重い

などの問題があり、再びPlantUMLに戻ってきました。笑

最近サブスクで登録したGoLandにもPlantUMLを導入したかったので、その手順を解説していきます。

## 導入手順

それでは早速手順を解説していきます。

まずGoLandを開き、「GoLand」→「Settings…」をクリックします。

さらに「Plugin」をクリックし、検索欄で「PLantUML」と入力すると、下記添付写真のようにPLantUML Integrationというプラグイン

元記事を表示

go.mod、go.sumファイルは何なのか

# 概要

個人的にGolangを学習している中で`go.mod`ファイルと`go.sum`ファイルについて自分なりに調査をしてみたので備忘録として書き残します。

# 環境

今回はGoのバージョン`1.20`を想定してます。

# go.modとは

`go.mod`ファイルは使用されるモジュールの依存関係を管理するファイルです。

プロジェクトを新規で始める際に`go mod init <モジュールパス>`を実行すると作成されるファイルです

例えば、`go mod init sample/app` と入力すると下記のような`go.mod` ファイルが生成されます。

“`go.mod
module sample/app

go 1.20
“`

今後モジュールを`go mod tidy`などでインストールする場合はここに記載されていきます。

試しにGinをインストールしてみましょう。

“`go.mod
module github.com/soicchi/chatapp_backend

go 1.20

require github.com/gin-gonic/gin

元記事を表示

Goで辞書型配列の値の長さでソートする

## やりたいこと

`map[string]string`な配列で、値の長さでソートしたい。

[この記事](https://zenn.dev/sinozu/articles/c02cecbab039795d071a)によるとGolangのmapは明確な順序を持たないので、値の長さでソートしたキーを配列として取得することにする。

## どうやったか

mapのままソートする方法がわからなかったので、一度構造体に落とし込んだ後にsortする。

非常に冗長で汚いので、もっとわかりやすく明確でスマートな方法があったら教えてほしいです。

## コード

“`golang
package main

import (
“sort”
“fmt”
)

var FoodList = map[string]string{
“Menu1”: “Orange”,
“Menu2”: “Banana”,
“Menu3”: “Apple”,
“SpecialMenu”: “YakisobaCake”,
}

func SortWithValueLen(baseMap map[string]

元記事を表示

GolangでDIを実現する方法【サンプルコードあり】

## はじめに
普段はLaravelを使っているのですが、業務外でGo言語の学習を始め、現在アウトプットとしてオニオンアーキテクチャーでREST APIを実装しています。ただ、Go言語でDIを実現する方法が分からなかったので、今回調べてみた結果を記事にします。

この機会にそもそもDIとは?という部分も合わせて解説しているのでご覧いただけると嬉しいです。

## 対象読者
– DIって言葉はよく聞けけどあまりよく分かっていない方
– DIとDIコンテナの違いが分からない方
– Go言語でDIを実現する方法が知りたい方
– PHPからGo言語に乗り換え、オニオンアーキテクチャで設計しようとしている方

## そもそもDIとは

### DIの定義
まずはDIとは何か?ということについて触れていきます。[Wikipedia](https://ja.wikipedia.org/wiki/%E4%BE%9D%E5%AD%98%E6%80%A7%E3%81%AE%E6%B3%A8%E5%85%A5)によると、

>依存性の注入(いぞんせいのちゅうにゅう、英: Dependency injecti

元記事を表示

あれ?protocしたけど、メッセージ定義しか生成されてないぞ?って時に読んでほしい記事

この記事は筆者の`.proto` ファイルからのgolangコード生成時の失敗談を元に理解を深めていただく記事です。
(そんなん読めばわかるだろ!って話だったのですが、大目に見てください)

# protocの公式サンプル

https://grpc.io/docs/languages/go/quickstart/#regenerate-grpc-code

上記記事のサンプルでは、`.proto` ファイルからGo言語へのコード生成をする際に

“`
$ protoc –go_out=. –go_opt=paths=source_relative \
–go-grpc_out=. –go-grpc_opt=paths=source_relative \
helloworld/helloworld.proto
““

としています。

# とりあえず生成してみる

上記の記事を見た私は、オプションいっぱいでわからないので、とりあえず最小限で実行してみよう!と思い

“`
$ protoc –go_out=.
““
と実行してみました。すると、he

元記事を表示

Clarity Designを使ったWebシステムを作ってみる フロントエンド編

# 概要
「Clarity Designを使ったWebシステムを作ってみる」のフロントエンド編になります。
フロントエンド編ではClarityDesignを使ったAngularのフロントを実装していきます。

1. [準備編](https://qiita.com/strawberryjam/items/0b7afa1a53912ea08a96)
1. [バックエンド編](https://qiita.com/strawberryjam/items/6aad8155205a6c5531e9)
1. フロントエンド編(本記事)
1. デプロイ編

## 本記事の対象
– Clarity Designを使ってみたい方
– Angularで簡易的なアプリを作ってみたい方
– 本シリーズの続きを読んでくださっている方

## 本記事での作成物
本記事での作成物は以下gihubに上げております。
いくつか本記事上では割愛をしている部分もあるため、必要な場合はご参照ください。

https://github.com/murajo/DemoSurvey

# フロントエンド構成
## 画面構成
| #

元記事を表示

Clarity Designを使ったWebシステムを作ってみる バックエンド編

# 概要
「Clarity Designを使ったWebシステムを作ってみる」のバックエンド編になります。
バックエンド編ではGoのechoフレームワークを使ったREST APIを作成していきます。

1. [準備編](https://qiita.com/strawberryjam/items/0b7afa1a53912ea08a96)
1. バックエンド編(本記事)
1. フロントエンド編
1. デプロイ編

## 本記事の対象
– go言語でCRUD操作を行いたい方
– echoフレームワークでREST APIを行いたい方
– 本シリーズの続きで読んでくださっている方

## 本記事での作成物
本記事での作成物は以下gihubに上げております。
いくつか本記事上では割愛をしている部分もあるため、必要な場合はご参照ください。

https://github.com/murajo/DemoSurveyApi

# バックエンド構成
## DB構成
詳細なカラムは準備編を参照いただけたらと思いますが、以下3つのテーブルを対象としております。
– surveys
– survey_items

元記事を表示

Clarity Designを使ったWebシステムを作ってみる 準備編

# 概要
VMware社の製品のほぼ全てに使われているClarity Designというものを使った簡易的なWebシステムを作ってみようと思います。
必要スキルのAngularが初めてな部分もあり、Clarity Designを使っていてKubernetesのデモとかで使われるyelbというアプリと似たようなものをまずは目指していこうと思います。
https://github.com/mreferre/yelb

## 本記事の対象
– Clarity Designを使ってみたい方
– 簡単に良い感じの見た目のWebシステムを作成してみたい方

## 進め方
今回は以下の4章立てで進めていこうと思います。
※もしかしたら今後増やすかもしれないです
1. 準備編(本記事)
1. [バックエンド編](https://qiita.com/strawberryjam/items/6aad8155205a6c5531e9)
1. フロントエンド編
1. デプロイ編

本記事ではどんな画面構成にするかやDB構成等をまとめていきます。

## Clarity Designについて
今回主たる目的のC

元記事を表示

Golangでdlvが動作してない件(ブレイクポイントで止まらない件)(忘備録)

# PCの環境
“`
M1 MAC Monterey
Golang 1.17, 1.19
vscode
“`

# 経緯
1. Golangのバージョンを`1.17`から`1.19.3`にあげた
1. go delveのバージョンをvscodeを通じてあげた
1. デバックは動作するが、ブレークポイントでブレークされない

# 対応記録
1. golangバージョンを`1.17`に下げる
→ delveからバージョンが低すぎるとエラーが表示された

1. golangバージョンをbrew, goenv としてダウンロード
→ ブレイクポイントで止まらない

1. [vscode launch.json substitutePathの変更](https://github.com/go-delve/delve/issues/2795)
→ ブレイクポイントで止まらない

1. 現在ダウンロードされている全てのGolangを削除し、[asdf](https://asdf-vm.com/)でGolangを再度ダウンロード、パスを通す
→ ブレイクポイントで止まらない

元記事を表示

Alfred 5 + KeePassXCで爆速でパスワードをコピペする

![demo](https://user-images.githubusercontent.com/4987502/218909942-34f80265-de15-4338-8238-b7cd2d2d6ddf.gif)

この記事はMac環境な方を対象に書かれています。

# はじめに
パスワード管理って面倒。。
WebAuthnが2019年にウェブ標準として承認されてしばらく経ちますが、Webサービスでの認証は未だにパスワード(+多要素認証)が全盛ではないでしょうか。

普段のブラウザにパスワードを記憶させたり、秘密鍵が使える環境ならマシかもしれませんが、サイトによっては自動入力に未対応だったり、あらゆる状況でパスワードフリーな時代はまだまだ来なそうなので、Macユーザな私は長年 *KeePass(XC)* を愛用しています。

今回は、そんなKeePassの運用で感じた課題を拙作のツールで解決する方法を紹介したいと思います。

# KeePassの課題

サービス毎に一定のルールに沿ったパスワードを自動生成したり、ユーザ名やURLをまとめて管理したりと多機能な *KeePass*

元記事を表示

Docker+Go+Airの開発環境がうまく動かないのでゴリ押しした

ある日、Goを含むweb開発環境のDockerイメージを作ろうと思い立ちました。
実際に作成しようとしたのはnode.jsとGoの両方を含む開発環境なのですが、Goの部分でつまづいたところがあったので解決(したことにする)案を共有します。

想定する流れは以下の通りです。

1. Dockerイメージを起動
2. VS Codeでファイルを編集(Dockerコンテナの外側)
3. Dockerコンテナ内側のAirでホットリロード

DockerもGoのセットアップも慣れているので、組み合わせるだけですぐできるだろうと思っていました。

# つまづいたところ
Airがホットリロードしません。

`docker exec`を使用して内側から`echo “” >> main.go`などの変更を加えるとホットリロードします。
どうやらコンテナの外側からのファイル変更イベントがうまく走ってないようです。

# 環境
現象を確認したのは以下の環境です。
Macを使っている方やGo公式イメージを使用されている方の中にはAirがうまく動作している方もいるようなので、筆者の環境がよくない説はあります。

元記事を表示

クラス図とGoコード

# きっかけ
DDD関連の書籍を見てるとクラス図が頻繁に出てくるのだが、**「クラス間の関係を示す矢印だったり線の意味を知らなすぎ」** で理解の妨げになってる。
あと、基本的にJavaでサンプルコードが書いてあることが多いのだが、実務で使ってる **「Goだとそれぞれの関係についてどう実装すべきなのかイメージができてない」**。

このままじゃ勉強もはかどらんし実務に落とし込むのも難しいしということで、情報収集して自分の中で一回整理してみようと決意。

# クラス間の関係を表す線の意味を整理

線|名前|意味
—|—|—
——-▷|実現|「インターフェースと実装」の関係。「実装——-▷インターフェース」というように表す
───▷|汎化|「子クラス-親クラスの関係」。「子クラス───▷親クラス」というように表す。
——->|依存|クラス間にそこまで強い関係はないものの、一方のクラスを変更した際にもう一方のクラスも変更の必要が生じること
───>|関連|参照関係を示す。クラスAはクラスBを参照し、クラスBからはクラスAを参照できない状態のとき、「クラス

元記事を表示

GolandのWSL環境利用によるデバッグ

**やりたいこと**
WindowsにインストールされているGoland(jetbrains製IDE)でWSL環境を利用してデバッグする。
⇒Linux環境でないと動かない場合に便利

**Windows環境でテスト**
都合によりWindows環境では失敗…
![222.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3114591/c761f24c-5e81-8293-cd1d-61b6bde9eae4.png)

**WSL2(ubuntu20.04)環境でテスト**
「実行構成の編集」選択
![111.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3114591/dcedc79e-c77f-dd9d-aa14-c278c735d685.png)

実行場所:「WSL」選択
![333-be.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com

元記事を表示

ハンズオン Linuxのしくみ

Linuxから目を背け続けていたのですが、お仕事で必要になったってしまったので、
うさぎのアイコンの方が著者の ”Linuxのしくみ” を試して理解しようと思います。

https://twitter.com/satoru_takeuchi/status/1624193443693211648?s=20&t=v7o_tJA7ljKYxCSjD-cjnQ

# 環境
作業用のメインPCのTeratermから、ミニPCのUbuntuにアクセスします。
・ミニPC: 8GB DDR, 128G SSD, Intel N5095
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/b74b80f4-2ae8-74cb-7f56-d8006a347444.png)

詳細手順は下記。
https://qiita.com/nekokane/items/610294ce18e9

元記事を表示

【競プロ】Goで配列をstringで出力したいとき

## 概要

Goで競プロをしている際、配列を文字列として出力したいときがありました。
e.g.
NG: `[“a”,”b”,”c”]`
OK: `a b c`

## 本題

[yoshi389111](https://qiita.com/yoshi389111) さんからより良い方法を[コメント](https://qiita.com/akima1001/items/aae97136aaf508c1c255#comment-d4ae84b7eea374d9d8e7)にて教えていただきました!

> “`strings.Join()“`を使った方が良いのではないでしょうか?

まさしくそのとおりでした!
Goにもjoinはそりゃあるよね…

https://pkg.go.dev/strings#Join

“`
s := strings.Join(arr, ” “)
“`

Intの配列の場合は以下の方法。
配列のまま文字列として出力後、[]を取り除く。

“`
s := fmt.Sprintf(“%v “, arr)
s = strings.Replace(s, “[“

元記事を表示

Golang初心者向け!mapの基礎から応用

## はじめに

Go言語のMapは、非常に便利なデータ構造であり、多くのアプリケーションに使われることがあります。この記事では、GolangのMapの基礎的な使い方と応用をまとめます。

## Mapの基礎的な使い方

Mapを使うには、最初に `make()` 関数を使って新しいMapを作成する必要があります。新しいMapは以下のように作成できます。

“`
//make(map[key名]value)の型名
intMap := make(map[string]int) //valueがint型
stringMap := make(map[string]string) //valueがstring型

“`

Mapの要素を追加するには、`[key] = value` の形式を使用します。以下のように追加することができます。

“`
m[“foo”] = 10
“`

Mapから値を取得するには、`[key]` の形式を使用します。以下のように取得することができます。

“`
value := m[“foo”]
“`

## Mapのネスト

Mapを使うと、複雑なデー

元記事を表示

【個人開発】LINEでURLを送るとNotionに保存してくれるLINEBot「記事のストックくん」を作りました。

stock_title.png

**「この記事、後で読み返したい!」**
そんなとき、みなさんどうしてますか?

僕ははてぶやTwitter、Podcastをよく使うのですが
「今じっくり読める状態じゃないから、とりあえず保存しておきたい!」みたいなことが結構あります。

いや、ありました。このLINEBotを作るまでは…

今回は **「LINEBot 〇〇くん」第二弾「記事のストックくん」** のご紹介です。

>↓第一弾はこちら
【個人開発】ごみのお知らせをしてくれるLINEBot「ごみのお知らせくん」を作りました。
[https://qiita.com/wallkickers/items/7bf00de66f802503f957](https://qiita.com/wallkickers/items/7

元記事を表示

Go で Azure Storage Blobを扱うときの覚え書き

# Go で Azure Storage Blobを扱うときの覚え書き

azblobに関する、備忘録代わりの記事です。(古い記事やパッケージなどが検索に紛れてきてしまうので)

SDKのリポジトリは以下にあります。執筆時点で v1.0.0 が最新です(ちょうど執筆前にリリースされたようです) 以前のバージョン(v0.5 とか v0.6)を使っている人はアップデートするとよいでしょう。

– https://github.com/Azure/azure-sdk-for-go/tree/main/sdk/storage/azblob#readme
– https://github.com/Azure/azure-sdk-for-go/releases/tag/sdk%2Fstorage%2Fazblob%2Fv1.0.0

パッケージは以下にあります。
– https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob

`azblob`と検索すると、古いバージョンが先にヒットしてしまう場合がありあますが、理

元記事を表示

OpenAIのAPIで自然言語(日本語)を使ってDBに問い合わせるCLIツールを作ってみた

## 概要

ChatGPTで話題になっているOpenAIが提供しているAPIを使って、自然言語(日本語)でデータベースに問い合わせすることができる[CLIツール](https://github.com/dotneet/natuql)を作成してみました。Go言語で実装しています。記事内で使い方と仕組みの説明をします。

https://github.com/dotneet/natuql

## 動機

ChatGPTがデータベースを理解することに驚いたことや、[gpt-index](https://github.com/jerryjliu/gpt_index) の仕組みなどを調べていて、自然言語でのDB問い合わせは比較的簡単に実現できそうで未来的な面白さを感じたので実験的に実装してみました。自然言語を使ってSQLクエリを発行できれば、SQLを書けない人でも柔軟にDBから情報を取得できるようになります。非エンジニアが分析を行うときのハードルを相当下げることができます。おそらく似たものは既に存在するのだと思いますが、ノンガチ勢でもこういったものが簡単に作れる時代になったのは本当に素晴らしい

元記事を表示

OTHERカテゴリの最新記事