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

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

Go言語をつかった Lambda関数の開発をもっと楽にしたい〜Codespacesを添えて〜

メリークリスマス!
この記事は[朝日新聞社 Advent Calendar 2022](https://qiita.com/advent-calendar/2022/asahi)の24日目の記事です。

## TL;DR
Dockerコンテナ上で RIE と air つかってサクサク開発環境を作りましょう
サンプルは https://github.com/duck8823/sample-lambda にあります。
[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://github.com/codespaces/new?hide_repo_select=true&ref=main&repo=581006091)

## 今回の開発スタイル
こんな感じで開発するとしましょう。

– スキーマをOpenAPIで管理したい
– Go でLambda関数を書きたい
– curl で動作確認したい
– ホットリロードほしい
– スキーマから生成されたクライアントを試したい

## Lambda

元記事を表示

Go の Workspace を試す

## はじめに
本記事は [株式会社 RetailAI X Advent Calendar 2022](https://qiita.com/advent-calendar/2022/retail-ai-x) の24日目の記事です。
昨日の記事は @takaomag さんの [threadと一貫性とAtomic](https://qiita.com/takaomag/items/cbf8301709024e6073fa) でした。
まだ見られていない方は是非ご確認を!

## 何に関する記事か
Go 言語の Workspace について書いていきます。
この機能は Go 1.18 から導入されており、リリースされた2022年3月から正式に利用できています。
([こちらのリリースノート](https://go.dev/doc/go1.18#go-work) に載ってます)
ただ、同じタイミングで Generics や Fuzzing がリリースされており、
さほど調べずにここまできてしまったので、この機会にまとめてみます。
以下の内容は Go の基礎を知っていることが前提となっています。

元記事を表示

超初心者ワイ「Goルーチンが動かせない!ムキ! 」

## 概要

当方Goを先日書き始めたもので超初心者です.そんな私がGoルーチンを使おうと思ったけど使えなかった内容を書きます.

## 該当のソースコード

“`go
package main

import (
“fmt”
)

func hi() {
fmt.Println(“hi”)
}

func hello() {
fmt.Println(“hello”)

}

func main() {
go hi()
go hello()
}
“`

このコード,実行しても何も起きないんですよ.これがなぜなのか分からなくて頭を悩ませていました.

そしてなぜか他の人のコードは動く… うーん.なぜだ…

“`go
package main

import (
“fmt”
“time”
)

func main() {
fmt.Println(“main”)
go hoge() //goroutine
time.Sleep(time.Second)
}

func hoge() {
fmt.Println(“hoge”)
}
“`

https://

元記事を表示

GoでAPIのCRUDをつくりたい

# はじめに
メリークリスマス!
クリーンアーキテクチャというものを参考にしつつ、簡単なAPIのCRUDを作成しました。
自分の理解を整理するためと今後も引き続いてAPIを作成していくことを踏まえ、簡単にまとめてみました。

開発環境の構築は以前に出しているのでそちらを参考にしてください。

https://qiita.com/does_not_exist/items/b79b3fd51ea6ef39df23

## ディレクトリ構成

“`
go/src
┣ controller
┃ ┗ post_controller.go
┣ db
┃ ┗ db.go
┣ models
┃ ┗ post.go
┣ server
┃ ┗ server.go
┣ service
┃ ┗ post.go
┣ go.mod
┣ go.sum
┣ main.go
“`
# PostmanでAPIにリクエストを送る

## GET(read)
最初はPostテーブルが空であることを確認します

![l_9007702_170_6dc288d243da5280df3c7f8da1a3a2ed.p

元記事を表示

Gomockはじめてみませんか

みなさんは、handlerやapplicationのテストをする際にモックをどうしていますか??
私は自作モックを使うこともありますが、Gomockを愛用しています!
Gomockは、たくさん記事がありますが私なりの使い方を共有できればと思います:tea:
導入を検討しているかたの参考になればと思います。

# 前提
– Go v1.19.3
– github.com/golang/mock@v1.6.0
– github.com/golang/mock/mockgen
– github.com/labstack/echo@v4.9.1

# サンプルコード

https://github.com/sgash708/gomock_qiita

# 使い方
`mockgen`をとおしてファイル作成したら、あとはテストで自由に使うだけです。

## 導入
“`bash
$ go install github.com/golang/mock/mockgen@latest
“`

https://github.com/golang/mock

### モックファイル作成

元記事を表示

最近読んだ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でソフトウェアエンジニアをしているビクトルと申します。

この記事はHRBrain Advent Calendar 2022カレンダー1の23日目の記事です。

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

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

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

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

https://github.com/ervitis/golang-performance

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

### channelsとは

[channels](https://golangdocs.com/channels-in-golang)はバッファーと同じ仕方をしています。channelを作成方法はこ

元記事を表示

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)

元記事を表示

OTHERカテゴリの最新記事