Go関連のことを調べてみた

Go関連のことを調べてみた

Intellij IDEAでtypo検出の緑の波線を消す方法

## 症状

![スクリーンショット 2024-06-23 14.26.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3172801/2b43ba70-e7ae-bbd5-4011-3902661687c2.png)

邪魔ですね。

## 対策

Settings(command + ,) → Editor → Inspections → Proofreadingのチェックを外せばオーケーです。

![スクリーンショット 2024-06-23 14.29.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3172801/f0129423-e192-6e8f-be4f-7b3011534982.png)

![スクリーンショット 2024-06-23 14.33.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3172801/

元記事を表示

Cloud Run + Gorm + Cloud SQLで詰まった

## 前提
`Go` + `Echo` + `Gorm`で作成したWebアプリを`Google Cloud Run`にデプロイしました。その際に、`Cloud SQL`との接続に詰まりました。

## 詰まったところ
### DB接続
DBが中々接続できずに公式ドキュメントを読みましたが、
https://cloud.google.com/sql/docs/mysql/samples/cloud-sql-mysql-databasesql-connect-connector?hl=ja
以下の2つのライブラリを用いるものでした。
“`go
import (
“cloud.google.com/go/cloudsqlconn”
“github.com/go-sql-driver/mysql”
)
“`
私の場合には`Gorm`のSQLドライバーを使っていたので、大幅な改修が必要そうなこの方法を回避したかったので調べてみると以下のページに解決方法が載ってました。
https://qiita.com/sky0621/items/d91ffd1faf63dbf34e77
g

元記事を表示

missing go.sum entry for module providing package github.com/golang/protobuf/proto (imported by github.com/gin-gonic/gin/binding); to add: の解決

# エラー内容

C:\Users\user\go\pkg\mod\github.com\gin-gonic\gin@v1.7.7\binding\protobuf.go:11:2: missing go.sum entry for module providing package github.com/golang/protobuf/proto (imported by github.com/gin-gonic/gin/binding); to add:
go get github.com/gin-gonic/gin/binding@v1.7.7
C:\Users\user\go\pkg\mod\github.com\gin-gonic\gin@v1.7.7\binding\yaml.go:12:2: missing go.sum entry for module providing package gopkg.in/yaml.v2 (imported by github.com/gin-gonic/gin/binding); to add:
go get github.com/gi

元記事を表示

【Go】ビルドタグgo:buildの使い方

# ビルドタグとは

ビルドタグとは、Goファイルの先頭にある特別なコメント。ビルドタグの後には1行の空行が入る。*Build Constraints* とも呼ばれる。ちなみに、`//`と`go`の間にスペースを入れると普通のコメントとみなされる。

“`go
//go:build foo

package hoge
“`

:::note
Go1.17以前では `//go:build` ではなく、 `//+build`が使えわれていました。
:::

## なんのためにビルドタグを使うのか

– [ビルドタグとは](#ビルドタグとは)
– [なんのためにビルドタグを使うのか](#なんのためにビルドタグを使うのか)
– [ビルドオプションの指定](#ビルドオプションの指定)
– [テストの分類](#テストの分類)
– [参考文献](#参考文献)

以下のようにすると、cgoが有効な場合にのみソースファイルを含む。

“`go
//go:build cgo
“`

## ビルドオプションの指定

例えば、以下のように **windows** を指定すると、window

元記事を表示

Goのbuildtinをサクッとリードしてみる。

builtin.goはGolangのリポジトリの`src/builtin/builtin.go`に書かれている。

このファイルにはGoで使われる定数、type、関数が定義されている。

当たり前に使っている定数や関数がどのように定義されているかをいくつか見てみましょう。

## bool

Goにおけるbool型は`true`と`false`の2つの値を持つ。

それぞれは`true`と`false`という定数で定義されている。

“`go
const (
true = 0 == 0 // Untyped bool
false = 0 != 0 // Untyped bool
)
“`

(VSCodeのGoの拡張機能で`true`と`false`にホバーするとこの定義に飛べて、初めて見たときは驚いた)

## make

makeは以下のように定義されている。

“`go
func make(t Type, size …IntegerType) Type
“`

makeはslice、map、channelに対しするメモリの確保を行う。

Ty

元記事を表示

golangci-lint(gci)を使ってGoコードをチェックしよう

### はじめに

Go言語の静的解析ツールであるgolangci-lint(gci)は、コードの品質を向上させるために役立ちます。この記事では、gciの基本的な使い方と、実際のコード例を通じてどのように役立つかを紹介します。

### gciのインストール

まずは、gciをインストールします。Windowsでのインストール方法は以下の通りです。

1. **Chocolateyを使用してインストールする方法**:

管理者権限を持つ PowerShell で以下のコマンドを実行します。

“`powershell
powershellコードをコピーする
choco install golangci-lint
“`

インストールが完了したら、次のステップに進みます。

### gciの基本的な使い方

1. **コードの静的解析**:

gciを使ってコードの静的解析を行います。

“`powershell
powershellコードをコピーする

元記事を表示

Goのクリーンアーキテクチャ振り返り

# はじめに
こんにちは!

2012年にGoがリリースされてから、2024年時点で12年。
基礎となるクリーンアーキテクチャについて、簡単に振り返ってみます。

### 1. なぜクリーンアーキテクチャが必要なの?

これを疑問に感じた方は、少なくないはず。

構造をそこまで意識する必要があるのか?

比較的小規模なプロダクトであれば、そんなに意識しなくてもいいと思います。
マイクロサービスとして活用している場合など、なおさら感じるのではないでしょうか。

しかし、比較的大規模なサービスなどで機能が増えて大きくなっていくと、変更が難しく、新しい機能を追加するのも大変になってきますね。

そこで登場するのが「クリーンアーキテクチャ」です。

クリーンアーキテクチャは、プログラムを役割ごとに整理することで、

* **変更に強くなる**
* **テストしやすくなる**
* **チーム開発がスムーズになる**

などのメリットがあります。

機能が増えていく前提で考えると、分かりやすいかもしれませんね。

### 2. 玉ねぎ🧅で理解するクリーンアーキテクチャ

クリーンアーキテクチャは、

元記事を表示

GoのNamed Return Valueとそのうまい使い方

Goには関数/メソッドを定義する時に返り値を名前をつけて関数の内部で初期化することなく変数を作ることができる仕組みがある。

これをNamed Return Valueと言う。

本記事ではNamed Return Valueのメリットデメリットと使い所を解説していく。

## Named Return Value

こちらにかかれている。

https://go.dev/doc/effective_go#named-results

参考のコードは以下のようになる。

“`go
func sampleNamedReturnValue() (value int) {
value = 2
return
}
“`

この返り値valueはint型で扱われ、ゼロ値(intでは0)で初期化される。

また関数内ではreturnだけ書くことでvalueにセットされている変数を返すことができる。

### メリット

個人的には2つあると考えている。

– 命名から返り値が何かが予測しやすい
– 少し短く書ける

まず命名については言うまでもなく、返す値がどのような役目をするの

元記事を表示

【Go】スライスはちゃんと理解しておかないと危険だよという話

# はじめに
どうもODです。
転職でWEBバックエンド開発を始めて約3ヶ月、これまで存在や概念だけは知っていたような技術のオンパレードでドタバタしております。
今回は業務でもよく登場するスライスのことについてお話ししようと思います。

# スライスとは
まずGo言語には`配列`と`スライス`の2つがあります。
どちらとも同じ型の複数の要素をまとめるためのものですが、
* 配列(array):固定長
* スライス(slice):可変長

と言う違いがあります(とんでもなくざっくりした説明ですが…)
私は処理の中で要素数が固定であれば配列を、変わりそうであればスライスを使う、といった具合に使い分けをしております。

# スライスの定義
Goにおけるスライスの定義は下記の通りになっています。
“`Go
type slice struct {
array unsafe.Pointer
len int
cap int
}
“`
https://go.dev/src/runtime/slice.go
つまり、スライスは内部的に配列(基底配列)を参照するもの、ということです。

元記事を表示

[Go] 自分専用のAIチャットボットサイト

# はじめに
皆さん、こんにちは!
AIチャットボット、どんどん進化してますね。
今回は、Go言語を使って、自分だけのAIチャットボットを作成・管理できるWebアプリを作ってみました。

# 完成イメージ
最初に完成イメージを載せてた方が分かりやすいですよね。
(今度からそうしよう)

# 要件
– 役割を設定したAIを複数作ることができる
– 入力欄にプロンプトを入力して「Run」ボタンをクリックすると、AIが回答を生成する
– 履歴は画面中央に表示され、スクロールする

# 技術スタック
– Go: 軽量かつ高速なプログラミング言語
– Gin: GoのWebアプリケーションフレームワーク / 今回はテンプレートを使います
– Tailwind CSS: utilityファーストなCSSフレームワーク
– Op

元記事を表示

GoでRedisを使ったときの基本の備忘録

本記事は業務で利用したGoとRedisを使ったときの備忘録です。

AWSのElaticacheを使い、GoのRedisクライアントは`github.com/go-redis/redis/v8`を使うのが一般的のようだったのでその使い方をまとめる。

(Get、Setの基本のみ書くため、詳細は公式ドキュメントを参照してください)

## GoでRedisを使う

大まかな流れは

1. Redisクライアントを作成
1. Redisの操作

という超シンプルな流れです。

### Redisクライアントを作成

go-redis/redisのクライアントを作成するには、`NewClient`を使います。

“`go
import (
“context”
“fmt”
“github.com/go-redis/redis/v8”
)

func NewRedisClient() *redis.Client {
rdb := redis.NewClient(&redis.Options{
Addr: “localhost:6379”,

元記事を表示

オウム返しするLINE BotをGoで実装する(LINE Messaging API・Webhook)

LINE Messaging APIのGoの公式SDKを使って超簡単に実装する。
https://github.com/line/line-bot-sdk-go

Goの環境構築、プロジェクト作成までは割愛。

“`go:main.go
package main

import (
“log”
“net/http”
“os”

“github.com/joho/godotenv”
“github.com/line/line-bot-sdk-go/linebot”
)

func main() {
// .envファイルを読み込む
err := godotenv.Load()
if err != nil {
log.Fatal(“Error loading .env file”)
}

bot, err := linebot.New(
os.Getenv(“LINE_CHANNEL_SECRET”),
os.Getenv(“LINE_CHANNEL_TOKEN”),
)
if err != nil {
log.Fatal(err)
}

ht

元記事を表示

インターフェースについてめっちゃ感覚的にまとめる ~最後にGoの例もあるよ~

プログラミングを学習する、実装をしているとよく聞くインターフェースという言葉があり、筆者は最初あまりピンと来なかったので、ここでインターフェースについてまとめてみます。

インターフェースとは境界、表面、といった意味があり、プログラミングの世界では、クラスやメソッドの仕様を定義するためのものとして使われます。

本記事では体系的に解説するのではなく感覚的にまとめることを目指します。

## 身近なものに例えてみる

いきなりプログラムの世界のinterfaceを説明するのは難しいので、身近なものに例えてみます。

### 自動販売機

例えば自動販売機は人間がお金を入れて、ボタンを押すと商品が出てくる動きをします。

購入の対象が飲み物でもお菓子でも、自動販売機は同じようにお金を受け取り、商品を出すという動きをします。

これをインターフェースという考え方で表現すると、「お金を受け取りボタンを押す」と「商品を出す」という動きを期待していると考えることができます。

利用する我々からすると、お金を入れてボタンを押すという動きをするだけで、商品が出てくるという動きを期待しているので、その動

元記事を表示

Ginを使ってAPIサーバーを立ち上げてみよう

# Gin って?

GinはGo言語でウェブAPIを作成するためのフレームワークです。
簡単にかけるのにパフォーマンスも良い!
そんな理由で人気のあるフレームワークです。

# 使い方

俯瞰して見られるように全体のコードを乗せておきます。
サッと流し見をしてから、詳細を見ていきましょう。

“`Go
package main

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

type User struct {
ID int `json:”id”`
Name string `json:”name”`
}

var users []User

func main() {
server := gin.Default()

server.GET(“/score”, getUsers) // GetのAPIを登録
server.POST(“/score”, addScores) // PostのAPIを登録

err := server.Run(“:8080”)
if err != nil

元記事を表示

GORMのトランザクションについて

## はじめに
GORMでDB操作していて、トランザクションをやりたかったので調べたときの備忘録です。細かいとこ間違っていたらすみません。

## トランザクションとは
データベースへの複数操作(レコードの読み書きなどの複数SQL文)を1つのステップにまとめるための仕組み。
トランザクションを開始し、レコードを書き換え、処理後にコミットするという流れで行われる。トランザクションに関わるデータはコミットするまでロックされる。
### トランザクションの特性
4つの特性があり、頭文字をつなげてACIDと呼ばれる。
1. 原子性(Atomicity)
トランザクション内で行われる処理はすべて成功するか、すべて失敗するかのどちらかになる。
処理の途中で失敗した場合、それ以前の成功は無かったことになり、すべて失敗したものとして一連の処理が終了する。
2. 一貫性(Consistency)
トランザクションの前後で、データベースの整合性や制約など、正常な状態が失われないことを保証する。
3. 分離性(Isolation)
並行して実行される複数のトランザクションは、お互いに干渉せずに実行でき、あた

元記事を表示

【Go】Goのプロジェクトの雛形を作れるCLIツール「go-blueprint」を使ってみる

# はじめに
こんにちは、kenです。お仕事ではGoをよく書いています。

最近毎日GitHubのトレンドを見るようにしているのですが、先日いつものようにトレンドをチェックしていたら何やら面白そうなリポジトリを見つけたので今日はそれについて紹介しようと思います。
その名も「**[go-blueprint](https://github.com/Melkeydev/go-blueprint)**」です。

https://x.com/ken_hassy/status/1796521428273233998

# go-blueprintとは

> Go Blueprint is a CLI tool that allows users to spin up a Go project with the corresponding structure seamlessly. It also gives the option to integrate with one of the more popular Go frameworks (and the list is growing wit

元記事を表示

oapi-codegenを使ってGoのコード自動生成とAPIサーバーの起動までやってみた

# はじめに

コードの自動生成をすると、手軽にAPIサーバの起動をすることができました。
備忘録も兼ねて手順を紹介したいと思います。

oapi-codegenのインストール法は別の記事にまとめているので、[OpenAPIのyamlファイルとoapi-codegenでGoの自動生成をやってみた](https://qiita.com/SBS_Takumi/items/8bcf5cb957b06b1633d5)を参照してください。

[コード全体像Githubリポジトリ](https://github.com/IamSBStakumi/Go_Sample_Server/tree/Qiita-Sample)

# やったこと

## yamlファイルの作成
Goおよびoapi-codegenのインストールが終わっているならば、yamlファイルを作成します。
これが仕様書の代わりにもなります。

作成したyamlファイル

“`openapi.yaml
openapi: “3.0.3”
info:
version: 0.

元記事を表示

[Go] 画像生成サイトをGoで構築してみた

### はじめに

この記事では、ホラーテイストの画像を生成するサイトをGo言語とHTMLで構築する方法を紹介します。
ユーザーがテキストを入力すると、その内容に基づいてホラー映画ポスター風の画像を生成し、レスポンスとして返します。

[[Swift] ホラー画像生成アプリ]() のGo言語版です。

### 要件

– バックエンドはGo言語
– OpenAI APIを使う
– プロンプトを入力すると、ホラー画像を生成する

### 準備

#### 環境構築

Go言語の開発環境は、公式サイトをご確認ください。

– [Go言語公式サイト](https://go.dev/)

#### ライブラリのインストール

以下のライブラリをインストールします。

– `gin-gonic/gin`: Webフレームワーク
– `nfnt/resize`: 画像リサイズ用ライブラリ

※実行時にエラーが出たら、該当するライブラリをインストールしてください。

### ディレクトリ構成

“`
horror-image-generator/
├── main.go
└── index.htm

元記事を表示

go-vcrでレスポンスを加工してからカセットに記録する

# TL; DR

– `*recorder.AddHook` でカセットを加工する関数を登録
– https://github.com/dnaeon/go-vcr/tree/v3?tab=readme-ov-file#hooks

# はじめに

go-vcrはHTTPリクエストを行う関数のテストに使用するライブラリです。

https://github.com/dnaeon/go-vcr

初回テストでは実際にAPIリクエストを発生させ、リクエスト、レスポンスの組み合わせをカセット(実体はyamlファイル)に保存します。
2回目以降はクライアントがカセットをもとにレスポンスを返すため、実際にはリクエストが発生しません[^cassette]。

これにより、
– 実際のAPIリクエスト、レスポンスでテストできる
– リクエストを発生させずにテストできる

を両立することができます。

テスト実行時に対象サーバーへの疎通性やリクエスト負荷等を気にする必要はありません。また、冪等性のないリクエストが含まれていても繰り返し実行可能です。

# レスポンスの加工

ところで、テストで

元記事を表示

printlnとfmt.Printlnの違いが気になったので少し調べた

Goにはbuildinで定義されるprint, println関数がある。

一方でfmtパッケージにもPrint, Println関数がある。

Goを学ぶとサンプルコードではfmt.Printlnで標準出力に出力することが多いが、print, println関数も使える。

この差について気になったので本記事でまとめる。

## 結論

print, printlnは標準エラー出力に、fmt.Print, fmt.Printlnは標準出力に出力される。

## 標準出力と標準エラー出力

標準出力とは、プログラムの出力を表示するために使われるチャネルのことを指す。

コンピュータのシステムやプログラムの情報の”正常”な出力を表示するために使われ、一般的にはディスプレイに表示される。

例えば`ls`コマンドなどはファイルやディレクトリの一覧情報などを標準出力に出力する。

一方で標準エラー出力は、プログラムのエラー情報を表示するために使われるチャネルのことを指す。

例えば`ls`コマンドで存在しないディレクトリを指定するとエラー情報が標準エラー出力に出力される。

どちらも出力先

元記事を表示

OTHERカテゴリの最新記事