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

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

“テストカバレッジ強制ギプス” 導入

## テストカバレッジ強制ギプスとは

* テストカバレッジが**基準値以下ならマージをできなくしてしまう**機構のこと (をこの記事で勝手にそう呼んでいます)
* この記事では、**Go のプロジェクト**を運用されている方を対象に**テストカバレッジ強制ギプス**を**15分**で導入できるように紹介します
* 具体的には、CI でテストカバレッジを計測して、[基準値以下なら fail](https://github.com/nrnrk/gotestcoveragecheck/pull/1) にさせるようにします
* テストカバレッジ強制ギプスを導入して、単体テストを充実させ快適な開発ライフを楽しみましょう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150399/f6763328-6da4-ad39-164e-35a20f94b422.png)

## 背景

私のチームでは、 Go を用いたバックエンドサービスの開発をしています。その開発の中で、テストに関していくつ

元記事を表示

【Go】学習メモ② ~Goroutine, Channel~

#はじめに
前回の学習メモの続きです。
GoroutineとChannelについてまとめました。

https://qiita.com/suzuki0430/items/6674ffa239dc539e0fd7

#シリアル処理
本題の前に、シリアル処理についてまとめます。
まずは以下のように、5つのリンクにhttpリクエストが正常に送られるかどうかをチェックするコードを考えます。

“`go:main.go
func main() {
links := []string {
“http://google.com”,
“http://facebook.com”,
“http://stackoverflow.com”,
“http://golang.org”,
“http://amazon.com”,
}

for _, link := range links {
checkLink(link)
}
}

func checkLink(link string) {
_, err := http.Get(link)
if err != nil {

元記事を表示

クイックソートとヒープソートとシェルソートとGoのソートと

# はじめに
7年ぶりくらいにアルゴリズムとデータ構造を勉強し直しています。

シェルソートなんてものもあったなーと名前すら忘れているアルゴリズムもあったりと、良い復習になったのですが、ソートに関していうと、様々なソート手法を紹介した後に、「言語の標準のソート実装はクイックソートがベースになっていることが多いです」で説明が終わっていることが多い気がします。

Goのソート実装がどのようになっているか気になり実装を確認したのでまとめたいと思います。
Goは通常の`Sort`と安定ソート(同じ値が元順序を維持する制約がつくもの)である`Stable`を提供しますが、`Sort`のみ取り扱います。

`Sort`実装はクイックソートとヒープソートとシェルソートを柔軟に使い分けてます。それぞれのソート手法のポイントを簡単に説明したうえで最後にGoの`Sort`実装を紹介したいと思います。

# クイックソート
ポイントはなんといってもpivotの選択と部分ファイル(pivotをもとに分割されたファイルを指す)の構築方法です。

### pivot
単純に端の要素をpivotとしてしまってはソー

元記事を表示

自分の作ったモジュールをインストール時に”module declares its path as:”というエラーが出た

### エラー

“`
> go get github.com/okaponta/slack-kintai
go get: github.com/okaponta/slack-kintai@v1.1.0: parsing go.mod:
module declares its path as: slack-kintai
but was required as: github.com/okaponta/slack-kintai
“`

### 原因

`go.mod`宣言時にモジュール名を外部公開を想定しない名前にしていたため発生しておりました。

`go mod init hogehoge`の`hogehoge`に`importpath`を入力するべきなのですが、リポジトリ名をいれていたため、外部から`go get`できなくなっておりました。
今回は外部公開する予定ですので、`github.com/okaponta/hogehoge`のように`github.com`のユーザつきで宣言するのが正解みたいです。

修正完了後は再度タグ切るのを忘れずに・・・!!(私は

元記事を表示

football-data.orgのAPIでサッカーのデータを取得する

サッカーチームや試合のデータをAPIで取得できないか?と思ったので探した結果よさそうなAPIサービスがあったのでデータ取得までまとめます。

## API概要
https://www.football-data.org/

今回使ってみるAPI。アカウント登録すれば無料枠で12のコンペティション(5大リーグやCLなど)のデータを取得できる。[詳細は公式ページ](https://www.football-data.org/)にて

## アカウント登録

[登録画面](https://www.football-data.org/client/register)から名前、メールアドレス、言語を選んで登録。利用規約はしっかり読むこと!

@football-data.orgのメールアドレスからAPIトークンが送られてくる。

## データ取得

[公式ドキュメント](https://www.football-data.org/documentation/api)を参考に。今回はGO言語でサッカー史上最もクールなクラブチームを取得するように実装しました。

“`golang
package

元記事を表示

json.Marshalの基礎理解

## 構造体 → json → 構造体

“`go

package main

import (
“encoding/json”
“fmt”
)

// 横に`json:~`でjsonにした時のキーを記載
type Friend struct {
Name string `json:”name_json”`
Age int `json:”age_json”`
}

func main() {
F := Friend{
Name: “murama”,
Age: 44,
}

fmt.Println(“F: “, F)

// 構造体からjsonへ
j, err := json.Marshal(F)
if err != nil {
panic(err)
}
// string型に変換しないとbyte型で表示される。
fmt.Println(“j: “, j)
fmt.Println(“string(j): “, string(j))

// 受皿となる空の構造体を作る。
new_s := Friend{}
fmt.Pri

元記事を表示

【Go】学習メモ① ~Structs, ポインタ, Slice, Map, Interface~

#はじめに
調べれば星の数ほどでてくるGoの基礎をあえて自分用にまとめました。
現業のフロントエンドだけではなくバックエンドにも磨きをかけたいというのがGoの学習目的です。
基礎学習後は個人サービスつくって実践していきたいなと思っています。

#Structs(構造体)
Goにはオブジェクト指向言語におけるClassがなく、その代わりにStructs(構造体)というものが存在します。
Structs型の変数を定義すると、Structsに定義されている各フィールドに必要なメモリ領域が確保され、それぞれのフィールドは型に合わせた初期値をとります。

例えば、以下のように`person`というStructsをつくり、初期値を設定せずにそのまま出力してみます。

“`go:main.go
package main

import “fmt”

type person struct {
firstName string
lastName string
}

func main() {
mrSasuke := person{}
mrSasuke.print()
}

func (p pe

元記事を表示

fmt.Printfは中身をstringしないとエラーになる

go言語でfmt.Printfを扱う時にint型を表示しようとしてエラー出してしまうので、備忘録

“`go

package main

import (
“fmt”
“strconv”
)

func main() {

var s string = “5”
// int型に変換
i, _ := strconv.Atoi(s)

fmt.Printf(i) # こちらはエラーになる
// fmt.Printf(“%v”, i) # こちらはエラーにならない

}

“`

実行結果

“`

# command-line-arguments
.\main.go:17:12: cannot use i (type int) as type string in argument to fmt.Printf

“`

元記事を表示

go チャネルから送る値がなくなっても チャネルから値を繰り返し受信し続けることによるエラーの確認。

closeしない場合のエラー内容確認

“`go

package main

import “fmt”

func routine1(int_slice []int, channel_kun chan int) {
sum := 0
for _, v := range int_slice {
sum += v
channel_kun <- sum } // close(channel_kun) } func main() { int_slice := []int{1, 2, 3, 4, 5} channel_kun := make(chan int, len(int_slice)) go routine1(int_slice, channel_kun) for i := range channel_kun { fmt.Println(i) } } ``` 実行結果 ``` 1 3 6 10 15 fatal error: all goroutines are asleep - deadlock! goroutine 1 [chan r

元記事を表示

Goの基本

## 前書き

Goを初めて学習する中で大事だと思った点をまとめました。ノート代わりの記事です。

主に[A Tour of Go](https://go-tour-jp.appspot.com/list)を参考にまとめました。

間違っている箇所がある場合は指摘していただけると幸いです。

## Go言語とは

Googleが開発したプログラミング言語。また、オープンソースであり [GitHub](https://github.com/golang) に公開されている。

#### 特徴

– 静的型付け

– コンパイル言語

– メモリ安全性

– ガベージコレクション

– 構造的型付け

– 並列処理

以下からは実際のコードを交えて、基本的な文法を紹介していく。出力はコメントアウトで示している。

## Import Packages

Goのプログラムはmainパッケージから開始されている。

複数のパッケージをインポートするときは、グループ化した方が美しい。

“`go
package main

import (
“fmt”
“math”
)
“`

これ以降

元記事を表示

GO goroutineを玉入れ競争に例えて理解しようとする

## 玉入れ

田中君:1投あたり2秒
鈴木君:1投あたり1秒

ルール
– 先に10球投げた方の勝ち → ゲーム終了
– 玉入れ先は別々

ポイント
– waitするスレッドを1として、1つでも並列スレッドが完了した場合、プログラムを終了させる。

“`go

package main

import (
“fmt”
“strconv”
“sync”
“time”
)

type Tomodachi struct {
name string
per_throw_time int
greeting string
}

var greeting = “よろしくお願いします”

var tanaka = Tomodachi{
name: “tanaka”,
per_throw_time: 2,
greeting: greeting,
}

var suzuki = Tomodachi{
name: “suzuki”,
per_throw_time: 1,
greeting:

元記事を表示

Goをherokuで自動実行する

## はじめに
ついにアドベントカレンダー最終日になってしまいました。
私のクリスマスは帰国によりホテルでの隔離生活であるため、時間だけがありました。

ずっとGoを勉強したかったこともあり、この機会に入門しました。
丁度良いタイミングで中学の頃からの先輩がGoでLIFFアプリを開発していたので、こちらで勉強させていただきました笑。

https://qiita.com/AsuyaKakegawa/items/2e8d27393f2955b32f6f

↑こちらの記事で作成したアプリをherokuにデプロイするところまでします。

## 作成したもの
↓LINEの友達追加から、デモがみれます。
![M_gainfriends_qr.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/648295/77b86edd-4cb3-810d-01cc-f4447865a076.png)
天気予報が雨であれば、毎朝6時に公式アカウントから通知が送られてきます。(写真はテスト実装なので、本来は6:00amになります。)

元記事を表示

後方互換性と和解せよ

# 後方互換性ってなに?

みんな大好き信頼の塊 Wikipedia さんの「[互換性](https://ja.wikipedia.org/wiki/互換性)」の記事によると、後方互換性は以下のように定義されています。

> 古いシステム向けのデータなどが新しいシステムでも全て使用できること。

ソフトウェアの文脈では「ソフトウェアのバージョンをアップしても、それに依存する既存のソフトウェアが正常に動作すること」と読み替えられる場面が多いかと思います。

# Goと後方互換性

Go言語は伝統的に後方互換性を大事にしてきた言語です。それは [Go 自体](https://go.dev/doc/go1compat)についてもそうですが Go を使って書かれたソフトウェアについても Go Modules の導入時に後方互換性について[具体的な指針](https://go.dev/blog/module-compatibility)が打ち出されたりしたこともありました。最近であれば Rob Pike が Go 1.18 について「[標準ライブラリの内部実装は変えずにリリースしよう](http

元記事を表示

New Relic Goエージェントの地雷は踏んでおいたので参考にしてくれ

# はじめに
この記事は[New Relic Advent Calendar 2021](https://qiita.com/advent-calendar/2021/newrelic “New Relic Advent Calendar 2021”)の25日目の記事です。
「[ミイダス](https://miidas.jp/ “ミイダス”)」という転職支援・採用支援サービスで、New Relic Goエージェントを導入した際に踏んだ地雷について、いくつかご紹介したいと思います。

New RelicのGoエージェントはまだ新しいサービスで資料が少ないこともあり、いくつかの地雷を踏むことになるかと思いますが、それを乗り越えるととても幸せな世界が待っています。
弊社のサービスでは、New Relicを活用して、より良いサービスになるよう数々の処理の改善や障害の早期発見などに役立てています。

APIの応答性能やエラー率を監視するダッシュボード作成例
![図1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/

元記事を表示

OpenTelemetryをざっくりと知る

# はじめに

以前マイクロサービスの分散トレーシングを導入する機会を頂き、OpenTelemetryについて色々と調べていました。 そこで今回は備忘録も兼ねて、OpenTelemetryとOpenTelemetry Collectorについて概要をまとめてみました。

# OpenTelemetryとは

OpenTelemetryは、トレース、メトリック、ログなどのテレメトリデータの作成と管理用に設計された、API、SDK、ツール、および統合のセットです。ベンダーに依存しない実装を提供し、選択したバックエンドにテレメトリーデータを送信する方法を標準化することを目的としています。

OpenTracingやOpenCensusの後継にあたる新たな標準化ツールとなります。つい最近ですが、ついにv1.0が公開され、今後テレメトリデータを扱うツールとして広まっていくのではないのでしょうか。

## TraceとSpan

OpenTelemetryにおけるトレース情報は**Trace**と**Span**という概念で定義されています。

**Trace**: あるリクエストに対するSp

元記事を表示

Next.js+Goでクイズアプリを作ってみる

## はじめに

### 概要

インフラエンジニアだった私が、開発の勉強をするためにクイズアプリを開発してみました。文法や実装の仕方の記事はいろいろとあるので、どのように学習したかを重点的に書いています。私の勉強の備忘録の記事になってしまいましたが、勉強方法が分からず困っている人の参考になれば幸いです。

### 対象読者

* 開発の勉強をし始めている人
* Go言語初心者
* Next.js, TypeScriptちょっとわかる人

### 書いたきっかけ

* Go言語の製品やサンプルAppを多く見かけるようになったのでGo言語の勉強をしたくなった
* 部署内で技術用語を確認し合えるサービスがあったらいいなと思った
* Advent Calendarという目標と期限を決めて勉強したかった

### 完成品
いろいろやりたいことはありましたが、とりあえず一問一答までとなりました。
題材はとりあえず私に身近なクラウドネイティブにしてみました。
deepmap/oapi-codegen のカスタムテンプレートで required array が null で返ってしまうのを防ぐ

## はじめに

私が今関わっているプロジェクトでは、サーバーサイドにGo言語を採用し、Webフレームワークとして [labstack/echo](https://echo.labstack.com/) (以下、Echo) を採用しています。また、APIの定義を OpenAPI で行い、OpenAPI の定義から Echo のハンドラを一括登録するための関数やリクエスト/レスポンスの型を生成するために [deepmap/oapi-codegen](https://github.com/deepmap/oapi-codegen)(以下、oapi-codegen)を利用しています。

OpenAPI を利用する目的の一つとして、クライアントとサーバー双方が一意な解釈が可能な API 定義を参照することによって認識の齟齬なく開発を進められるようすることが挙げられます。しかし、 oapi-codegen が生成するコードを使用した際に、 required な array と定義されているプロパティについて null として返却してしまう問題があります。これによって、 OpenAPI による定

元記事を表示

行列の積で見る2次元配列の例(Julia, Go, Rust)

# はじめに

別の言語の例を移植すると意外と考えさせられる。

環境

* The Go Playground (2021-12-23)
* Julia 1.6 (Julia Playground)
* Rust 1.5.7 (Rust Playground; rustc)

Rust は手元に環境があるのだが、サンプル程度でプロジェクトを作ったりのが面倒なときは、Playground を利用する。

## Julia

計算科学用途な言語だけあって、こういうところは強い。
この宣言の時点で行列の型だと決めつけができる。

“`julia
A = [1 2 1; 0 1 1]
B = [1 0; 0 1; 1 1]
println(A*B)
“`

“`
[2 3; 1 2]
“`

## Go

* 2次元配列
関数も含めてサイズを事前に決めておく必要があり、その結果、任意のサイズの行列の積を行う関数が作れない

“`golang
package main

import “fmt”

func mul(a [2][3]int, b [

元記事を表示

sql.Openを別の関数に切り出したら「sql: database is closed」エラー

## エラー内容
“`go:main.go
package main

import (
“database/sql”
“log”

_ “github.com/go-sql-driver/mysql”
)

func main() {
db := DbConnect() // 別の関数へ切り出し

err := db.Ping()
if err != nil {
log.Fatal(err) // → sql: database is closed
}
}

func DbConnect() *sql.DB {
db, err := sql.Open(“mysql”, “root@tcp(localhost)/dbname”)
if err != nil {
log.Fatal(err)
}
defer db.Close()

return db
}
“`
“`sh:zsh
$ go run main.go
2021/12/24 23:59:59 sql: database is closed
exit status 1
“`

## 対処法

元記事を表示

Go言語のinterfaceっぽいC++のクラスを自動生成するツールを作った話

初投稿記事です。

#結論
**・golangのinterfaceみたいなのをc++で自動生成するツール作ったよ**
**~~・よい子のみんなは普通にgolang使おうね~~**

#動機
http通信のライブラリを書いていた
tcpとかsslとかを動的に切り替えたい
継承とかは使いたくない。
なんなら、他人の作った他のプロトコルでも好きにすげ替えたい。~~需要あるのか?~~
golangを勉強する -> interfaceめっちゃ便利
C++でも似たようなことしたい -> [Type Erasure](https://ja.wikipedia.org/wiki/%E5%9E%8B%E6%B6%88%E5%8E%BB)でできるな。
一応できた -> めんどくさいしDRY原則に反するぜ。
**そうだ、自動生成ツールを作ろう!**

#前提:C++におけるType Erasureとは
テンプレートと継承を使って条件を満たす任意の型の値を動的に保持する技法で
標準ライブラリではstd::functionとかstd::anyとかstd::shared_ptrとかで使われている。
下のコードは

元記事を表示

OTHERカテゴリの最新記事