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

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

ダーツを投げればポインタがわかる!?ポインタ入門【いらすとや図解】

# はじめに
A Tour of Goのポインタで理解に時間がかかったのでイラストやを使って解説してみました。
メモリアドレスといった難しいワードを使わないようにしているので比較的わかりやすいかなと思っております。

https://go-tour-jp.appspot.com/moretypes/1

# 今回の実装コード
以下のコードを解説していきます。
16進数の値は状況に応じて変わる可能性があります。
“`darts.go
package main

import “fmt”

func main() {
blueArrow, redArrow := 42, 2701
blueArrowMap := &blueArrow

// blueArrow: 42
fmt.Println(“blueArrow:”, blueArrow)
// &blueArrow: 0xc000104040
fmt.Println(“&blueArrow:”, &blueArrow)
// redArrow: 2701
fmt.Println(“redArrow:”,

元記事を表示

エナジードリンクから学ぶインターフェース

# はじめに

こんにちは、皆さんエナドリ飲んでますか。

「エナジードリンクなんて、カフェインの塊じゃないか」
「そんなもの毎日飲んでたら身体に悪いぞ」
「依存症になるんじゃないのか?」

大丈夫、私はもうカフェイン依存症です☕️

今日は皆さんに、**カフェイン依存症**と**プログラミング**の意外な関係性についてお話しします。

実はこの2つには驚くほど共通点があります。例えば:

– どちらも「適度に」じゃないと危険
– 一度ハマると抜け出すのが難しい
– 周りから「それ、やりすぎじゃない?」と心配される
– 本人は「まだいける!」と思っている

最後に、

**適切に設計しないと、とんでもないことになる**

「依存」と「設計」の深いい関係に、ダイブしていきましょう。

その前に、エナジードリンク補給してきます。

**カシュウッ!!(缶を開ける音)**

# カフェイン依存症

おk、注入しました😊
本題に入っていきましょう。

まず、私が最初にハマったエナジードリンク、そう、**BlueBull**のことから話します。

BlueBullって知ってます?ほら、あの青いパ

元記事を表示

【Go】psqlコマンドを実行し、テストデータを作成する方法

# はじめに
DBに接続したテストを実行する前に、テストデータを作成したいケースに対応する方法を記事にします

# フォルダ構成
こちらの`repositories`フォルダのテストコードを参照ください
https://github.com/AppDeveloperMLLB/todo_app/tree/main/repositories

`repositories/testdata`にテストで実行するsqlファイルを格納しています
テストでsqlファイルを実行するのは`main_test.go`となります

# 実際のコード
実際のコードは、setupTestDataメソッドを参照してください。
(Githubのコードとは、一部、変えています)
“`go
cmd := exec.Command(
“psql”,
“-h”,
“127.0.0.1”,
“-U”,
“test”,
“-d”,
“todo_db”,
“-f”,
“./testdata/createTable.sql”)
cmd.Env = append(os.Environ(), “P

元記事を表示

フロントエンドエンジニアのためのGo入門:変数と関数をサクッと理解しよう!

# はじめに
Goはシンプルで効率的な言語ですが、TypeScript(Javascript)の経験のあるフロントエンドエンジニアが初めて学ぶ際には、いくつかの独特なポイントで戸惑ったので記事にしました。
フロントエンドエンジニアがGoを学ぶ際につまづきやすい点をわかりやすく解説し、それぞれの言語の比較コードを示します。
この記事はA Tour of GoのBasicsの一部をピックアップしました。

https://go-tour-jp.appspot.com/list

# エクスポートされた名前
Goでは、名前が大文字で始まる場合、その名前はパッケージ外から参照できる「エクスポートされた名前」になります。TypeScriptでも同様にエクスポートの概念がありますが、違いは大文字小文字によってエクスポートが決まる点です。
Goでは、大文字で始まる Name フィールドがパッケージ外から参照可能です。一方で、name のように小文字で始まるフィールドはパッケージ内でしか参照できません。

“`sample.ts
export class User {
constructor(p

元記事を表示

Goのマイグレーションツールであるgooseでdockerのmysqlのマイグレーションをする方法

# はじめに
今回はGo言語の学習で、github版のgooseでのマイグレーションをどうすればいいのか調べてもイマイチいい情報がなかったのでメモ感覚で書きます

# 使っている環境
– golang 1.23
– これはmacに直接ダウンロードしました。
– docker
– mysql 8.0.34
– goose

# やりたい事
マイグレーションファイルを作ってgooseでdocker上にあるmysqlに対してマイグレーションを実行させたい

# やったこと
※golangのインストールやdockerでmysqlのコンテナを立ち上げる方法は割愛します(mysqlはmacに直接インストールしても問題ないです)

### gooseのインストール
下記コマンドでgooseをインストールする
“`
go install github.com/pressly/goose/v3/cmd/goose@latest
“`
その後whichコマンドで確認する

:::note warn
この時パスが通ってない場合はパスを通す必要あり
:::

“`
which goos

元記事を表示

初心者向け!fmt.Printfで覚えておきたいフォーマット指定のやり方

## fmt.Printfでよく使われるもの一覧
### 文字列
| verb | 内容 |
|:-:|:-:|
| %s | 文字列|
| %q | エスケープされた文字列 |

#### 例
“`Go
var s1 = “文字列”

fmt.Printf(“%s\n”, s1) // 文字列

s2 := `バッククオートを使った、改行や
タブが入った
文字列`

fmt.Printf(“%s\n”, s2) // そのまま表示
fmt.Printf(“%q\n”, s2) // バッククオートを使った、改行や\n\tタブが入った\n\t\t文字列
“`

### 整数
| verb | 内容 |
|:-:|:-:|
| %d | 整数 |
| %b | 2進数 |
| %o | 8進数 |
| %x | 16進数(小文字のa-f) |
| %X | 16進数(大文字のA-F) |

#### 例
“`Go
var i = 254
fmt.Printf(“%d %b %o %x %X\n”, i, i, i, i, i) // 254 111

元記事を表示

curl: (7) Failed to connect to localhost port 8080 after 0 ms: Couldn’t connect to serverが生じる

挨拶・経緯

こんにちは。初投稿です。
すごく簡単な勘違いで15分ほど時間を費やしてしまったので、同じ問題で詰まってしまった人のためになる記事を書けたらいいな、と思い作成しました。
Goを学んでいる最中、localhost:8080を起動したは良いものの、curlコマンドを使用するタイミングがあったのですが、

curl http://localhost:8080/hello

の実行結果が、

curl: (7) Failed to connect to localhost port 8080 after 0 ms: Couldn’t connect to server

と出てしまっていました。

解決方法

まず私のPCはMacのARM64になります。
GoをVSCodeで書いている時に、上記のエラーが発生しました。
しかし、こちらのnetstatコマンドでポートの状況を確認しました。
一度、ターミナルを開き、

netstat -tlpen | grep 8

元記事を表示

【Go】deferを理解しよう!〜初学者向けガイド〜

# はじめに
本記事では、Go言語の`defer`について、基本的な特徴を3点紹介します!

# deferの特徴
## 1. 関数の実行を遅延させる
deferは、Goのキーワードの一つで、関数の実行を遅延させるために使用されます。具体的には呼び出し元の関数が終了する直前に、指定した関数を実行することができます。これによって、リソースの解放や後処理を簡潔に行うことができます!

例えば、以下のソースコードを見てください:

“`go
package main

import (
“fmt”
)

func main() {
fmt.Println(“A”)
defer fmt.Println(“B”)
fmt.Println(“C”)
}
“`

このコードの実行結果は次のようになります:
“`
A
C
B
“`
deferを使った行は、関数の終わりに実行されるため、`B`が最後に出力されます。

## 2. deferの関数の実行順序はLIFO(後入れ先出し)
複数のdeferを使うとどうなるでしょうか?次のソースコードを見てください:

“`

元記事を表示

Rustアプリケーションの実装効率と性能評価 – C・Go言語実装との比較

![](http://www.cybergarage.org/memo/wp-content/uploads/sites/4/rust-eval-loc-perf.png)

Rustは、安全性と高速性の両立を目的にデザインされた言語[\[1\]](https://doc.rust-lang.org/stable/book/)であり、近年では業務に採用されるプロフェッショナル言語としての、更なる飛躍が期待されています[\[3\]](https://blog.rust-lang.org/2022/02/15/Rust-Survey-2021.html)[\[8\]](https://blog.rust-lang.org/2022/12/05/survey-launch.html)。

ただし、2021年のアンケート結果[\[3\]](https://blog.rust-lang.org/2022/02/15/Rust-Survey-2021.html)でも、仕事での利用率は前年の42%から59%に大きく向上している反面、業界での採用実績面の少なさが、Rustの将来性の最大の懸念(38%)

元記事を表示

Goのgoroutineで並列処理した結果を順番を維持したまま配列(スライス)に格納する

# 注意
掲載したコードを実行したとき,デッドロックが発生する可能性があります.

## 目標
以下の関数`longProcess`の結果をスライスに格納する.
“`go
func longProcess(n int) string {
rndValue := rand.Intn(1000)
sleepTime := time.Millisecond * time.Duration(rndValue)
time.Sleep(sleepTime)
msg := fmt.Sprintf(“%d^2=%d [%dms]”, n, n*n, rndValue)
fmt.Println(msg)
return msg
}
“`
![process.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3644068/18983dc5-53a4-31e3-9130-103c19229d8c.png)

### longProcessの概要
– `longProcess`関数の処理は2乗の値の計算.戻り値とし

元記事を表示

sqlcで動的なWHEREを作る

## sqlcで動的な検索条件を作りたい

[前回](https://qiita.com/ktat/items/2ed13afcd29f49aee6a1)に続きまして、GoのORM [sqlc](https://github.com/sqlc-dev/sqlc)の話です。[前回の紹介記事](https://qiita.com/ktat/items/2ed13afcd29f49aee6a1)で書いたとおり、sqlcで動的な検索条件(WHERE)を自動生成で行うのは無理ですが、以下の手順でやれば、そんなに難しくはありません。

### Step 1. 単純なSQLを書く

“`sql
— name: SearchUser :many
SELECT * FROM user;
“`

`Search`と書いてますが、特に検索はしてませんね。これは、下記のようなコードができあがります。

“`go
package your_db

// 省略

const searchUsers = `– name: SearchUsers :many
select id, family_name,

元記事を表示

Golangでキューを使った幅優先探索の練習をしてみた

# 概要
最近、アルゴリズムの基礎を学ぼうと思って [なっとく!アルゴリズム](https://www.shoeisha.co.jp/book/detail/9784798143354) って書籍を読んでます。この中にあるサンプルコードはPythonで書かれてるんですが、Goを触ることが多いので自分でGolangに書き直して勉強しようと、そのアウトプットです。

幅優先探索はキューを使って、まず隣接ノードを探索しそのノードに対象がなければ、そのノードの隣接ノードをキューに追加していくというアルゴリズムのため、下記2点を確認することができます。
– 検索対象が存在するか
– 存在する場合は、その存在までの最短経路

# やってみた
問題は「**自分の友達に名前の末尾がyの人がいるか、いなければ友達の友達にいるか、いなければ友達の友達の友達に…**」ってな感じです。

## グラフを作る
まずはグラフになる友達のリストを作ります。
“`go
var graph map[string][]string

func init() {
graph = make(map[string][]st

元記事を表示

ES自動生成AIを作った ~コード解説編~ (SignUp)

今回は以下の拡張機能を作成したときのことについて書いていく。

https://github.com/Yutosaki/es-writer/tree/main?tab=readme-ov-file

以下の機能がどの様に動いているのかについて、それぞれコードを追いながら解説していきたいと思う。(解説が少し長くなってしまったので、SignIn以降は別の記事に書こうと思う)

* SignUp(メールアドレスなどの認証も含む登録)  (今回の記事)
* SignIn(ログイン)
* 経歴入力(自己PR、経験、今まで作った作品)
* 回答生成(埋め込み含む)
* SignOut(ログアウト)

構成は以下の様になっている。
“`bat:フロントエンド
frontend (モジュールやビルドパッケージについては省略)
├── package.json
├── pnpm-lock.yaml
├── postcss.config.js
├── README.md
├── src
│ ├── components
│ │ ├── Profile.tsx
│ │ └── P

元記事を表示

Go のちょっと変わったORM sqlc の紹介

## sqlcとは?

[sqlc](https://github.com/sqlc-dev/sqlc)は、Go のORMですが、少し変わっていて、自分でSQLを書きます。「SQLを書きたくない!」という人には、絶望的に向いてないですが、「ORMが作るSQLは気に食わない」とか、「結局どんなSQL生成されてるのか気になるんだけど」とか何度か思ったことのある人(「ORM名 SQLをログに出す」とかでググったことのある人)には割と気に入るかもしれません。

## sqlcを選んだ理由

今まで使ったORMは、順番でいくと、[sqlx](https://github.com/jmoiron/sqlx)(は、ORMではないか)、[Beego](https://github.com/beego/beego)のORM、[sqlboiler](https://github.com/volatiletech/sqlboiler)です。[gorm](https://github.com/go-gorm/gorm) はコードレビューでは見たことがありますが、書いたことはないです。

正直、プロジェクトを変

元記事を表示

gin + oapi-codegen + Docker で構築するAPIサーバ

## 本記事の目的
– oapi-codegenを使ってgin APIサーバ用のgo言語コードを生成する方法を学ぶ
– [oapi-codegenの公式サンプルコード](https://github.com/oapi-codegen/oapi-codegen/tree/main/examples/petstore-expanded)を必要最低限に単純化し,構成の本質的部分をハイライトする
– gin + oapi-codegenの実行環境をDockerで構築する

## 技術要素
– gin:GO言語ベースのWebフレームワーク.ルーティングやエラーハンドリング等のWebサーバとして必要な機能を備え,軽量なWebアプリを構築可能.APIサーバとして活用したり,静的ファイルのホスティングも可能
– oapi-codegen:OpenAPIのAPI仕様書から各種フレームワーク用のコードを生成できるジェネレータ.gin以外にもEchoなど主要なフレームワークに対応

## 構築物のディレクトリ構成のイメージ ※自動生成されるファイル等一部省略
完成物は[こちらのリポジトリ](https://

元記事を表示

golangci-lintをちょっくら使ってみる

## 概要
少人数でgoを使用してプロダクトの開発を行っているのですが、私を含めメンバーもgoをそんなに触ってきていないので、コードの品質はあまり良くないのが最近の悩みです…
そこでgoのlintである「golangci-lint」があるというのを聞いたので軽く導入してみようかなと思い、この記事に簡単にまとめてみます。

ちなみに基本的には以下のサイトを参考にさせていただいていて、こちらの方がとっても詳しく書かれています!
ですが私は一瞬、軽くやりたかっただけなので最低限の事だけをなぞってメモしておきます🫠

https://zenn.dev/sanpo_shiho/books/61bc1e1a30bf27/viewer/27b52f

## やること
– ローカル環境とPRを作成したときにlintを走らせて指摘してもらう

## やってみる

#### ● ローカルで指摘してもらうようにする
1. golangci-lintのインストール

以下を参考にしてローカルにgolangci-lintをインストールする

`go get`や`go install`でのインストールは

元記事を表示

OpenAPI3.0 から Go のAPIクライアントコードを生成するライブラリ選定

# 結論
[`oapi-codegen/oapi-codegen`](https://github.com/oapi-codegen/oapi-codegen) と [`ogen-go/ogen`](https://github.com/ogen-go/ogen) がよさげ。

1ファイルのみの生成でミニマムにやりたいなら [`oapi-codegen/oapi-codegen`](https://github.com/oapi-codegen/oapi-codegen)、リクエストのクライアント検証や optional 型、gRPC っぽいインタフェースで扱いたいなら [`ogen-go/ogen`](https://github.com/ogen-go/ogen) っていう所感。

# 要件
必須
– OpenAPI3.0に対応していること
– GoのAPIクライアントコードを生成できること

推奨(=選定観点)
– ①ライブラリとして信頼できること
– ②生成に要す時間が短いこと
– ③生成コードが必要最低限であること

# 候補
## [`OpenAPITools/openap

元記事を表示

Terraformのプロジェクトローカルな小さなプロバイダ(プラグイン)を書いてみる

## はじめに

日常よく使う道具について「**いざとなったら拡張を書いてどうにかしてやるぞ!**」という自信を持つのは精神衛生上良いことです。

今回はTerraformに最低限の機能を持った自作プラグインを追加してみます。

## 簡単なTerraformのプラグインアーキテクチャの振り返り

簡単にTerraformのプラグインアーキテクチャについて振り返ってみます。

Terraform はプラグインアーキテクチャを採用しているソフトウェアであり、基本的なリソースのライフサイクル管理の機能はTerraform本体で提供しているのですが、AWS上などの実際の具体的なクラウドインフラ上のプロビジョニングは専用のプラグイン(例: [terraform-aws-provider](https://github.com/hashicorp/terraform-provider-aws))を呼ぶ構造になっています。

“`mermaid
sequenceDiagram
terraform ->> terraform: 必要なプロバイダの割り出しなど
terraform ->>

元記事を表示

Goの「wire」と「sqlboiler」でレイヤードアーキテクチャを実装してみる

## 0. はじめに
[wire](https://github.com/google/wire)を勉強中なので、レイヤードアーキテクチャーでの使い方を記事として書こうと思います。
今回の記事では、goのバックエンドコンテナ、mysql,adminerを利用しており、docker-composeファイルで管理していました。
また`wire`と`sqlboiler`の基本的なセットアップについてもすでに行った状態で記事をはじめます。

ディレクトリ構造
“`
| .gitignore
| docker-compose.yml
| README.md
|
+—backend
| | .air.toml
| | Dockerfile
| | go.mod
| | go.sum
| | main.go
| | sqlboiler.toml
| |
| +—domain
| | +—entity
| | | book.go
| | |

元記事を表示

Goの静的解析 ~go vet編~

コンパイラによってキャッチされない不具合や懸念を検出するためのものとして、静的解析ツールがある。
Goの静的解析ツールはいくつかあるが、ここでは go vetについて紹介する。

## go vetとは
Go言語に標準で組み込まれた静的解析ツール。
言語標準ツールのため言語のバージョンアップと同じタイミングで更新される。
公式ドキュメントは[こちら](https://pkg.go.dev/cmd/vet)。

## 使用可能なルール
`go tool vet help`を実行すると、使用可能なルールの一覧が表示される。Go1.22.3 時点では32のルールが存在する。

“`
$ go tool vet help

Registered analyzers:

appends check for missing values after append
asmdecl report mismatches between assembly files and Go declarations
assign check for u

元記事を表示

OTHERカテゴリの最新記事