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

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

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`コマンドで存在しないディレクトリを指定するとエラー情報が標準エラー出力に出力される。

どちらも出力先

元記事を表示

go-rodでmoodleの出席登録を自動化

九大では講義時間内にmoodleの講義ページにログインすることで出席登録が行われますが、ユーザ名とパスワードを打ち込む→講義一覧から現在の講義を探す→出席登録という一連の流れが煩雑に感じたのでヘッドレスブラウザで自動化を行いました。
Goを選んだ理由はただ単に触ってみたい言語だったからです。

:::note alert
九大moodleでは出席していないにも関わらずコースにログインして出席とする等の行為は不正出席であり、単位を取り消される場合があります。
自動化プログラムを使用して対面講義の出席登録を行う際は必ず講義に出席し、講義室のedunet(学内LAN)へ接続するようにしてください。
本記事のプログラムを使用したことにより生じたいかなる損害にも筆者は一切責任を負いません。
:::

https://la.kyushu-u.ac.jp/usage-support/attendance/

## 実行環境

– go version go1.22.4 darwin/arm64
– macOS Ventura 13.4

## ディレクトリ構成

“`
auto_attend/

元記事を表示

DynamoDB&Golang Queryまとめ

Queryで使用するdynamodb/api.goに書かれたQueryInputは以下の通りです。

以下に、スペースを全て詰めた表を提供します。

|フィールド名|タイプ|説明|デフォルト値|SQLでの類似概念|
|—|—|—|—|—|
|*ConsistentRead|`*bool`|読み取りの整合性モデルを決定。`true`の場合、強い整合性の読み取りを使用。グローバルセカンダリインデックスではサポートされていない。|`false`|`SELECT` with `FOR UPDATE`|
|ExclusiveStartKey|`map[string]*AttributeValue`|評価を開始する最初のアイテムのプライマリキー。|`nil`|`OFFSET`|
|*ExpressionAttributeNames|`map[string]*string`|式内の属性名の代用トークン。|`nil`|`AS` (エイリアス)|
|*ExpressionAttributeValues|`map[string]*AttributeValue`|式内の属性値の代用トー

元記事を表示

DynamoDB&Golang データ取得/更新/削除/操作まとめ

# PutItem/UpdateItem/DeleteItem/BatchWriteItem/TransactWriteItems

アプリケーションを作成する上で非常によく使用する操作の違いや特徴をまとめてみました。

# 特徴の比較
| 特徴 | GetItem | BatchGetItem | TransactGetItem |
|————————-|————————-|————————-|—————————-|
| **用途** | 単一アイテムの取得 | 複数アイテムの一括取得 | 複数の一貫したアイテム取得 |
| **最大アイテム数** | 1つ | 100個まで | 25個まで

元記事を表示

[VSCode] Goの環境設定。Failed to find the “go” binary in either GOROOT() or PATH(…) を解決する

# 環境
– macOS Sonoma 14.4.1
– Apple M1 Pro
– VSCode:1.90.1
– Go for Visual Studio Code:v0.41.4
– `go1.22.4 darwin/arm64` installed by homebrew
– zsh
#

もともとはJetBraisのGoLandを利用していたんですが、周囲でVSCode派が多く無料で利用できるので乗り換えてみることにしました。
GoのExtensionをインストールしていざ利用と思っていたところ以下のようなエラーダイアログがでて定義ジャンプなどの機能が使えなかったので解消のための設定を記録しておきます
## 遭遇したエラー
“`
Failed to find the “go” binary in either GOROOT() or PATH(…). Check PATH, or Install Go and reload the window. If PATH isn’t what you expected, see https://github.com/

元記事を表示

bufio で string を取ろうとして詰まった話

## RE?
Atcoder で https://atcoder.jp/contests/abc237/tasks/abc237_d を解いていて、
テストケースのうち数ケースのみ RE ( Runtime Error ) になってしまった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817605/735d6903-d2ae-a11b-b4af-f5f74a4ab26f.png)

## 原因
### 自分の実装
bufio の scanner をこんな感じで使っていたのが原因
“`golang
var sc = bufio.NewScanner(os.Stdin)

func main(){
sc.Split(bufio.ScanWords)
s:=scanString()
}

func scanString() (s string) {
sc.Scan()
s = sc.Text()
return
}
“`
### ソースコード

#### 定数

元記事を表示

OTHERカテゴリの最新記事