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

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

go toolが何をしてるのか知りたかったら-x -workを使うと良い

## はじめに

どうも[ナレッジワーク](https://tenn.in/kw)の[tenntenn](https://tenn.in)です。

この記事では、`go build`や`go run`、`go test`を実行する際のちょっとしたテクニックを紹介します。

## `-x`オプション

Goのツールチェインの内部では、コンパイラやリンカは`$GOROOT/pkg/tool/$GOOS_$GOARCH`にある別コマンドを実行しています。

“`
$ ls `go env GOROOT`/pkg/tool/`go env GOOS`_`go env GOARCH`
addr2line compile fix pack vet
asm cover link pprof
buildid dist nm test2json
cgo doc objdump trace
“`

これらのコマンドをどういう風に実行しているのか確かめたい場合は`-x`オプションを使うと良いでしょう。

たとえば、次のようなGoファイルをビルドして実行してみます。

“`go

元記事を表示

formatterの悩み

この記事は、[クラスター Advent Calendar 2022(2ページ目)](https://qiita.com/advent-calendar/2022/cluster)の14日目の記事です。
昨日は、@pocketberserker さんの、[会社に雑LTという文化があったので開催してみた](https://pocketberserker.hatenablog.com/entry/2022/12/13/232505)でした。

こんにちは、あるいはこんばんは。
Go歴3ヶ月の@homulerです。
クラスターではサーバーサイドエンジニアをやっています。

今回は、日々の開発でお世話になっている、Goのコードのformatterについての話をします。

### Gofmtとgoimports
Goは、公式が[Gofmt](https://pkg.go.dev/cmd/gofmt)というツールを提供していて、Gofmtを使っているかは別として、ほとんどのプロジェクトにおいて、コードはなんらかのツールを使って自動整形されていると思います。
空気のように存在していて、Go初心者が真っ

元記事を表示

【Go】chi の組み込み middleware にカスタムロガーを設定しようと思ってやめた話

# はじめに
– go の web フレームワークライブラリとして [chi](https://github.com/go-chi/chi) がある
– http リクエスト/レスポンスをインターセプトして共通処理をする middleware が差し込めるようになっている
– よく使われるものは chi が用意してくれており、自前で書かなくても使えるようになっている

# 経緯
– リクエスト処理中に panic した時用に、panic ハンドリングをする middleware を差し込みたかった
– chi が用意してくれているものがあるので、それを使おうとした
– これが内部的にエラーログを出力するが、デフォルトだと改行されてズラズラ出力されるので、それを構造化された形(json)で出力したかった
– アプリケーション内では [zap](https://github.com/uber-go/zap) を使っており、middleware 内でもそのカスタムロガーを使ってログを吐きたかった

# tl;dr
– ロガーをカスタムするのが面倒そうだったので、結局 chi の用意し

元記事を表示

【IDEA】【GoLand】エラーハンドリングのライブテンプレートを作成する

この記事は、[and factory.inc Advent Calendar 2022](https://qiita.com/advent-calendar/2022/andfactory)の **14日目** の記事です。
機能は@doiheiの[【Swift】Encodableで可変パラメータを追加してみる](https://qiita.com/doihei/items/9abe1fd19555cfb4d352) でした。

# はじめに

Go言語は例外が存在しないため、エラーハンドリングを毎回する必要があります。メソッドを呼び出すたびにエラー判定をする必要があります。極端な例だと下記の状況も有り得ます。

“`go
func process() (int, error) {
aaa, err := funcAAA()
if err != nil {
return 0, err
}

bbb, err := funcBBB()
if err != nil {
return 0, err
}

元記事を表示

DockerでGo+MySQLの開発環境をつくりたい

# はじめに
Dockerで開発環境を作るアウトプットとして簡単にまとめてみます
goの始め方もまとめていますが、公式ドキュメントを参考にしてください

https://go.dev/doc/tutorial/getting-started

## ファイル構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2889192/b840244d-3860-e641-6d69-f52f94f25799.png)

.envはdbの環境変数、my.cnfはdbの設定項目に関するファイルになります

# やりかた
以下のファイルを作成して、上画像のファイル構成にします

“`Dockerfile
FROM golang:1.18.0
RUN apt-get update && apt-get install -y build-essential make

# vscodeの拡張機能のためにインストール
RUN go install golang.org/x/tools/gopls@lates

元記事を表示

TinyGo で自作キーボードを作ってみた

これは [モダン言語によるベアメタル組込み開発 Advent Calendar 2022](https://qiita.com/advent-calendar/2022/baremetal_embedded_modern_lang) 14日目の記事です。

この記事では、 TinyGo で作った自作キーボードを紹介していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63649/7cad64c5-c0cd-874d-b8f3-751426b85831.png)

## TinyGo とは

マイコンや WASM などの Small Places 向けの Go Compiler です。ここでは Go の文法でマイコン開発ができるもの、という程度の認識でよいです。

https://tinygo.org/

TinyGo + Wio Terminal という題材で TinyGo の使い方を解説した書籍「基礎から学ぶ TinyGoの組込み開発」も好評発売中です。
書籍の中でも、ごく

元記事を表示

GoでWebサーバーを作成する4 jwt認証 TESTについて

# はじめに
Goでjwt、TESTを実装するさいにしらべたことをまとめます。

## jwt

### jwtの基本 実装

以下2つの記事を参考にした。

https://iketechblog.com/go-jwt/#index_id3

https://qiita.com/yoheimuta/items/b17bfbac17c02d410f54

jwt-goパッケージの公式

https://github.com/dgrijalva/jwt-go

## ミドルウェア
https://qiita.com/tobita0000/items/d2309cc3f0dd32006ead

# TEST
### GoのTEST 基本
簡単にまとめられた記事
[[Go] テストを実行する(go testの利用)](https://www.yoheim.net/blog.php?q=20170903&fbclid=IwAR3tb_IJ-GJFirAfRfEb-iVUrA4Lv2pmr4q4lA5E_BDFTBvq3y5zvb9IvMk)

より詳しい記事

https://devel

元記事を表示

GoでWebサーバーを作成する3

# はじめに
Golangをもちいてapiサーバーを作成するさいに調べたことをまとめます。

## Golangの基礎
### ポインタについて
ポインタは変数の値ではなく、変数が格納されてるアドレスをわたす。
引数やレシーバを関数内で書き換える必要がある場合や、大きな構造体や配列を扱う場合に使用するとよい。

https://zenn.dev/uji/articles/f6ab9a06320294146733

&は、変数からそのポインタを抽出するのに使用する。
*はポインタが指し示す変数の実体を抽出する。
*はポインタ型の宣言をするときに使用する。

https://qiita.com/tmzkysk/items/1b73eaf415fee91aaad3

### 変数の初期値
golangでは、明示的な初期値なしで宣言された変数にはゼロ値が与えられます。

https://go.dev/tour/basics/12
https://qiita.com/tenntenn/items/c55095585af64ca28ab5

### 委譲 embedded
GOでは継承は使えない 

元記事を表示

ClickCaptchaの突破方法

1 CAPTCHA画像をダウンロードします。

2 画像を [API](/api-docs#solving_clickcaptcha) に送信します。

## SDKを使用する場合 (推奨):

PHP

“`php
// https://github.com/2captchacom/2captcha-php

require(__DIR__ . ‘/../src/autoloader.php’);

$solver = new \TwoCaptcha\TwoCaptcha(‘YOUR_API_KEY’);

try {
$result = $solver->coordinates([
‘file’ => ‘path/to/captcha.jpg’,
‘lang’ => ‘en’,
]);
} catch (\Exception $e) {
die($e->getMessage());

元記事を表示

Goでベンチマークテスト

# 概要
この記事は、[CyberAgent PTA Advent Calendar 2022](https://adventar.org/calendars/7539)の12日目の記事です。
広告プロダクトチームでサーバーサイドエンジニアをやっています。
Golangの広告プロダクト実装において、システムパフォーマンスも意識しながら実装をしていたため、今回はGoにベンチマークテストについて書きます。

# Go Benchmark
Goのtestingパッケージには、ベンチマークを行う機能が提供されています。
“`go
func BenchmarkXxx(*testing.B)
“`
のように、関数の接頭辞に`Benchmark`を付けることで、ベンチマークテスト用の関数として見なされます。
`go test`に`-bench`フラグを付けることで実行可能です。

ベンチマーク用関数のサンプルは下記で、
“`go
func BenchmarkRandInt(b *testing.B) {
for i := 0; i < b.N; i++ { rand.I

元記事を表示

GoアプリのGoバージョンを1.11から1.19まで段階的かつ一気に上げた話

**\\\ みんせつ Advent Calendar 2022の第3日目の記事です ///**

[みんせつ Advent Calendar 2022](https://qiita.com/advent-calendar/2022/msetsu)

昨日の記事はHerokuについて(仮)ですが、一昨日の記事は「[みんせつエンジニアリングブログを開始するわけ](https://qiita.com/msetsu/items/cdab9c841d96cd4aa4c1)」でした。

Goが大好きなT郎です。

みんせつでは[創業当初](https://qiita.com/msetsu/items/cdab9c841d96cd4aa4c1)よりRuby on RailsでWebサービスを開発しておりましたが、一部のサービスにおいてGoのアプリを実装・運用しています。

## 作業の大変さの見積もり

着手する前に工数の見積もりをしました。Goのminor versionのアップデートは過去に定期的にやっていたこともあるので、1アップデートを9-10回繰り返すというサブタスクを頭に描き、

元記事を表示

reCAPTCHA V2の突破方法

1. ブラウザで開発者コンソールを開き、`data-sitekey`属性を持つ要素を見つけます。

“`html

“`

2. `sitekey`と`pageurl`を [API](/api-docs#solving_recaptchav2_new)に送信します。

## SDK を使用する場合 (推奨):

PHP

“`php
// https://github.com/2captchacom/2captcha-php

require(__DIR__ . ‘/../src/autoloader.php’);

$solver = new \TwoCaptcha\TwoCaptcha(‘YOUR_API_KEY’);

try {
$result = $

元記事を表示

HLSクライアントをgolangで書いた

# はじめに
この記事は[セーフィー株式会社 Advent Calendar 2022](https://qiita.com/advent-calendar/2022/safie) の12月12日の記事です.

弊社では監視カメラのクラウドサービスを提供しており、映像の配信も自分達で実装しています.
その種類は現在のところ3種類(HLS,WebRTC,YouTube Live)です.
今回はその中の1つである HLSのクライアントをgolangにて実装する機会があったため簡単に紹介します.

[実装したHLSクライアント](https://github.com/kawaway/hls_downloader) です.

# HLSとは
HLSは HTTP Live Streaming の略で、動画(映像・音声)をHTTP上でストリーミングするためのプロトコルです.
その基本的な仕組みは難しくなく、サーバーにて動画をある単位で分割し、クライアントはそれをダウンロードして再生するというものです.
その際、動画のファイル数や、再生時間等の情報が無いと、いつまでダウンロードすればいいかがわからな

元記事を表示

【Go】net/httpパッケージで非推奨のTemporaryの扱いについて

## はじめに

こちらは[Kyash Advent Calendar 2022](https://adventar.org/calendars/7407) の 13 日目の記事です。

今年の 11 月に Kyash に入社しました!サーバサイドチームの[uehara](https://twitter.com/_uhzz_)です:wave:

今回は`net/http`パッケージの非推奨メソッドである`Temporary()`について、社のメンバーから知見を共有してもらったのでその話をします。

## net/http パッケージの 非推奨メソッド Temporary() について

`Temporary()`については、フューチャー社の記事にわかりやすくまとめられています。

https://future-architect.github.io/articles/20220203a/

上記の記事を踏まえて、ここでは非推奨になった経緯と対応について言及します。

サッと概要を書くと、`Temporary()`は`net.Error`インターフェースに定義されているメソッドで、一時的

元記事を表示

1年半の新サービスBackend開発の振り返り (失敗とその先)

引越し侍の新サービスのバックエンドの1年半の開発を振り返ってみました。:santa_tone2:

使っている技術と全体的なアーキテクチャについては以下の記事をご参考ください。
(2021年アドベントカレンダー:christmas_tree:の記事です)

https://qiita.com/sho-hata/items/054c77392cc61bc2f3ac

## 主に話す内容は?
バックエンドというと「データ設計」「ソフトウェアアーキテクチャ」「インフラ構成」など範囲が広いですが、この記事では**Goで開発しているAPIサーバーのソフトウェアのアーキテクチャ**だけフォーカスします。

## どんな構成になっているか

[Clean Architecture](https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html)に寄せたレイヤードアーキテクチャになっています。

主な役割としてはDBから単純なデータ取得、保存だけでは表現できないビジネスロジックをREST APIとして提供して

元記事を表示

Goでハッカソン

# はじめに
僕が今日までにハッカソンに参加して、どういうことがあったのか書こうと思います。

# 自己紹介
* 生命医科学系の学部
* 高専卒
* Atcoder茶

# はじめてのハッカソン
元々僕は競プロをやっていて、毎週土日をatcoderに捧げる日々を過ごしていました。atcoderは茶色に行ってicpcも本選に出場することができましたが、サマーインターンでいくつかの企業に応募した時にほとんど書類選考が通らなくて、競プロはなんか違うんだろうなと思って、Goの勉強を始めました。Goの勉強は「Goプログラミング実践入門 標準ライブラリでゼロからWebアプリを作る」という本でやっていました。それで初めて技育展に出て、先輩に教えてもらいながら初めてバックエンドとしてプロダクトを作りました。
競プロとは違った面白さがあったし、色々と初めて触ったものが多かったのでとても面白かったです。賞は取れませんでしたが、チームメンバーと一つのプロダクトを作ったのはとても貴重な経験でした。
リファクタリングでテストも書けたし、全部標準ライブラリできました。標準ライブラリで作ったことは面接でいいねと言わ

元記事を表示

Goのユーザー定義型のベースを何にするか

この記事は[トレタ Advent Calendar 2022](https://qiita.com/advent-calendar/2022/toreta)の9日目の記事です。

こんにちは。トレタでサーバーサイドエンジニアをしている川村です。

私が担当しているプロジェクトでは、MVCに少し要素を足したような構造からクリーンアーキテクチャを意識した構造へと変更するリファクタリングを実施しています。
その一環として値オブジェクトを導入しており、このオブジェクトを作っていくなかで「どっちがいいんだ?」とちょっともやもやしていたことがあったので、アドカレを機会に検討しました。

# 2通りのオブジェクト定義
なにかの名前(文字列)用の型を作ろうと思った時、以下2通りの作り方があるかと思います。
*判別のために型名の後半にベースの型名をつけてます
– stringをベースにした型
stringとして取得する関数とコンストラクタも定義してます。
“`go
type NameString string

func (ns *NameString) String() string {
retur

元記事を表示

Goで保存時にimport文が消える…

最近Goを書き始めて見たのだが,Goは言語単位でフォーマッタが搭載されているらしくこれが大変不便で困っていた.

例えばこのような文を書いていたとき…

“`go
package main

import “fmt”

func main() {
fmt.Println(“Hello world”)
}
“`

保存すると何故かimportの部分が消えてこんな感じになってしまいました

“`go
package main

func main() {
fmt.Println(“Hello world”)
}
“`

いろいろ解決方法はあるみたいですが,まず設定からgoのformaterをgofmtに変更してみましたが効果はなし

以下の質問によると,importは自動で書かれるから自分で書くのはだめらしい.
[https://teratail.com/questions/278344](https://teratail.com/questions/278344)

なるほど

実際にimportを書かずにそのままfmt.Printlnを書くと自動でimportされ,保存し

元記事を表示

Goのポインタ渡しは値渡しよりパフォーマンスが良いという誤解

この記事は MicroAd Advent Calendar 2022 の12日目の記事です。

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

「Goのポインタは8バイトだから、ちょっとした構造体を値渡しでコピーするよりポインタで渡した方が早くなる」

長らくそう思い込んでいたのですが、以下の記事でポインタ渡しには意外なデメリットが多いことを知り、誤解だと気づきました。

https://segment.com/blog/allocation-efficiency-in-high-performance-go-services/

この記事では自分なりにポインタのデメリットをまとめつつ、ポインタ渡しで本当に良いのかを確認すべきパターンを紹介しようと思います。

## ポインタが実は高価な理由
– ポインタが指す値にアクセスする際にnilかどうかのチェックが必ず入る
– ポインタがnilの場合、Goはpanic()をおこす必要があるため
– ポインタは動的メモリアロケーションの原因になりがち
– ポインタが指す値はヒープ領域に置か

元記事を表示

Go 1.15 → 1.19

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

弊社が運営する外資就活ドットコムではバックエンドに`Go`を採用しています。
`Go`のバージョンが`1.15`のままとなっていたので`1.19`にバージョンを上げたのですが、本記事ではバージョンアップの際に行った変更を備忘録的なものとしてまとめておこうと思います。

# Goのバージョンアップ(1.15->1.19)
手始めに`Dockerfile`を
“`Dockerfile
FROM golang:1.15.3
“`
から
“`Dockerfile
FROM golang:1.19.3
“`
にバージョンの指定を変更しました。

これだけでうまく動いてくれればよかったのですが、そううまく事は運ばずmodule関連の変更も必要でした。
具体的には
– `go get`がDeprecatedされたことへの対応
– `go get`から`go install

元記事を表示

OTHERカテゴリの最新記事