Go関連のことを調べてみた2022年12月23日

Go関連のことを調べてみた2022年12月23日

最近読んだGo言語の本の紹介:100 Go Mistakes and How to Avoid Them

これは、[Money Forward Engineering 2 Advent Calendar 2022](https://qiita.com/advent-calendar/2022/moneyforward) 23日目の記事です。

最近読んだGoの本について感想と紹介を書きたいと思います

# 100 Go Mistakes and How to Avoid Them
読んだ本
https://www.manning.com/books/100-go-mistakes-and-how-to-avoid-them

Harsanyi-HI(中)

英語の本です
Amazonだと電子

元記事を表示

grpcurl をコードリーディング

こんにちは、しゅん([@MxShun](https://twitter.com/MxShun))です。
今年11月にサイバーエージェントに中途入社、AI事業本部オペレーションテクノロジーに仲間入りしました。

<宣伝>

? 同じく本日投稿の、CyberAgent Advent Calendar 2022「[私がやった Amazon S3 コストカット全ステップ](https://developers.cyberagent.co.jp/blog/archives/38950/)」よければご覧ください!
? 社内の方は、*#times_mxshun* よければ覗いてあげてください!

\

# grpcurl
gRPC 界隈では言わずと知れた、gRPC サーバに対して cURL できるコマンドラインツールです。

> grpcurl is a command-line tool that lets you interact with gRPC servers. It’s basically curl for gRPC servers.

https://github.com/f

元記事を表示

Gormのバージョンアップ対応の詳細

[クラウドワークス Advent Calendar 2022](https://qiita.com/advent-calendar/2022/crowdworks)の23日目です!

以前、クラウドワークスエンジニアブログで「**[Gormのv1からv2へバージョンアップした話](https://engineer.crowdworks.jp/entry/2022/11/14/194848)**」という記事を投稿させていただきました。

そちらの記事ではバージョンアップ対応時の施策の進め方について書かせていただきました。

今回は実装面でどのように修正していったかについて実際のサンプルコードも交えてご紹介させていただきます!!

# Defaultタグの挙動について

v2になりdefaultタグの挙動が変更されています。

v1ではデータベースのdefault値を利用するような動きになっていたのが、v2になりタグの値を正として動作するように変更されています。

どういう動きになるか具体的に紹介します。

まず下記のようなテーブルを用意しました。

age, memo, hogeにそれぞ

元記事を表示

Goでの日付比較チートシート

# 概要

Goで日時を司る型はtime.Timeでナノ秒まで適用される。
このtime.Timeには比較演算子の`==`, `<`, `>`が使えず[After](https://pkg.go.dev/time#Time.After), [Before](https://pkg.go.dev/time#Time.Before), [Equal](https://pkg.go.dev/time#Time.Equal)メソッドを使って比較する必要がある。

# チートシート

| 時間の関係 | 記述 | 返値 |
| —- | —- | —- |
| a > b | a.After(b) | true |
| a > b | a.Equal(b) | false |
| a > b | a.Before(b) | false |
| a = b | a.After(b) | false |
| a = b | a.Equal(b) | true |
| a = b | a.Before(b) | false |
|

元記事を表示

効率的にツイッターから求人を探すサービスを開発

# はじめに

本記事は [個人開発 Advent Calendar 2022](https://qiita.com/advent-calendar/2022/individual-developers) カレンダー2 の 23 日目の記事です。
本記事では [Twitter API](https://developer.twitter.com/en/docs/twitter-api) を使ってwebサービスをリリースした経緯や技術スタックなどをまとめています。

# 出来上がったもの
集中してTwitterで仕事探しができる検索サービスを作りました

[ツイジョブサーチ(https://twijob.spotstudy.net/)](https://twijob.spotstudy.net/)
 ※ブラウザによってSSLのエラーが表示するかもしれません

![ツイジョブサーチ](https://twijob.spotstudy.net/img/twitter_ogp.png)

![ツイジョブサーチ](https://qiita-image-store.s3.ap-northea

元記事を表示

Golangでバッチとgoroutinesとgo channelsと比較してみましょ

## はじめに

初めまして。HRBrainでソフトウェアエンジニアをしているビクトルと申します。

今年の4月にスペインから日本へ引っ越しまして、はじめてアドベントカレンダーをやっていきます!

私はバックエンドとDevOpsが好きなのでGolangのgoroutinesとgo channelsのパーフォマンスについてお話したいと思っています。

比較する方法にGrafanaとPrometheusを使いたいと思っています。

リポジトリはこちらです [golang-performance](https://github.com/ervitis/golang-performance)

まず、簡単でchannelsとgoroutinesを紹介しています。

### channelsとは

[channels](https://golangdocs.com/channels-in-golang)はバッファーと同じ仕方をしています。channelを作成方法はこちらです。バッファーが空と満になってプロセスがブロックされています。

書き方はこれになっています:

“`go
bufferCh

元記事を表示

Strategyパターンから理解するGo言語のinterface

この記事は [Go Advent Calendar 2022](https://qiita.com/advent-calendar/2022/go) 23日目の記事です。

# はじめに

Go言語はJavaなどのオブジェクト指向のように明示的な継承関係がない分、interfaceをうまく使いこなせるかがカギになってくるように個人的に感じます。
そのinterfaceの使い方は、オブジェクト指向におけるStrategyパターンが参考になるよ、という話をしようと思います。
読者としてはGoに入門したばかりの初学者を想定しています。

# Strategyパターン
Strategyパターンは「GoFのデザインパターン」のなかで紹介されている、クラスやインタフェースの使い方に関する設計パターンです。

## 図式
Strategyパターンの説明については、[結城浩『Java言語で学ぶデザインパターン入門 第3版』](https://www.hyuki.com/dp/)に詳しいのでそのまま引用します。

> strategyというのは、「戦略」という意味です。敵をやっつけるときの作戦、軍隊を動

元記事を表示

Javaエンジニアから見たGoの独特な文化

# はじめに

Java中心で仕事をしていた人がGoを書いてみると様々な文化の違いにぶつかると思います。そもそもオブジェクト指向言語と手続き型言語であるなど根本的に異なる点は多いのですが、「よりシンプルに」をモットーとするGoにはよりJavaエンジニアを困惑させる文化がたくさんあるように見受けられます。

本記事ではJavaエンジニアがGoを書いた際に感じた独特な文化を経験ベースで書いてみます。Goをこれから書くであろうJavaエンジニアのお役に立てれば幸いです。

**対象読者**
– これからGoを書くことになりそうなJavaエンジニア
– Javaと比べたGo特有の文化を知りたい人
– 実際にGoの開発をするにあたって役に立つ思想を知りたい人

**本記事の対象でない人**
– Goの構文や書き方を基本から学びたい人
– とりあえずプロダクトを作って動かしてみたい人
– 実際に開発する上で意識しない裏の仕組みやアーキテクチャを知りたい人

# インタフェースの実装を明示的に指定しない

GoではJavaの`implements`のような宣言がありません。

インタフェースで定義し

元記事を表示

golangでimportできない問題解決

## どんなことが起きていたか
config.goでutilsをimportしようとしたが、階層を指定しても読み込まれなかった。
二枚目の画像の5行目がimportできなかった。

https://gyazo.com/19b5d02877ffffcd25d90660859b4aa3

https://gyazo.com/7156e0d9759ebcda173fcb854a9ee923

## 解決方法
①Go Modulesの初期化
go mod init [モジュール名]でGo Modulesの初期化をする。
作業ディレクトリ作成直後に初期化した。

“`
go mod init [作業ファイル名]
go mod init go-example
“`

以下のように、go.modファイルが作成される。
“`
module go-example

go 1.16
“`

これでimportできるようになった。

## 参考文献

https://nishinatoshiharu.com/go-modules-overview/#Go_Modules

元記事を表示

【Go】DIライブラリを使ってみる

# はじめに
クリーンアーキテクチャやUTの実装を簡単にするための技術としてDIを導入することがほぼ必須となっているが今回はGo言語のDIライブラリであるWireを使ってサンプルプログラムを実装してみた。
筆者の経験として今までJavaでSpringによるアノテーションを使ったDIとScalaでAireframeを使ったDIがあり、JVM言語以外ではDIを使ったプログラミングをしたことはない。

# Wire
Google製のDIライブラリ
wire.goに依存関係を記述してコマンドを実行すると別のGoファイルが生成されて依存関係を解決したインスタンスを作ることができる。

https://github.com/google/wire

# クラス図
下記の通りUserService構造体のメンバ変数としてIUserRepositoryインターフェースが定義されておりそれを継承した構造体としてuserRepository1とuserRepository2が存在している。
UserService構造体を生成するときrepoにuserRepository1とuserRepository2を

元記事を表示

[go] [terraform] lambdaのsource_code_hashが毎回更新される

# 前提
goのバージョンとterraformのバージョンは以下
今回の記事の対象は恐らくgo 1.18以降を使っている人
“`shell
go version
go version go1.19.2 darwin/arm64
terraform -v
Terraform v1.3.6
“`

# 今回の問題
terraformで以下のようなコードでlambdaのリソース管理をしていた
“`terraform
resource “aws_lambda_function” “go_function” {
filename = “go_function.zip”
function_name = “go_function”
handler = “main”
source_code_hash = filebase64sha256(“go_function.zip”)
runtime = “go1.x”
}
“`
`go_function.zip` はgithub actionsのworkflow内でbuild

元記事を表示

休日Gopherが育ててきたMakefile

# はじめに

この記事は [Go Advent Calendar 2022](https://qiita.com/advent-calendar/2022/go) 22日目の記事です。

休日Gopherシリーズ第2弾です。
`Go`の業務経験が少ない私が個人開発をするときに育ててきた`Makefile`を公開します。

※ 第1弾:[休日Gopherとしての1年半を振り返る](https://qiita.com/_otakakot_/items/d64bb4e20f64937d405e)
※ 休日Gopherとは私が勝手に作った言葉です。休日にしか`Go`を触る機会がないGopherをそう呼んでいます。

# 想定読者

– `Makefile`を利用するGopher
– `Makefile`に興味があるGopher

# 実行環境

Mac/Linuxでの実行となります。
私が実行している環境は以下となります。
(`uname -a`の結果となります。)

“`shell
Linux HP-Spectre-x360 5.4.72-microsoft-standard-WSL2

元記事を表示

Goでpingを実装する

本記事は DeNA 23 新卒 Advent Calendar 2022 の22日目の記事となります.

https://qiita.com/advent-calendar/2022/dena-23-shinsotsu

# はじめに

主に指定の宛先とのラウンドトリップタイムを計るときに使う **ping** というソフトウェアがあります.主に回線状況の確認の目的で使われることの多いこのソフトウェア,OS問わずに利用可能であることもあり,使用経験のある方も多いのではないでしょうか.
私も時折使っていたのですが,内部的にどのように通信が行われているのかというところをしっかりとは理解できていなかったところがあります.

本記事はその理解を深めることを目指し,周辺の知識を復習しながらGoによってpingを実装したことをまとめたものです.

# ICMP

pingはICMP(Internet Control Message Protocol)というRFC792で定義されたプロトコルを利用します.

https://www.rfc-editor.org/rfc/rfc792.html

ラウ

元記事を表示

Kinesis Data Firehoseを用いてJSTでパーティショニングする

# はじめに

オークファン開発部で新卒2年目として働いてる@isodaです
業務でKinesisを用いたapiの実装に携わり、そこで得た知見などを備忘録として残したいと思います

# Kinesis Data Firehoseの設定
今回の題名にもなっているJSTでパーティショニングする方法ですが、デフォルトのパーティションだとUTCでパーティションされてしまう為、動的パーティショニングを設定します
– ソース
– Direct Put
– 送信先
– S3
– 配信ストリーム名
– test-stream
– S3 バケット
– test-bucket
– 動的パーティショニング
– 有効
– JSON のインライン解析
– 有効
– 動的パーティショニングキー
– キー名 | JQ 式
– year | .ymd[:4]
– month | .ymd[4:6]
– day | .ymd[6:8]
– S3 バケットプレフィックス
– data/!{partitionKeyFromQuery:y

元記事を表示

Go(gin)のテストで配列をFormDataとしてPostしたい

# はじめに
タイトルの件で調べても解決に時間がかかってしまったので簡単にまとめてみます

# 解決方法
– url.Valuesに”配列をpostする際は{“1”, “2”}と書く
– 構造体のタグにformを指定する
– Bindする

“`hoge_controller_test.go
t.Run(“hogeが作成されること”, func(t *testing.T) {
r := controllers.StartMainServer()
formData := url.Values{
“form1”: {“1”, “2”},
}

req, _ := http.NewRequest(“POST”, “/hoge_new”, strings.NewReader(formData.Encode()))
req.Header.Set(“Content-Type”, “application/x-www-form-urlencoded”)
test := httptest.NewRecorder()
r.ServeHTTP(test, req)

元記事を表示

Goのテストコードを一気に並行動作できるようにするツール「tparagen」を作った

本記事は[Go Advent Calendar 2022](https://qiita.com/advent-calendar/2022/go) & [カンム Advent Calendar 2022](https://adventar.org/calendars/7789)の記事になります。

## 何を作ったか
以下のデモのように、**コマンドを1回実行するだけで対象リポジトリ内のテストを最大限に並行実行に対応させるツール**を作りました。

—-

## なぜ作ったか
Goの`testing`パッケージを使ったテストコードの実行は、`go test`コマンドの`-p`オプションで明示的に並列実行の制限をしない限り、複数のパッケージが並行にテストを実行するようになっています。
開発者が意識しなくともテストの実行が最適化されるようになっており、このような仕組みはJavaScriptのテストフレームワーク[Je

元記事を表示

golang-migrateでmigrateできない時の確認事項【備忘録】

## 問題
golang-migrateでmigrateしようとするとエラーを吐かれる.
なぜ今roleの問題が発生する?
“`
$ migrate -path db/migration -database “postgres://postgres:pass@localhost:5432/postgres?sslmode=disable” up
$ error: pq: role “postgres” does not exist
“`

## 対処
先に対処法から紹介.
Path等に誤りがない場合、**ローカルでPostgresが起動しているか確認**.
起動している場合は停止させてから再度migrateを試みると通る!..かもしれない.

ちなみにMacで停止させる場合は以下のコマンドを使う.
“`
$ brew services stop postgresql
“`

## 原因
ローカルでPostgresが同一のポート(大抵は5432)で動いている場合はローカルの方に接続されてしまうらしい.

## 参考
[Go言語とPostgreSQLで遊ぼう!~マイグレーション編~

元記事を表示

教育版・統合版マイクラ x micro:bit連携プログラミング環境をつくる

この記事はmicro:bitアドベントカレンダー2022に参加している記事。
micro:bitアドベントカレンダー2022 22日目

https://qiita.com/advent-calendar/2022/microbit

# マイクラをmicro:bitと接続できないだろうか

そんな問いかけから始まったプロジェクトだったワケだが、まずは自分で実装するよりも先人の知恵を借りてみようとググってみるとやっている人は結構いるのだと分かった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13920/338c3d33-a7b1-7124-1d57-47e16e3a2095.png)

教育版・統合版マイクラはベースが同じものなので機能が共通しているところが多い。元々、これらのマイクラはプログラミング機能を付加することができるCode Connection for Minecraftという別アプリとWebSocketプロトコルで連携して機能拡張を実現していた。

このWebSocke

元記事を表示

GoとUnityとSQLでちょっとしたソシャゲとか用のユーザ認証とセッションを作りたい

### この記事はゲーム制作者の発表の場アドベントカレンダーに参加中です。
https://adventar.org/calendars/8046
ゲーム制作にかかわる人が自由な記事を作る Advent Calendar 2022 22日目担当、Fuseです。
サーバサイドに興味を持ったので、サーバサイドの記事を書きました。
今回は色々使えそうなユーザ認証とセッションを作っていきます。

# まえがき
+ 著者はGo言語初学者です。なのでお見苦しいところがあるかもしれませんがご了承ください。
+ 巷ではやりの`Go言語`と`PostGreSQL`と`Unity`でソシャゲとかに使えるユーザ認証を作っていきます。
+ ゲームとしての処理はサーバ側に実装、クライアントであるUnity側は与えられたデータを表示するのみとします。
+ 単純な実装では無く、セキュリティやチート対策なども意識して作っていきます。
+ 今回は技術検証がメインのためゲームの面白さは度外視とします。
# 完成品
### サーバー側
https://github.com/Fuses-Garage/UnityGo
###

元記事を表示

Windows(WSL2)でとりあえずGo言語を書けるようにする

# はじめに
とりあえずGo言語を書く環境を用意したかったのでやったことのメモ。

# 前提
WindowsにWSL2インストール済
WindowsにVisual Stuidio Codeインストール済
WSL2にUbuntu 20.04.5 LTSインストール済
UbuntuにVisual Stuio Codeインストール済

# UbuntuにGo言語をインストールする
[このページのUsin PPAの通りにコマンドを打つ(これで最新版が入る)。](https://github.com/golang/go/wiki/Ubuntu)
> sudo add-apt-repository ppa:longsleep/golang-backports
sudo apt update
sudo apt install golang-go

# VSCodeにGoの拡張機能をインストールする
“Go”で検索すると出てくるこれをインストールする。
![2022-12-21 (14).png](https://qiita-image-store.s3.ap-northeast-1.amazonaw

元記事を表示

OTHERカテゴリの最新記事