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

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

【Go言語】意図的に0や空文字を使うとvalidatorが反応してしまう問題

## TL;DR

必須チェックを行う場合は構造体の変数をポインタ型にすることで0や空文字を使ってもバリデーションエラーを返さないようにできます。

“`go
type Human struct {
Name *string `validate:”required”`
Age *int `validate:”required”`
}
“`

## 遭遇した問題

Goで構造体をバリデーションを行っていたとき、Ageに0を入れるとバリデーションエラーを返してしまう問題に遭遇しました。

“`go
type Human struct {
Name string `validate:”required”`
Age int `validate:”required”`
}

func main() {
h := Human{
Name: “Taro”,
Age: 0, // 意図的に0を入れている
}
if err := validator.New().Struct(h); err != nil {
var ve validator.Valid

元記事を表示

Goで書かれたPHPアプリケーションサーバーのFrankenPHPを触ってみた

![スクリーンショット 2023-12-19 0.43.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/765794/3317b5d1-125c-60b4-9637-e522a76e57a4.png)
Goで書かれたPHPアプリケーションサーバーである[FrankenPHP](https://frankenphp.dev/)を触ってみました。
2023/12/11にバージョン1.0.0がリリースされたPHPアプリケーションサーバーです。やっと触れました。

https://frankenphp.dev/

## FrankenPHPとは
[公式](https://frankenphp.dev/docs/)より
> FrankenPHP is a modern application server for PHP built on top of the Caddy web server.

*FrankenPHPは、Caddy Webサーバー(※1)の上に構築されたPHP用のモダンなアプリケーションサ

元記事を表示

【Go言語】環境変数の活用

### 環境変数とは

* 実行時のオプションとしてではなく、プロセスが持つ変数として提供される
* オペレーティングシステムは、プログラムの実行時に環境変数のリストをプログラムに渡す
* デプロイ時に設定可能で、同一のバイナリを異なる環境(本番、テストなど)で使用する際に柔軟な設定を可能にする

### 環境変数の取得方法
2通り紹介する

#### `os`パッケージを使用する方法
一番プリミティブな方法

“`go
package main

import (
“fmt”
“os”
)

func main() {
gopath := os.Getenv(“GOPATH”)
fmt.Println(gopath)
}

“`

#### `envconfig`を使用する方法
環境変数をGoの構造体にマッピングすることができる

* 使い方
* 構造体のフィールドに`envconfig`タグを付けることで、環境変数との対応付けを行う
* `default`オプションを使用して、環境変数が設定されていない場合のデフォルト値を指定できる
* `re

元記事を表示

Rust vs. Go: Learning Dependency Injection

[Rust Advent Calendar 2023](https://qiita.com/advent-calendar/2023/rust) の投稿です。

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

自己紹介です。現職は、小売の買い物体験向上に取り組む Software Engineer です。

この投稿では、本業(SRE)のかたわらで取り組む Backend について書きます。

題材は、Rust 初心者として考える Production Code です。

Production Code において、`main.rs`[^6] だけで構成することは、通常ないと思います。

従って、Architecture が必要です。

ここ数年、DDD[^1] や Clean Architecture[^2] など、色々な設計手法が話題です。
僕個人の意見として、Architecture は、テスト可能なコードであれば良いと思います。
最低限、自動テストを可能にするには、抽象化が必要になります。

“`mermaid
graph TD

元記事を表示

モックはChatGPTにサクッと作ってもらいましょう

## はじめに
こんにちわ。オルトプラスでサーバーサイドエンジニアやってます勝城です。

普段は社内プロジェクトでテックリードをしつつ、サーバーサイドエンジニアの採用担当をしております。

みなさん、ChatGPTを使っていますか?オルトプラスではaiラボというSlackチャンネルがあり、AI関する情報の共有等を積極的に行っています。

さて「モックはChatGPTにサクッと作ってもらいましょう」というタイトルにしましたが、ChatGPTでできることは自分でやる必要はなく、どんどん活用しませんかという布教記事です。

私はエンジニアですが、非エンジニアの方でもChatGPTを活用することでモックレベルなら簡単に作れてしまうでしょう。

この記事でやること

・ChatGPTを使ってローカル環境で動くモックを作る

この記事はこんな人におすすめ

・ChatGPTを活用したい方
・ChatGPTでできる一例を知りたい方
・非エンジニアで簡易なモックを作りたい方

本記事は 単体テストもlintを通そう

## はじめに

こんにちは!
株式会社HRBrainでエンジニアをしているZamaです。
この記事はHRBrain Advent Calendar 2023 カレンダー2の19日目の記事です。

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

## 前提

HRBrainでは

– Goを用いてバックエンドの開発を行っており、
– lintには[golangci-lint](https://github.com/golangci/golangci-lint)が使われ、
– 単体テストのassertionには[testify](https://github.com/stretchr/testify)が使われることが多いです。

## 単体テストがlintの対象でなかった

先日`golangci-lint`の設定ファイル(`.golangci.yaml`)を覗くことがあり、そこで`tests: false`という記述を見つけました。

何だこれ?と確認してみると、

“`
# Include test files or not.
# D

元記事を表示

【Go言語】ゴルーチンが実行されずプログラムが終了する

タイトルの通りです。初めてゴルーチンを勉強したときにハマっけど以外に回答を見つけられなかったのでメモします。

ある日、以下のようなコードを書いたときにsub関数の中が全く実行されずに困っていました。
実際にはこんな簡単ではなく少し複雑なコードだったので原因が分からずに困っていました。

“`go
package main

import (
“fmt”
“time”
)

func sub() {
fmt.Println(“sub done”)
}

func main() {
go sub()
fmt.Println(“main done”)
}

// 実行時の出力
// main done
“`

これはsubの中が実行されていくより先にmain関数が終了してしまうためです。
main関数が終了するとプログラムは終了してしまうので、subの中身が実行される前にプログラムが終了してしまいます。結果「sub done」が出力されません。

そのため、以下のようにsubが実行されるようにmainを遅延してあげる必要があります。

“`go
package main

元記事を表示

【負荷試験】Rails Sever VS Go Server

# Ruby(Rails) VS Go(echo)
RailsとGo製サーバーの耐アクセス性能を比べてみようと思います。

それぞれDockerコンテナでサーバーを建てて、どれほどのアクセス量まで耐えられるのか検証します。
理想はEC2上などでやりたかったですが、本検証は手元のMacで行っております。

## Rails Serverを建てる

apiモードで`rails new`
“`bash
rails new rails_app –api
“`

コントローラーだけ作ります。
“`bash
rails g controller posts
“`

“`ruby:app/controllers/posts_controller.rb
class PostsController < ApplicationController def index render json: {"status": "ok"} end end ``` ルーティング ```ruby:config/routes.rb Rails.application.routes.draw

元記事を表示

GoでWin32 APIを叩いてみたわ~

# はじめに
はじめまして。今年、新卒採用でさくらインターネットに入社した仲座と申します。普段はクラウドのバックエンドの開発などを主に行っています。
と、自己紹介をしましたが今回は仕事の話やさくらのサービスの話ではなく、趣味開発で得た知見について語ろうと思います。よろしくお願いいたします:bow:

# 動機
まずはGoでWin32 APIを叩きたいと思った動機を「なぜGoで開発したいか」と「なぜWin32 APIを叩きたいのか」で大きく分けて整理したいと思います。
– なぜGoで開発したいのか
– 今後仕事でGoに触れる事がありそうだから
– 言語仕様が良さげだと聞いたから
– 環境構築が楽そうだから
– なぜWin32 APIを叩きたいのか
– オーディオ周りの不便さを改善したいから

## なぜGoで開発したいのか
### 今後仕事でGoに触れる事がありそうだから
普段は前述したとおりサービス開発を行っています。そうした中、チーム内でGoを使ったモジュールの開発、社内の交流会などでGoのトピックが上がるなど注目度が高いと感じました。
「今は

元記事を表示

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

## はじめに
 普段、某資産管理系のシステムに関わり、Goをゴリゴリ書いてるエンジニアです。
 業務以外にも、個人アプリを開発していて、アウトプットがてら詰まったところを書き留めておこうかなと思いました!

## 自己紹介
 ちょっと脱線しますが、勤務先の社内公用語が英語とあって、大学受験時に使っていた参考書を今更になって読み直しています。
 なかなかインプットしたところをアプトプットする機会がないので、Twitterを英語で運用しています。
 もし良ければ、こちらのフォロー頂けると嬉しいです!

## どんな状況だったのか
 マイクロサービス化をしている都合上、GRPCを使って通信をしています。GRPCでは、主にprotoファイルといった通信規格を定義するファイル群を疎通を行う双方向のサーバーに配置しなければなりません。
 よくあるケースとしてprotoファイル群を1つのリポジトリにまとめ、そのリポジトリをシステム間で参照するといったケースを見かけます。

:::note warn
・マイクロサービス化したシ

元記事を表示

【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年で大手に転職して地獄を見た話

# はじめに

## 対象読者

**新卒**、**第2新卒**、**これから就職・転職をしようとしている方**にはぜひ参考にしてほしいと思います。

## 背景

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

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

使ったことのない技術やツールが多かったので、技術的な面はもちろん、非技術的な面でも未熟な状態でした。1

元記事を表示

複数台のサーバに対して 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

元記事を表示

OTHERカテゴリの最新記事