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

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

[Cloud Functions 2nd Gen.] 単一リポジトリで複数関数を管理する [Go]

Cloud Functions(第二世代)のドキュメントを読んでいくと、ソースのディレクトリ構造のサンプルとして以下のような構造が出てきます。

“`
.
├── myfunction.go
├── go.mod
└── cmd/
└── main.go
“`
[Source directory structure](https://cloud.google.com/functions/docs/writing#directory-structure-go) より

ドキュメントに出てくるようなシンプルな例ならこれでも十分かもしれませんが、Cloud Functions の関数も含めてモノレポにまとめて、共通部分を切り出して…などやっていく場合、どういう構成にすれば良いか悩む人も多そうだな、と。

そこで今回、一つの例として実際に実装してみたのでシェアします。

なお、Cloud Functions の前提知識として、[前回の記事](https://qiita.com/yukia3e/items/a629ec51656493544091) もあわせて読んでい

元記事を表示

【Golang】軽量なHTTPサーバのDockerコンテナを作成

Golangの入門書を読んで何か作成してみたいと思い、どうせならGolangが得意とする軽量なコンテナを作成しました。
# ゴール
下記をゴールとしました。
– 次の機能を有する静的コンテンツを公開するHTTPサーバとする
– デフォルトで、ルートパスへのアクセスで hello ページを返す
– バインドマウントでホストの静的Webコンテンツを返す
– 任意の Content-Type を返すことが可能
– x64やarmなどのマルチプラットフォームに対応したコンテナイメージを作成してDocker Hubで公開
# 実装
まずは、Golangのソースです。
“`golang
package main

import (
“encoding/json”
“fmt”
“html”
“io”
“net/http”
“os”
“strings”
)

type Config struct {
ContentTypes map[string]string
}

func getConfig() (config Config, err error) {
jsonFi

元記事を表示

Goモジュールを作成してみた

# 背景・目的
[前回](https://qiita.com/zumax/items/040c3cce24eeb6727679)、Goについて簡単なプログラムを書いてみました。今回はGoモジュールを作成てしみます

# まとめ
下記に特徴をまとめます。

|特徴|説明|
|:–|:–|
|Goモジュールの概要|関連するパッケージをモジュールに収集し、他の開発者が使用できるようにモジュールを公開できる|
|Goモジュール公開の概要|・モジュールに含まれるパッケージを設計しコーディングする

・Go ツールを介して他のユーザーが確実に利用できるようにする規則を使用して、コードをリポジトリにコミットする

・開発者から見つけられるようにモジュールを作成し公開する

・時間の経過とともに、各バージョンの安定性と下位互換性を示すバージョン番号つき規則を使用するバージョンでモジュールを改定する|
| `go.mod`ファイルの概要|モジュールは、ルートディレクトリに`go.mod`という名前のUTF-8でエンコードされたテキストファイルにより定義される|

元記事を表示

Gemini API を Goで使ってみる

無料枠があるので、Gemini API を Goで使ってみる

Gemini API クイックスタートを参考に。

https://ai.google.dev/gemini-api/docs/quickstart?hl=ja&lang=go


# できたもの
プロンプトや画像の読み込みはコード内に直接書き込んでいます。

“`
// プロンプト: ONEPIECEの作者は?
go run main.go
ONE PIECEの作者は **尾田栄一郎** です。
“`

“`
// プロンプト: 2つの画像の違いを教えて
go run main.go
1枚目はルフィ、2枚目はゾロです。
“`

“`
// プロンプト(user): こんにちは、赤い果物は何がありますか?
// プロンプト(model): いちごやりんごがあります。
// プロンプト: その中で小さいのはどちらですか?
go run main.go
いちごはリンゴよりも小さいです。
“`

“`
// プロンプト: モンキー・D・ルフィが食べた悪魔の実について説明して
go run main.go

元記事を表示

Goを試してみた①(環境構築〜Hello Worldまで)

# 背景・目的
最近、Goに触れる機会が増えてきたので、今後、本格的に学んでいこうと思います。
本ページではGoの特徴など基本的なところを整理します。

# まとめ
下記に特徴を整理します。

|特徴|説明|
|:–|:–|
|概要|・Google がサポートするオープンソースプログラミング言語
・学びやすく、チームに最適
・組み込みの同時実行性と堅牢な標準ライブラリ
・パートナー、コミュニティ、ツールによる大規模なエコシステム|
|Goのユースケース|・Cloud & Network Services
・CLI開発
・Web Development

Development Operations & Site Reliability Engineering|
|Cloud & Network ServicesでGoを利用するメリット|・開発サイクル時間の短縮
・サーバパフォーマンスの向上
・サービス開発をサポートする強力なエコシステム
・サービス用のGo APIと、一般的なOSSライブラリを提供している|
|CLI開発で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://

元記事を表示

OTHERカテゴリの最新記事