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

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

Go、ポインタにするか値にするかの方針を考えてみた

## はじめに
この記事は[2021年Goアドベントカレンダー(3)](https://qiita.com/advent-calendar/2021/go)の9日目の記事です。

ポインタにするか値にするか考え方針をまとめてみました。

この記事で書かれていることは既に多くの方が考えたり記事にしたりしていますが、どうするべきか迷うことがあり、例となるコード付きで方針をまとめたいと考え記事にします。(この記事の内容は個人的な方針です。サービスの特性などで変わる点はあると思います。)

以下の3つのパターンで記載しています。

– 構造体について
– 関数の引数について
– メソッドのレシーバについて

間違いなどありましたら教えていただけると嬉しいです。

### 構造体について
#### 方針
– 構造体のフィールドに、スライスやmap、ポインタなどの参照型を持つ場合はポインタ
– 変更不可な構造体として、運用する場合は値でも良い(コンストラクタを定義し必ずコンストラクタで生成するようにする、不変なオブジェクトなど)
– 迷ったらポインタ

構造体のフィールドに、スライスやmap、ポイ

元記事を表示

Go言語+Elasticsearchで簡易求人検索バックエンド構築

# Go 言語+Elasticsearch で簡易求人サイトバックエンド構築

この記事は、マイナビ Advent Calendar 2021 9 日目の記事です。

今回の記事のソースコードは、[GitHub](https://github.com/ekusiadadus/go-hr-backend)で公開しています。

フォルダ構成は以下のようになります。

“`
.
├── README.md
├── batch
│ ├── LoadData.go
│ ├── go.mod
│ ├── go.sum
│ └── test_data.xml
├── docker-compose.yml
├── es
│ ├── dic
│ │ └── test_dic.csv
│ ├── Dockerfile
│ ├── script
│ │ └── es_init.sh
│ └── sudachi
│ └── sudachi.json
├── search_api
│ ├── Dockerfile
│ ├── go.mod

元記事を表示

AWS SAMを触ってみた

こんにちは、HCB Advent Calendar 2021の8日目を担当する、take-2405です。
研究の都合上あまり時間を確保できず、とても雑な記事になってしまっています。

ごめんなさい!!

[HCB Advent Calendar 2021](https://qiita.com/advent-calendar/2021/hcb-2021)

今回は、AWS Lambdaのローカルでのテストを目的とし、AWS SAMのインストールとテンプレート作成までについてをメインに書いています。
(本題のテストまで書く時間がなかった、、、、今度時間を見つけて加筆します。)

注意:基本的なLambdaの作成方法などは省いています。

# はじめに
みなさんは普段AWS Lambdaを利用するでしょうか?
私は、割と頻繁に利用します。(体感週に2つはLambdaを作成している)

普段goでLambdaを作成するのですが、goでLambdaを作成する場合以下の手順を踏む必要があります。

“`
1. プログラムをコンパイルする(バイナリファイル化)
GOOS=linux go bu

元記事を表示

Ubuntu で Go の最新版を使う

Ubuntu 20.04 にて Go の最新版を使う手順です。
Windows 10 WSL2 上の Ubuntu の場合は、下記手順となります。

## 最新の golang-go リポジトリを追加する

“`
sudo add-apt-repository ppa:longsleep/golang-backports
sudo apt update
sudo apt install golang-go
“`

なお、 golang-go は 最新の Go をデフォルトのGoとしてインストールします。
代わりに golang-1.17 をインストールしたい場合、 `/usr/lib/go-1.17/bin` のバイナリを使用してください。

## パッケージを更新する
パッケージを更新したい場合は、いつもの手順でOKです。

“`
sudo apt update
sudo apt upgrade
“`

https://github.com/golang/go/wiki/Ubuntu

元記事を表示

きらめく星(の力で憧れの私)描くよ

この記事は、フラー株式会社 Advent Calendar 2021 の8日目の記事です。
担当は昨年フラーにサーバーサイドエンジニアとして合流しました@inoriko711です

7日目の記事は @jfurudo さんによる [Fastlane で AppStoreConnect にアップロードするまで](https://qiita.com/jfurudo/items/2f18cf392d307d770f65) でした。

## 背景
きっかけはアドベントカレンダーを担当することを宣言したときに、変換をミスったことでした。
むちゃぶり

そんなわけで、フラーのサーバーサイドが採用しているGolangを用いてきらめく星を描きたいと思います。
タイトルの意味がわからない方は[こちら](https://www.toe

元記事を表示

チームで内部API開発をするときのツール

# まえがき
– 最近はBFFアーキテクチャの採用により、サーバサイドは内部(Internal)APIとしてAPIを作成することが多い
– チームで開発するために、どのAPIが何を示しているかはわかりやすくしておきたい
– サーバ・フロントどちらを触るときでもAPI定義を見れば実装できるようにしたい
– 各エンドポイントが何をしているか、コードを見ればわかるけど毎回したくはない

– チーム開発でAPI開発をするときにどのようなツールを利用していたかについて記載する。

# 前提
– いわゆるREST APIを採用 (gRPCではない)
– OpenAPI3.0 を仕様

# VSCode拡張機能
– [Swagger Viewer](https://marketplace.visualstudio.com/items?itemName=Arjun.swagger-viewer)
– API定義をプレビューできる拡張機能
– 拡張機能名はSwaggerとついているが、OpenAPI3.0でも問題なくプレビューが可能
– いわゆるライブリロード機能があり、編集→反映が

元記事を表示

gRPC + Locust + boomerで負荷試験をしてみた

# はじめに

この記事は[ミクシィアドベントカレンダー2021](https://qiita.com/advent-calendar/2021/mixi) 8日目の記事です。

こんにちは。
サービスのリリース前や大きなイベント前には皆さんも負荷試験をしているかと思います。

今回はgRPCを使った新規サービスでboomerというツールを使って負荷試験をしたのですが、なかなか使い心地がよかったのでご紹介したいと思います。

またboomerの選定については先日までアルバイトで来て頂いていた方にメインやって頂いたのですが、非常に助かりました。
この場をお借り致しまして,お礼申し上げます。

# boomerとは

LocustのシナリオをGoで書けるWorker Runnerです。
LocustのWorkerとして動作するため、別途Locust Masterは必要になります。
gRPCに特化したツールというわけではありません。

https://github.com/myzhan/boomer

# ツールの選定理由

Locust + boomerは以下の理由で採用しました。

元記事を表示

「はし」「スプーン」「フォーク」に濁点を付けると「バシ!」「ズブ!」「ブォグ!」という事実【ゲームアプリ】

[クソアプリ Advent Calendar 2021](https://qiita.com/advent-calendar/2021/kuso-app) (カレンダー2)8日目の記事です。

歴史あるクソアプリアドベントカレンダーに初参加(Qiitaに初投稿)です。

#はじめに
私は気づいた。

日々の食事で使う3つの道具。

箸、スプーン、フォーク。

この3つはある法則で「変貌」する・・・。

**「バシ!」「ズブ!」「ブォグ!」**

そう、濁点をつけると、完全に **打撃音** なのだ。

#作ったもの

↓Android版はこちらからダウンロードできます(レビューしてほしい)!

https://play.google.com/store/apps/details?id=com.ku20298.hashidebashi

紹介画像がなかなかクソですね。

↓こちらからはブラウザで遊べます。PCやiPhoneの方はこちらで遊んでみてください!

htt

元記事を表示

Goのスライス式で遊ぶ

この記事は[2021年Goアドベントカレンダー2](https://qiita.com/advent-calendar/2021/go) 8日目の記事です。

# はじめに
Goにはslice(スライス)というデータ構造が提供されています。
可変長配列のようなもので、Goを触ろうとした人の中にはこのスライス操作で躓く人が多いのかもしれません。

Goには他の言語のようにコレクションに対する便利な関数が提供されていないのは有名だと思いますが、基本的にGopherはこのスライスをfor文で愚直にイテレーションしたり `append`/ `copy` 関数を使って要素の追加や削除を行なっていきます。
おそらくですが、Wiki にある[SliceTricks](https://github.com/golang/go/wiki/SliceTricks) にお世話になった人は多いでしょう。

そんなスライスですが、今回はスライス操作についてではなくスライス式の挙動について簡単に書いていこうと思います。

# スライス式(Slice expressions)とは
> Slice expressi

元記事を表示

Goを使用するにあたり、ポインタとアドレスでつまづいたので覚書

Goでは値が初期化(定義)されると、値の内容の他にその値がメモリ上のどこにあるかを示すアドレスというパラメータが自動生成される。

### アドレスの仕組み

アドレスを確認する場合

~~~go
&value
~~~
というように、「&+値名」のように書くと、その値のアドレスを参照できる。

~~~go:例1
func main() {
a := 5
b := &a

fmt.Println(a)
fmt.Println(&a)
fmt.Println(b)
fmt.Println(&b)
}
~~~

~~~go:結果
5
0xc00001a060
0xc00001a060
0xc00000e028
~~~

これは何が起こっているのかというと、aにbのアドレスを代入したので、fmt.Println(b)の戻り値はfmt.Println(&a)の戻り値となる。
また、bは新しく定義されたので、bには値としてaのアドレスがセットされたと同時に、bにはアドレスが割り振られた。

### アドレスに値があれば、アドレスから値を参照することができる

(例1)では、bにはaの

元記事を表示

beegoでOauthログイン機能サーバー開発

GoでOauthなログイン機能バックエンドサーバーを作りました。

実装内容とシーケンスは下記の記事を参考にさせていただきました。
https://dev.classmethod.jp/articles/persistent-login-for-mobileapp/

# 環境
go v1.17
beego v1.12.1

# 実装機能
バックエンドには下記機能を作ります。
・サインアップ
・ログイン
・ログアウト
・accessToken更新用のapi
・コンテンツ(hello worldを返すだけのapi)
・認証用のwebFilter機能

全体のコードは下記になります。
https://github.com/fu-yuta/authentication_backend
ひとつずつ解説してきたいと思います。

## DB
ユーザーの情報を保存するためのテーブルは下記になります。
ログインの認証用のユーザー名とパスワードと次のリクエストから認証に使用するアクセストークン、リフレッシュトークンを保存できるようにします。
また、アクセストークンの有効期限も保存し、リクエスト毎の検証

元記事を表示

GO(gin)でlocalhstにアクセスできない

## はじめに

macでdockerを使ってgo言語のginを使ってテストサーバにアクセスできない問題を解消したので備忘録に置いておきます。

## 環境

– Mac(Monterey 12.0.1)
– GO 1.17.1

## 結論

サーバ作成時に
“` err := router.Run(“127.0.0.1:8080”) “`
ではなく
“` err := router.Run(“0.0.0.0:8080”) “`
とする。

## 問題

今回の環境では、dockerを用いてgoのサーバを建て、hostからgoサーバにアクセスしようとしたところで問題が起きた。
![env.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150694/364a7d0d-291d-ba5e-1d10-1450aef4cd2f.png)

ブラウザで表示しても応答がない。

![404.png](https://qiita-image-store.s3.ap-northeast-1.a

元記事を表示

YouTube好き集合。Go言語でLIVEコメントをリアルタイム取得する

# はじめに

こんにちは。サーバーサイドエンジニアです。アドベントカレンダーということでクリスマスカラーの赤色にちなんで
赤い動画配信サービスYouTubeのネタです。

YouTubeは言わずと知れた動画配信サービスですが、最近ではLIVE配信によるサービスの盛り上がりを見せています。LIVE配信は動画配信者に対して視聴者がコメントで意思を伝えたりする双方向のコミュニケーションが可能になっています。

そんなLIVE配信のコメントですがAPIを利用して取得することができます。

今回はGo言語を利用して、簡単にLIVE配信のコメントを取得する方法をご紹介します。

![christmas_santa_sori.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540446/055944f6-479f-7202-6470-a7eb4cdaa7ff.png)

# 技術
言語: Go
フレームワーク: Gin
すぺしゃるさんくす: YouTube API

# 準備
YouTube APIのページから事前に

元記事を表示

Goでいいね機能を実装してみた。

この記事は Aizu Advent Calendar 2021 の5日目の記事です

夏休み中にgo言語でそんな感じのコードを書いていたので、自分の復習も込めて記事にしてみます。
全てのコードはこちら
=> https://github.com/wt128/dbapiBygo/
## フレームワーク等
gin/gorm/mysql

## ER図とモデル![ergo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1504436/1a630627-5787-9e75-6315-5368ee7b959a.png)
– いいねのモデル

“`
type Like struct{
ID uint `json:”id”`
PostID uint `json:”postid” gorm:”index:idx_name,unique”`
UserID uint `json:”userid” gorm:”index:idx_name,unique”`
User User `gorm:”forei

元記事を表示

Goコードを生成するprotocプラグインに入門する

この記事は CyberAgent 22 新卒 Advent Calendar 6日目の記事です。

https://adventar.org/calendars/6671

# 概要
protoファイルのデータ定義を元に様々な言語のコードを生成できるのがすばらしい!
しかも、なにやらprotocプラグインなるものを使えばprotoファイルを元にコードを生成できるらしい!
というわけで、以前protocプラグインを調べたことがありまして、今回はその時のことをまとめてみました。

Go言語でprotoファイルからGoのコードを自動生成するprotocプラグインに入門してみましょう。
Goのコードを自動生成したいなと考えている方などに参考になればと思います。

# protocプラグインの仕組み
まずはprotocプラグインの仕組みについて学びましょう。
こちらに関しては、先駆者の方の記事がめちゃくちゃ参考になります。

– https://qiita.com/yugui/items/87d00d77dee159e74886
– https://speakerdeck.com/popon01

元記事を表示

Lambda + Go + terraformでAWSの料金をSlack通知してみた

## はじめに

この記事は[mixiアドベントカレンダー2021](https://qiita.com/advent-calendar/2021/mixi) 6日目の記事です。
みなさまはAWSで運用しているサービスに毎月どれくらいのコストがかかっているか、サービスのリソースごとにどれくらいの料金がかかっているかを確認していますでしょうか。
今回は、AWSの料金を毎日Slackに通知するシステムをLambda + Go + terraformで構築したのでそちらをご紹介させていただきます。

## おすすめな人

– AWSにかかる料金を定期的に通知したい
– GoでLambdaをどう開発するか知りたい
– terraformでLambdaを管理する方法を知りたい

## アーキテクチャー
![aws_billing_notification.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2334784/760f4f85-cfdb-8b57-bad4-8c4b0e4df04d.png)

– Even

元記事を表示

GraphQL Serverを実装してみた

# GraphQL Serverを実装してみた

次のプロジェクトで _GraphQL API_ を使おう!という話になったので、
GraphQL ServerをGolangで試しに作成してみました。

Githubにサンプル実装のソースをコミットしましたので、ご参考下さい。

[tochukaso/graphql-server-sample]

## GraphQLとは

[GraphQL]とは、一言でいうと、

**SQL感覚で書けるAPI** である

[graphql.org]によると、以下の通り

“` text
GraphQL is a query language for APIs and a runtime for fulfilling those queries with your existing data.
GraphQL provides a complete and understandable description of the data in your API,
gives clients the power to ask for exactly wh

元記事を表示

Go Linter – Staticcheckを使ってみる

この記事は[Wanoグループ Advent Calendar 2021 5日目](https://qiita.com/advent-calendar/2021/wano-group)の記事になります

Goには様々なlinterが存在しています。
元々Go公式のlinterはGolintですが、色々否定的な意見は少なく、今年ついにアーカイブされました。

代わりに使用するlinterとして GoやGoogleがサポートするStaticcheckが使ってみようかなと思います。

### 公式page (前身はGoSimple)

https://github.com/dominikh/go-tools

### Install

go 1.17なら、以下のcmdで実行 (過去versionの場合、go installじゃなくgo get使うかも)

“`
$ go install honnef.co/go/tools/cmd/staticcheck@latest
“`

### 実行

早速使ってみる

“`
$ staticcheck ./…

…(略)
xxxxxx

元記事を表示

Rubyやってた人間がGo始めて思ったこと

この記事は、[フラー株式会社 Advent Calendar 2021](https://qiita.com/advent-calendar/2021/fuller-inc)の6日目の記事です。

5日目の記事は [@m-coder](https://qiita.com/m-coder) さんによる [DroidKaigi2021に登壇した話](https://note.com/m_coder/n/n74901d195d83) でした。

私は元々Ruby on Railsで開発をしていたのですが、最近転職しまして、Goに入門しました。
Goやり始めて「へぇ〜」と思ったことを書いてみます。

## 型があるとうれしい

私は静的型付けの言語をこれまであまり触ったことがなかったのですが、型がちゃんと決まってるとありがたいですね。

エディタ(VSCodeを使っています)の補完機能がバリバリ効いて、

– この変数にどんな値が入っているのか
– この変数はどんなメソッドが使えるか
– このメソッドにどんな値を入れればいいか

などを教えてもらえるので、サクサクコードを書き進められ

元記事を表示

fmtパッケージをインポートするとファイルサイズがどかんと増えてしまう理由

[Goアドベントカレンダー3](https://qiita.com/advent-calendar/2021/go)が穴が空いていたので小ネタを投稿してみます。

@masa_itoさんがGoConで、[Contextを完全に理解する](https://future-architect.github.io/articles/20211119a/)という発表をしました。その発表資料のP44に次のような記述があります。

![スクリーンショット 2021-12-06 1.54.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6105/bf47e197-d734-1381-1fa9-d6de91b8ed29.png)

会社のチャットで「fmtを使えば済みそうなところを、それを使わずに周りくどいことをしている」と発表資料を作っているときに@masa_itoさんが書いていて、僕が「fmtをインポートするだけでファイルサイズがかなり大きくなりますしね」と答えていたのですが、じゃあ何がでかくなるのかなってあたり

元記事を表示

OTHERカテゴリの最新記事