Go関連のことを調べてみた2023年01月16日

Go関連のことを調べてみた2023年01月16日

Goで値渡しとポイント渡しのベンチマーク比較

# 条件
インライン化しないように指定(go:noinline)

下記の条件の組み合わせベンチマークテスト実行
+ ワード(1word=64bit)数 1~10
+ 関数 or 値レシーバ or ポインタレシーバ
+ 引数1~3、戻り値0~2

# 結果

https://github.com/shunsukuda/go-val_vs_ptr/blob/main/bench_result.txt

https://github.com/shunsukuda/go-val_vs_ptr/blob/main/bench_global_result.txt

+ ポインタのみの場合は常に一定
+ 引数と戻り値の数が少ない内は5~6ワード目まで差は小さい
+ 引数と戻り値の数が多くなると2ワード目からでも2倍程度の差になる
+ 2ワード以上の場合は素直にポインタを使用するほうが無難
+ ヒープ割り当て発生時は要計測

元記事を表示

PHPerが学ぶGo言語② 関数・構造体

豚さんです。
今回は関数・構造体について書いていきます。

Go言語にはクラスが存在しないという事前知識はあり、
代わりに構造体というものが存在するということは
調べて何となく知っている所からスタートです。

まずは、関数の説明を書いていき構造体の説明に移っていきます。

※ 注意:内容はPHPか何かの言語を書いたことがある方向けなので、
説明を割愛している箇所は多々ありますので、ご了承ください。

**go version go1.19.4 darwin/amd64**

# 1. 関数
前回の記事では、とりあえずmain関数で実行していましたが
どういうことか理解していませんでした。
Go言語はmainパッケージのmain関数で実行されるんですね。
“`sample.go
// Goのプログラムはmainパッケージから実行する
package main

import “fmt”

func main() {
fmt.Println(“テスト”)
}
“`
“`
$ go run sample.go
テスト
“`

では、

元記事を表示

Goのファイルシステム(io/fs)を実装してみる

## はじめに

Goの`io/fs`パッケージはファイルシステムを抽象化してプログラム内で扱えるようにするためのインターフェイスを提供するもので、Go 1.16から利用可能になりました。

今回はこのパッケージの理解のために、あらかじめ用意した固定内容を返却する仮想的なファイルシステムを実装してみます。

## ゴール

下記の内容を読み取ることができるように`fs.FS`を実装します。

| ファイルパス | 内容 |
|:-|:-|
| `foo` | (ディレクトリ) |
| `foo/bar` | `hello` |
| `foo/baz` | `world` |
| `foo/qux` | (ディレクトリ) |
| `foo/qux/quux` | `hello world` |

また、実装したファイルシステムが期待通りに動作していることを確認するために`http.FileServer`を利用してブラウザ上でファイルの内容を確認できるようにします。

## 実装すべきインターフェイス

下記はGoのファイルシステムを実装する上で必須となるものです。

* [`fs.FS

元記事を表示

Dapr Actor Componentの逐次実行はどこで保証されている?

# TL; DR

Actor実行時に一意なキーを発行しロックすることで、同じIDのアクターが同時に2つ以上起動しないようにしている

https://github.com/dapr/dapr/blob/e6ba9d0f3d2e71959342392d6ab9d835a0758fd2/pkg/actors/actors.go#L434

# はじめに

DaprのActor Componentは、ターンベースのアクセスモデルを採用しています。各アクターはメッセージを逐次的に処理するため、あるタイプ、IDのアクターは常に1つの呼び出ししか処理しません。
言い換えると、**アクターのメソッドで状態更新の競合を考慮する必要が無くなります**。

https://learn.microsoft.com/ja-jp/dotnet/architecture/dapr-for-net-developers/actors#turn-based-access-model

“`csharp:上記ページより引用
public async Task IncrementAsync()
{

元記事を表示

【Golang】バイトデータ内のビット 1 の数を数える【ハミング距離】

> [バイト](https://ja.wikipedia.org/wiki/%E3%83%90%E3%82%A4%E3%83%88_(%E6%83%85%E5%A0%B1))・データの[ハミング距離](https://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%9F%E3%83%B3%E3%82%B0%E8%B7%9D%E9%9B%A2)を算出するため、**データのビットが 1 の数を数えたい**。
>
> “`go
> int(123) = (0b10000000) —> 1 個 // ハミング距離 = 1
> int(240) = (0b11110000) —> 4 個 // ハミング距離 = 4
> int(255) = (0b11111111) —> 8 個 // ハミング距離 = 8
> “`

## TL; DR (今北産業)

1. [math/bits](https://pkg.go.dev/math/bits#OnesCount) パッケージの [OnesCount](http

元記事を表示

Go でホストのプライマリ IP アドレスを取得する (Linux)

[`github.com/google/gopacket/routing`](https://pkg.go.dev/github.com/google/gopacket@v1.1.19/routing) パッケージを使う.
インターネット上のホストへの経路とソース IP アドレスを取得することができる.

:::note warn
Linux しか対応していない模様
:::

“`main.go
package main

import (
“fmt”
“net”

“github.com/google/gopacket/routing”
)

func main() {
router, _ := routing.New()
internetHost := net.IP{8, 8, 8, 8}
_, _, primaryIp, _ := router.Route(internetHost)

fmt.Printf(“ip = %v\n”, primaryIp)
}
“`

## `out of order iface…` のエラーが出る時

Docker など

元記事を表示

スライスからスライスを作成して、appendしたときの挙動が想像と違った

あるスライスからインデックス指定で新しいスライスを作ってから、appendで要素を追加した場合、
新しいスライスにしか影響を与えないと思っていたのだが、必ずしもそうではないらしい。
以下はversion 1.19.2で検証した結果である。

“`golang
package main

import “fmt”

func main() {
nums1 := []int{1, 2, 3, 4, 5}
s1 := nums1[:4]
fmt.Printf(“len = %d, cap = %d\n”, len(s1), cap(s1))

s1 = append(s1, 6) // (1)
s1[0] = 10 // (2)
s1 = append(s1, 7) // (3)
s1[1] = 20 // (4)

fmt.Printf(“nums1 = %v\n”, nums1)
fmt.Printf(“s1 = %v\n”, s1)
}
“`

“`bash
# 出力結果
len = 4, cap = 5
nums1 = [

元記事を表示

mackerel-agent-plugin に Pull Request してみたかった

# TL;DR

自分の調査能力が甘すぎて完全に無駄な開発と記事作成をしてしまったので供養のために。読む価値はあまりありません。
Mackerel の plugin は [公式リポジトリ](https://github.com/mackerelio/mackerel-agent-plugins) だけじゃなく [plugin registry](https://github.com/mackerelio/plugin-registry) も探しましょう。
あと、今は公式リポジトリではなく plugin registry に PR を出すものらしいです。
ちゃんと公式のドキュメントを読んで、既存のプラグインを探してから開発しましょう。

# 背景

Go で Slack に常駐する bot をいくつか書いたり、mackerel にカスタムメトリックを投稿するスクリプトを書いたりということができるようになってきたあたりで、passenger のリソース使用量を監視する必要が生じた。
普段は自社サービス・サーバへゴリゴリにロックインした雑なカスタムメトリックばかり作っていたので特に OSS

元記事を表示

GraphQLのschema.graphqlsファイルをバックエンドとフロントエンドで同期するベタープラクティス

# この記事は何か?
フロントエンドとバックエンドをGraphQL APIで連携する場合、スキーマファイル(schema.graphqls)をどうやって連携するか悩んでいました。
色々と試行錯誤して、ベストプラクティスとまでは言えないまでもベタープラクティスに近い解決策に至ったので共有してみます。

# 構成
バックエンドは Go, Gin, gplgen、
フロントエンドは TypeScript, React, Next.js

のSPA構成でそれぞれ別リポジトリで管理しています。

# やりたいこと
バックエンドとフロントエンドでschema.graphqlsファイルから型を自動生成したい。
※ schema.graphqlsファイルの管理はバックエンドが主導で行う前提です。

# やりたくないこと
graphqlsファイルの二重管理。バックエンドの差分を逐一フロントエンドでコピーして追従、というケースだけは避けたい。

# 辿り着いたベタープラクティス
バックエンドでは、[gplgen](https://gqlgen.com/)のコマンドによりGoの型を自動生成し、
フロントエン

元記事を表示

Go:健康データの簡易APIサーバーの作り始め

作成:2023年1月11日

体重など健康データを保存するアプリとバックエンドを作ってみたく、Go でバックエンドを作成する為の情報収集と練習の為に、バックエンドをシンプルなGo言語で書いてみます。

# 事前準備

Postmanをインストールしておきます([参考リンク](https://qiita.com/nlog2n2/items/b5e11332087c335e126e))

# 簡易APIサーバー

GETするコードです(githubのコード置き場:[qiita20210111](https://github.com/ryoyuki6/go-api202301/blob/qiita20230111/main.go))
“`go:main.go
package main

import (
“bytes”
“encoding/json”
“fmt”
“log”
“net/http”
“time”
)

type HealthData struct {
UserID int `json:”user_id”`
Weifgt float64

元記事を表示

Goの並行処理に関して簡単にまとめてみた

## 初めに
[A Tour of Go](https://go-tour-jp.appspot.com/concurrency/1Go)の「Concurrency」項目を終了したので、簡単にGoの並行処理に関してまとめました。
今回は簡単な挙動をまとめたものになるので、詳細に理解したい場合は[Go言語による並行処理](https://www.oreilly.co.jp/books/9784873118468/)等の書籍を読むのも良いと思いました。

## 基本的な挙動
Goはgoroutineという軽量のスレッドを作成して並行処理を行います。
goroutineは下記のコードで作成できます。
“`go
go 関数呼び出し
“`

Goは通常の処理にもgoroutineを使用します。
下記だと、最初にmainのgoroutineが作成され、`go say(“new goroutine”)`のコードで新しいgoroutineが作成されます。
そのため、下記ではmainのgoroutineと新しいgoroutineの2つが動作していることになります。

“`go
func say(s

元記事を表示

PHPerが学ぶGo言語① 変数・定数・配列

どうも、豚さんです。
今回はGo言語に関して書いていきます。

今回もPythonみたいに深く触れずに記事を書いていきたいと思います。
Pythonの記事同様、変数から配列の記事で始めていきます。

公式サイトのサンプルソースを変えて使っています。

プログラムは *func main() {}* の中を見てください。
**あくまで変数〜配列についてです。**
それ以外はまだ理解していないので、ご了承ください。

※ 注意:内容はPHPか何かの言語を書いたことがある方向けなので、
説明を割愛している箇所は多々ありますので、ご了承ください。

**go version go1.19.4 darwin/amd64**

# 1. 変数
変数宣言時は「var 変数名 型名」で宣言します。
値を代入しない時の初期値はint型だと0、とstring型だと””です。
“`sample.go
package main

import “fmt”

func main() {
// 型が明確な場合は、型の記載が不要
var num int
va

元記事を表示

【ド基礎】Goコマンドをフローで整理する

GoのDocker環境を立てている時に `go install` と `go mod tidy`の厳密な動作内容などでつまづいたのでフローで整理しておきます。正しいんだろうかと悩んでいるのでお気軽にツッコミください。

![スクリーンショット 2023-01-09 10.50.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/893208/f81fa14f-ef74-0a91-77d3-fc593923063f.png)

# `go install`

外部のモジュールを新しく導入したい時に使う。ただソースコードをダウンロードしてくるだけではなく、ダウンロードしたモジュールを実行可能なバイナリにビルドもしてくれるコマンド。

ってことは差分が `go install` しただけであれば理論上は `go build` しなくて良い?

# `go mod tidy`

go.modファイルとソースコードとの整合を取ってくれるコマンド。go.modとgo.sumに必要なエントリを加え不要なエントリを削除

元記事を表示

Go x MySQLのDocker環境でconnect: can’t assign requested addressというエラーが出たときの対処法

# エラー内容
Dockerで作ったGo x MySQL環境内でDBを作成するため、以下コマンドを実行しました。
“`zsh: ターミナル
docker compose up -d –build
go run main.go
“`

で以下エラーが発生しました。

“`zsh: ターミナル
[error] failed to initialize database, got error dial tcp :0: connect: can’t assign requested address
panic: DB Error: dial tcp :0: connect: can’t assign requested address
“`

## 結論
`docker container exec -it server /bin/sh`でコンテナに入ってから、`go run main.go`しました。

“`zsh:ターミナル
% docker container exec -it server /bin/sh
/go/src/ToDoList-Server # go run m

元記事を表示

各言語のコンテナ

# これは何?

コンテナクラスとかコレクションライブラリとか呼ばれるものの各言語の対応について知りたくなったので、調べた。

# コンテナの色々

思いつく限り書いていくと。

* 配列・vector・slice
* リンクリスト
* 双方向リスト
* 単方向リスト
* deque
* ring buffer
* 辞書 / 集合 / マルチ辞書 / マルチ集合
* 順序がないやつ
* 順序があるやつ
* 挿入削除が速いやつ
* 挿入削除が遅いやつ

当然全部網羅とかはありえないわけだけど、これぐらいで。

## 配列・vector・slice

要素をダラダラ並べた感じ。
インデックスアクセスが速い。末尾への追加もたいてい速い。
末尾以外に追加削除すると時間がかかる。

配列 (Array) と呼ばれることもあるし、vector と呼ばれることも Slice と呼ばれることもある。

List と呼ばれることもある。私はリンクリストを先に想像するのでそう呼びたくはないんだけれども。

## リンクリスト

「次はここ」という情報で要素をたどる。
双方向

元記事を表示

Nix Flakes による Go + Protocol Buffers 開発環境の紹介

# Nix Flakes による Go + Protocol Buffers 開発環境の紹介

## 概要

Nix パッケージマネージャの機能の一つである **Nix Flakes** を使って, Go 言語における Protocol Buffers を扱える開発環境を構築したときのメモです.理解した内容の整理も兼ねて公開します.

Nix に関連する日本語の情報はとても少ないため,布教の目的で Nix 自身についての簡単な紹介もします.
実用的な使用例をみてもらうことで,興味を持っていただける人がいたら嬉しいです.
それに加えて Protocol Buffers についての紹介を行い (#技術的背景),本題に入ります.

※この記事の内容は筆者の理解で書かれています.
自分自身使いながら覚えていっているので,もし間違っている点などあればご指摘いただけると嬉しいです.

## 技術的背景

Nix / NixOS / Nix Flakes, Protocol Buffers についての紹介を行います.
Nix 関連については過去にも似たような [紹介記事](https

元記事を表示

GraphQL と gRPC で通信する Go 製のマイクロサービスをセットアップする

## 背景
年末年始に Go を勉強したので、 GraphQL と gRPC のサンプル実装を作ってみた。

## 作りたいもの
– フロントエンドから gateway 間を GraphQL で通信する
– gateway とバックエンドサービス間を gRPC で通信する

“`mermaid
graph TD;
ブラウザ –> graphql-gateway
graphql-gateway –> grpc-user-service
“`

## 前提知識
### GraphQL
– 独自のクエリ言語を用いて、フロントエンドで必要なリソース・プロパティだけを柔軟に取得できる
– スキーマ定義をフロントエンドとバックエンドで共有できるので変更にも強い
– https://graphql.org

### gRPC
– 独自のプロトコルを用いてバックエンドサービス間の高速な通信を実現できる
– 同じランタイム内の関数を呼ぶ感覚でバックエンドの処理を呼ぶことができ、様々な言語・フレームワークで実装されたサービスをシームレスに接続できる
– スキーマ定義をクライアントと

元記事を表示

DynamoDBで1:nのデータ構造を表現する

こんにちは太郎です。
最近、DynamoDBを触る機会があり1:nのデータ構造を表現しようとしました。
しかし、DynamoDB特有の設計方法に戸惑ったのでメモを残します。

## 前提条件
この先は例を挙げながら進めます。
ひとつのチームに複数の選手が所属しているという想定です。
チームの一覧を表示する画面と属する選手の一覧を表示する画面があります。
DynamoDBではRDBとは違い、どのようにデータにアクセスするのか次第で構造がかなり変わるため、最初にユースケースをリストアップすることが重要になってきます。

### テーブル設計
RDBで設計するなら2つテーブルを作って、一方が片方を参照しているという設計が一般的かと思います。
しかし、DynamoDBではテーブルの数は極力減らすという方針があります。
それぞれの一覧が取得できるように以下のような設計にしました。

| ID(PK) | dataType(GSI) | teamName | memberName | teamID |
| – | – | – | – | – |
| 1 | team | teamA |
| 2 |

元記事を表示

【Vue.js + golang】ログイン機能をdockerで構築

## はじめに
フロントの描画をvue、バックエンドをgolangで実装し、ログイン機能を実現したものをgithubで公開しました。
https://github.com/rirma/vue_golang_framework

Vue.jsとgolangで構築している記事は何個か見かけましたが、そのまま使えるログイン・ログアウトの機能を実装しているものや、dockerで開発できる環境をgitで公開してくれているものが存在しなかったため構築しました。

今回は、公開した機能一式の説明をします。

## 環境
+ PC: MacBook Pro (15-inch, 2019)
+ OS: Monterey
+ golang: ver1.17
+ Vue: ver3.2.13

goのフレームワーク
Webフレームワーク: gin
DB接続関連: gorm

LaravelライクなMVCモデルを目指して構築しています。

試される方いらっしゃいましたらまずはgithub記載の手順に沿ってVueのコンパイル、及びgolangサーバの立ち上げを行なってください。

## 画面
### ログイン画

元記事を表示

PCでKindleの書籍リストを取得するGo言語のコード

Kindle for PCが持つ情報を使って、Kindleの書籍リストを取得するGo言語のコードです。Gistにはっつけてたものです([extkindlecache.go](https://gist.github.com/hoshimin108/795b5010733136b7521e569331debda6 “extkindlecache.go”))。昔はQiitaにGist連携なんてものがあったようですが、いまは無くなったみたいですね。

[Kindle蔵書一覧を出力するツール作成時の工夫](https://qiita.com/tsukasa_labz/items/08d6217723941fd139b3 “Kindle蔵書一覧を出力するツール作成時の工夫”)で紹介されているアプリケーションを使うのが便利かと思いますが、Go言語を使っている人で自分でやってみたいかたには役に立つんでは無いかな?と思い記事を書きました。

macOSを使っている人は[Kindle for Macの情報を使って蔵書一覧を作成する](https://namaraii.com/post/2022/20220

元記事を表示

OTHERカテゴリの最新記事