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

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

【Go】go.mod を複数使いたいときは、go.workを作って解決しよう!

## はじめに
 普段、某資産管理系のシステムに関わり、Goをゴリゴリ書いてるエンジニアです。業務以外にも、個人アプリを開発していて、アウトプットがてら詰まったところを書き留めておこうかなと思いました。
 ちょっと脱線しますが、勤務先の社内公用語が英語とあって、大学受験時に使っていた参考書を今更になって読み直しています。なかなかインプットしたところをアプトプットする機会がないので、Twitterを英語で運用しています。もし良かったら、こちらのフォロー頂けると嬉しいです!

## どんなケースだったのか
 マイクロサービス化をしている関係で、各システム間のプロトコルをGRPCを使ってやり取りしていました。GRPCでは、protoファイルという型定義ファイル(OpenAPIと同じようなもの)を疎通を行う双方のサーバーに配置しなければなりません。
 このとき、よくあるケースとしてprotoファイル群をまとめたリポジトリを作り、そのリポジトリを疎通を行う双方のサーバー(リポジトリ)で参照するといったケースを見かけます。
 特

元記事を表示

【Go言語】ファクトリー関数を使って構造体を生成する

## ファクトリー関数とは

まずGoでは構造体からインスタンスを生成するとき、以下の3つの方法があります。

“`go
// 1. 構造体の宣言
type Person struct {
FirstName string
LastName string
Age int
}

// newで作成
p := new(Person)

// var変数宣言で作成
var p Person

// 構造体リテラルで作成
p := &Person{
FirstName: “John”,
LastName: “Doe”,
Age: 30,
}
“`

上記の方法以外に、ファクトリー関数を使って構造体のインスタンスを生成する方法があります。

ファクトリー関数とは、構造体のインスタンスを生成する関数のことです。Go言語では、構造体のコンストラクタがないため、ファクトリー関数を使って構造体のインスタンスを生成することがよくあります。

**ファクトリー関数を利用するメリット**

このファクトリー関数を利用するメリットは以下の2点です。

元記事を表示

Go入門時に調べたことをまとめる

# はじめに

本記事は[mediba Advent Calendar 2023](https://qiita.com/advent-calendar/2023/mediba)の18日目の記事です。

私は、今年の9月に株式会社medibaにバックエンドエンジニアとして入社しました。
弊社ではバックエンドにGoを採用することが多く、Goに入門した際にハマったこと(調べたこと)を書いていきます。
同じくGoの学習する方の少しでも助けになれば幸いです。

# 配列とスライス

Goでは複合データ型を表現するものとして、配列とスライスがあります。

配列は固定長で`append()`で拡張不可です。

“`go
// 配列を作成
ary := [3]int{1,2,3}

// 拡張不可
ary = append(ary, 4)
// -> error! first argument to append must be a slice
“`

一方、スライスは可変長であり、`append()`で拡張可能となっております。

“`go
// スライスを作成
slc := []int{4,

元記事を表示

ベンチャー実務経験1年で大手に転職して地獄を見た話

# はじめに

私は新卒で30人規模のBtoBベンチャーに入社し、1年間勤めました。スキルとしては、使用言語はPython, Django, jQuery, JavaScript, Reactで、自社プラットフォームの開発を行ってました。運用・監視はインフラの役割なので開発部では扱わない、テストは手動の結合テストのみ、ソースコードはスパゲティ、アーキテクチャは巨大な肉団子、CI/CDは使ってない、プルリクは自分でマージするといった状況でした。

そして、今の会社に転職して、E2Eなどテスト自動化は導入ずみ、アーキテクチャはオニオンアーキテクチャ、AWSやTerraformなど運用や監視などの体制、言語はGolangやJava、開発環境はdevcontainerというように、ほとんど全てが最先端の企業で働くことになり、半年が経ちました。

使ったことのない技術やツールが多かったので、技術的な面はもちろん、非技術的な面でも未熟な状態でした。1on1はダメ出しばかりで、よくマネージャに詰めれていました。そこで、今回の記事では、私が半年でぶつかった課題をまとめてみました。

**新卒**、**

元記事を表示

複数台のサーバに対して SSH 経由でコマンドを自動実行する

## はじめに

この記事は [ディップ Advent Calendar 2023](https://qiita.com/advent-calendar/2023/dip-dev) の18日目の投稿です。

この記事では、複数台のサーバに対して行うパッケージのバージョン調査の作業を自動化させたことについてご紹介いたします。

## 背景

複数のサーバに対して同じコマンドを叩いて調査を行いたいときはありますか?

Apache や Nginx など、主要なミドルウェアなら既に IaC 化しており、パッケージのバージョンを確認することが出来ると考えられますが、
`curl` , `gnupg` などといったものも含めて、すべてのパッケージを IaC 化してバージョン管理することは、負担が大きいすぎると思います。

例えば、`openssl` で脆弱性が発見され、対象のバージョンを調査しなくてはならない状態になったとき、
複数台のサーバに対して `ssh` をして `openssl version` コマンドを叩かなくてはなりません。

定型作業は、プログラムに任せてしまいましょう。

#

元記事を表示

Goプロジェクトにおけるクリーンアーキテクチャの導入

VR法人HIKKYでバックエンド開発を担当しているいけがやです。
HIKKYのアドベントカレンダー2023の18日目の記事になります。

https://qiita.com/advent-calendar/2023/hikky

バックエンドチームでは一部のWebAPIやバッチ処理をGoで実装していますが、今回はGoのプロジェクトをクリーンアーキテクチャに沿って実装した事例を書いてみます。

クリーンアーキテクチャの実践で考慮すべき問題、例えば
– クリーンアーキテクチャのレイヤーに沿ったフォルダ分割をどうするか
– それぞれのフォルダやファイル名、コードの命名をどうするか
– コードを実際にどうそれぞれのフォルダに分割していくか

という問題に対しては議論が活発で様々なアプローチがあると思いますがそのうちの1つの方法として参考にしていただければと思います。

## クリーンアーキテクチャとは?
クリーンアーキテクチャについて有名な以下の図を参照しながら解説していきます。
![CleanArchitecture.jpeg](https://qiita-image-store.s3.a

元記事を表示

Go – Transformerを紐解く (google.org/x/text/transform) & テキスト置換処理の実装

この記事は[Wano Group Advent Calendar 2023](https://qiita.com/advent-calendar/2023/wano-group)の18日目の記事となります。

# :unicorn: 自己紹介
TuneCore Japanでバックエンドエンジニアをしている@_tachi_です。
今年9月より入社し、主にGoやPerlを使って日々開発をしております:hatched_chick:
HIPHOP(特にtrap/drill系)と服が好きです。

# :fist: 概要
業務としてGoに触れて3ヶ月が経過しました。
Simpleでいい言語だと思います(≠ Easy)。
個人としては2019年ごろに触れていたので、数年ぶりのGoとなりました。
ジェネリクスなどが導入されたおかげで数年前に比べて表現力が高まったように感じています。

前置きはさておき、個人的に気になっている`golang.org/x/text/transform`というパッケージがあります。

https://pkg.go.dev/golang.org/x/text@v0.14.0/

元記事を表示

Golang×gRPC入門 ~実装からデプロイまで~

## はじめに

最近、GoでgRPCサーバーの開発をするきっかけがありました。今回は、helthcheckのエンドポイント `/grpc.health.v1.Health/Check` の開発を通してGoでgRPCサーバーの実装からECSへのデプロイまでまとめていきます。

gRPCやProtocol Buffersの詳細な概念については今回は割愛しますが、興味があれば2年前にまとめた記事もご覧いただければと思います。

https://qiita.com/ymktmk/items/f7b8949301fac29685dd

## ツールのインストール

まず最初に、開発に必要なツールをインストールします。以下は、必要なツールの一覧です。

“`
go install google.golang.org/protobuf/cmd/protoc-gen-go
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc
go install github.com/grpc-ecosystem/grpcurl/cmd/grpcurl

元記事を表示

Airで始めるGo開発

![](https://storage.googleapis.com/zenn-user-upload/4b135b4d23ea-20231206.png)

[RetailAI Adventurers Advent Calendar 2023](https://qiita.com/advent-calendar/2023/rai-adventurers)の18日目の記事になります。

今回、僕の担当しているプロジェクトで、.air.tomlという見慣れないファイルを見つけたので、それについて調べてみました。

.air.tomlとは、Go言語のホットリロードツールであるAirの設定ファイルです。

https://github.com/cosmtrek/air

ホットリロードとは、ソースコードを更新するたびにソースをビルドし直して実行するという手間を省くため、ソースコードを更新し、保存したら自動でビルドと実行を行うということです。

プロジェクトのルートディレクトリでairを実行し、放っておくだけでコードに集中できるというわけです。

https://github.com/urak

元記事を表示

godot-goでゲーム開発

:::note info
本記事は ZOZO Advent Calendar 2023 カレンダー Vol.8の18日目の記事です。
:::

## はじめに
こんにちは、@prpr_manです。ZOZOには11月に入社したばかりで、現在はGo言語でZOZOTOWNのマイクロサービスの開発を行っています。

この記事は前日の@shogoLazyさんの[Go言語で作ったゲームをWebで公開してみた](https://qiita.com/shogoLazy/items/a73233e668fc203e68f8)に続いて、Go言語でゲーム開発をする事を目指します。こちらの記事では[Ebitengine](https://ebitengine.org/ja/)を使用していましたが、本記事ではGodotを利用してGo言語でゲーム開発を行ってみます。

## Godotとは
Godotは、オープンソースかつクロスプラットフォームなゲームエンジンの一つです。ゲームエンジンというとUnityやUnreal Engineが有名ですが、Godotも近年注目を集めており、Godot製のゲームも多く登場してい

元記事を表示

はじめてGoプログラミング言語を触った感想

# はじめてGoプログラミング言語を触った感想

![](https://go.dev/blog/gopher/header.jpg)

画像: https://go.dev/blog/gopher

## はじめに

Go 暦は 1ヶ月です。勉強のためにちょっとした REST API を Go で書いてみたのでそのときの感想を書きます。

## Go とは

[Go](https://go.dev/) はコンパイル、同時実行、ガベージコレクションが行われる静的型付け言語です。開発元は Google です。Google の巨大なコードベースと頻繁なアップデートがコンパイルとビルド時間を必要としていたため、Go はこれらの課題を解決することを目的に開発されました。([参考](https://go.dev/talks/2012/splash.article))

– 2009年11月に最初のバージョンをオープンソースで公開
– 2012年3月に正式バージョン1.0を公開
– 2023年12月時点の最新バージョンは1.21
– リリースサイクルは6ヶ月ごと([参考](https

元記事を表示

【Go言語】埋め込んだ構造体のフィールドやメソッドを同階層にあるとして扱える話

### 構造体の埋め込みについて

例えば人を定義するとき、その構造体の中に「住所」という情報を混ぜることになったとします。このとき、以下のように構造体の中で構造体を利用することになります。これを構造体の埋め込みと言います。

“`go
package main

import “fmt”

type Address struct {
Street string
City string
PostalCode int
}

type Person struct {
FirstName string
LastName string
Age int
Address
}
“`

### フィールドへのアクセス

このとき、Addressの中のStreetフィールドの値を利用するときは以下のようにアクセスすると思います。

“`golang
func main() {
p := Person{
FirstName: “John”,
LastName: “Doe”,
Age: 30,
Address: Addre

元記事を表示

Goのslog使い方まとめ

こちらは[ラクス Advent Calendar 2023](https://qiita.com/advent-calendar/2023/rakus)の17日目の記事になります。

## はじめに

Go 1.21より、標準パッケージとして[`log/slog`](https://pkg.go.dev/log/slog)パッケージが追加されました。
自己学習も兼ねて、この[`log/slog`](https://pkg.go.dev/log/slog)パッケージの使い方について簡単にまとめたいと思います。

:::note info
この記事はGo 1.21.4時点でのコードを元に記述しています。
:::

## slogの概要

`log/slog`パッケージは、構造化されたロギングを実行するロガーを提供するパッケージで、
Go1.21より標準パッケージに追加されました。

ログレコードは時間、メッセージ、ログレベルに加え、任意のキー/値のペアによって構成されます。

## シンプルなログ出力

`log/slog`にはログレベルを指定してシンプルにログを出力する関数が定義されて

元記事を表示

【Go言語】エラーを扱う

Go言語の**エラー処理の特徴**と、一般的な**エラーハンドリングの方法**について説明する

### エラーは値
Goのエラーは`error`型のインターフェースを満たした単なる値として扱われる。
`error`型は`int`型などと同様にGoのランタイムに組み込まれている型で、インターフェースとして定義されている。
`nil`値でエラーがないことを表す。

“`go
type error interface {
Error() string
}
“`

errors.New()関数を使ってエラーを作成することが一般的。
“`go
func New(text string) error {
return &errorString{text}
}

type errorString struct {
s string
}

func (e *errorString) Error() string {
return e.s
}
“`

### panic()は使わない

Goには`panic()`関数が存在し、プログラムを強制的に終了させること

元記事を表示

Goでテストを書く

# Goでテスト
標準パッケージの`testing`を用いたテストの書き方についてみていきます。

テスト対象は先日作成した多層キャッシュプログラムです。

https://qiita.com/shuyaeer/items/f77ce597c4b55dec57ad

テスト対象↓
“`go:adapters/redis_adapter.go
package adapters

import “github.com/go-redis/redis”

type RedisAdapter struct {
client *redis.Client
}

func NewRedisAdapter() *RedisAdapter {
return &RedisAdapter{
client: redis.NewClient(&redis.Options{
Addr: “localhost:6381”,
Password: “”,
DB: 0,
}),
}
}

func (adapter *RedisAdapter) Get(key s

元記事を表示

【Go言語】定数の使い方

変数や引数などに代入して利用する値のことを、まとめて**定数**と呼ぶ。
Go言語の**定数**の扱い方について、その特性と利用方法を説明する。

### 型のない定数の定義
Goでは、`const`キーワードで定数を定義できる。
実行時ではなく、コンパイル時に定数の値が計算されるため、実行時のコストは発生しない。

“`go
const (
a = 1
b = 1 + 2 // 演算も可能
c = 9223372036854775807 + 1 // uint64を超える数値も可能
d = “hello world” // 文字列定数
)
“`

### 型付き定数の定義
型を指定して定数を定義することもできる。

“`go
type ErrorCode int

const (
f int = 10
code ErrorCode = 10
)
“`

### `iota`について
`iota`識別子を使用して連即した定数を簡単に作成することができる。

#### サンプル
“`go
const (
Sunday =

元記事を表示

GoのGormライブラリアップデートについて

始めました!株式会社メタップスホールディングスのジュリアンです!

今回の紹介はGo言語のGormライブラリの2件の違いを説明させてください。

## Gorm ライブラリの紹介

デベロッパーフレンドリーを目指した、Go言語のORMライブラリです。DBと連携出来て、mysql、postgreなどのクエリが出来るようになります。

Gormのバージョン1からv1.9.16まではgithub.com/jinzhu/gormに保存されており、あなたのコードからインポートするにはそのパスを使う.

Goの慣例では、新しいパッケージ・バージョンが後方互換性を失った場合、インポート・パスを変更する必要がある。そこで、バージョン2をリリースする際、チームはgithubの新しい組織( `https://github.com/go-gorm/gorm` )にレポを移動することにした。この新しいバージョンは、gorm.io/gormを使ってあなたのコードにインポートされる.

“`go
import (

“gorm.io/gorm”
)
“`

(goのエコシステムのクセの

元記事を表示

Go言語とwireで始める依存性注入

# はじめに
もう年末ですね!皆さんいかがお過ごしでしょうか?
自分は人生の中で最も濃かった一年だったかもしれません笑

というわけで今回[IDEAのアドベントカレンダー](https://qiita.com/advent-calendar/2023/idea)の初日を担当します!
物事は最初が肝心と言いますが,なぜそんな大役を自分が担っているのでしょうか…?
これが**メリー苦しみます**というやつでしょうか…

というわけで記念すべき初日の記事は自分の方から**Go言語のwireというライブラリの紹介**をしたいと思います!!
クリーンアーキテクチャやオニオンアーキテクチャと言ったようにさまざまなアーキテクチャで実装を行うときに必ずと言っていいほど,DIを用いて開発を行います

そんなDIをを簡単にしてくれるGo言語が持つDIコンテナのライブラリ,それがwireです!!
丁寧に解説するので少し長くなってしまうかもしれませんが,ご了承ください…

# 事前知識
今回扱うwireというライブラリはいわゆるDIコンテナと呼ばれるものにあたります,そのためまずはサラッとDI周り

元記事を表示

GoでAST使ってコード自動生成するぞ!

[CastingONE Advent Calendar 2023](https://qiita.com/advent-calendar/2023/casting-one) 17日目の記事です。

## はじめに
実装を進めていると、ふと「なんか毎回同じようなこと書いているな」って思うことありません??
僕は結構あります!「repositoryのinterfaceで実装書く時、毎回traceの処理書いてるな〜」とか。
結構書き忘れもあるので、interfaceを元にこの辺りの処理全部生成できたら嬉しいと毎回思ってます笑

ということで、今回はASTを使ってうまくコード生成する方法を紹介します!
ASTとはなんぞやというところから実装まで紹介するので、ぜひ最後まで読んでいってください〜

ちなみに、本書の実装は[こちらのリポジトリ](https://github.com/hiroaki-u/ast-playground)で公開しているので、詳しくみたいという方は参考にしてください!

## ASTとは??
AST(Abstract Syntax Tree)はソースコードの構造を、ツリー構

元記事を表示

チーム開発参加の記録【2023-10~2024-03】(3) slogを使ってリクエスト・レスポンス情報をログ出力してみた

# 本シリーズのリンク

– [チーム開発参加の記録【2023-10~2024-03】(1) Go言語用ORM「Bun」をDBファーストで使う試み(SQLite使用)](https://qiita.com/kanedaq/items/97ca682602b626d5d717)
– [チーム開発参加の記録【2023-10~2024-03】(2) Go言語からTursoを使ってみた](https://qiita.com/kanedaq/items/0c81946306d2412df555)
– チーム開発参加の記録【2023-10~2024-03】(3) slogを使ってリクエスト・レスポンス情報をログ出力してみた

# 本記事で行うこと

[前回(6月~8月)のチーム開発](https://qiita.com/kanedaq/items/7c4c91def6590dc94d06)では、ログ出力はWebフレームワークのデフォルトをそのまま使用しました。
今回は「前回より品質を上げていこう」ということで、ログの出力先や中身に手を加えることにしました。
Go公式の新しいロガー「[slog](h

元記事を表示

OTHERカテゴリの最新記事