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

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

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 製のマイクロサービスをセットアップする

## 背景
– 今まで Ruby でしかバックエンドを実装してこなかったが、年末年始に Go を勉強してみた
– せっかくなので Ruby では相性が悪かった 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

元記事を表示

proxy-wasm を使って JWT 検証を go 言語で実装できるのか?

proxy-wasm での JWT 検証の実装を通して proxy-wasm でどこまでできるのかを調べた。
proxy-wasm は将来性に期待できる技術なものの、WebAssembly(wasm) のメインの用途はブラウザ上と思われる。
そのため proxy-wasm は発展途上で、現時点では色々な制約・将来性がある中でその魅力・使いやすさなどを知るために触ってみた。

# 要約
– proxy-wasm で JWT 検証を go 言語で実装するのは下記理由で困難だった。おそらく他言語でも同様だと思われる。
– proxy-wasm では tinygo を使う必要があるが、[利用可能な package に制約がある](https://tinygo.org/docs/reference/lang-support/stdlib/)
– proxy-wasm における [http アクセス](https://github.com/proxy-wasm/spec/tree/master/abi-versions/vNEXT#proxy_dispatch_http_call)の

元記事を表示

【Golang】日付の月を数値で取得する

## 結論

“`go:main.go
package main

import (
“fmt”
“time”
)

func main() {

// Januaryなどの英語表記で取得
targetMonthString := time.Now().Month()
fmt.Println(“targetMonthString: “,targetMonthString)

// 1や2などの数値で取得
targetMonthInt := int(time.Now().Month())
fmt.Println(“targetMonthInt: “,targetMonthInt)
}
“`

“`実行結果
~/go/src/jikken$ go run main.go
targetMonthString: January
targetMonthInt: 1
“`

元記事を表示

【Go+gorm】sql.Openとmysql.Openの違い

# はじめに
gorm.Openの第一引数にデータベース接続情報をもったsql.Openの返り値を渡せないことが気になりました。
正しくはmysql.Openを渡してあげることになるのですが、名称も似ていてよく分からなかったので調べてまとめてみます。
“`
gorm.Open(mysql.Open(dbConn), &gorm.Config{})
“`

# 結論
そもそも返り値の型や数が違いました

# sql.Openとmysql.Openの違い

sqlパッケージの公式ドキュメントでは以下のように定義されていました

“`sql.Open
func Open(driverName, dataSourceName string) (*DB, error)
“`

一方、mysqlパッケージの公式ドキュメントでは以下のように定義されていました

“`mysql.Open
func Open(dsn string) gorm.Dialector
“`

また、gormパッケージの公式ドキュメントでは以下のように定義されていました
第一引数のDialector型はmysql.

元記事を表示

go言語 ent migrationメモ

golang + ent のmigrationメモ

“`hoge.go
func (Hoge) Fields() []ent.Field {
return []ent.Field{
field.String(“name”).Optional().Annotations(entsql.Annotation{Size: 200}),
}
}
“`
– null可
.Optional()

– varcharのmax length
.Annotations(entsql.Annotation{Size: 200}),

元記事を表示

gqlgenでDataLoaderを用いてN+1 問題対処 (1対多のデータの取得)【実装編-Part4-2】

# DataLoaderを用いてN+1問題対処(1対多のデータの取得)

:::note warn
間違っている部分、エラーが発生する部分、わかりにくい部分などがございましたら、是非ご指摘をお願い致します。
:::

## 今回はPart5-2になります。

**前回の内容を実装した上での実装になります。**

前回:1対1のデータの取得の際のDataLoaderの実装を行いました。
(todoに紐づいている一人のユーザをDataLoaderを用いて取得しました)

https://qiita.com/shion0625/items/47c2b73c1b2d652d8e6c

## この記事の内容
– 1対多のDataLoaderの実装(ユーザに対して紐づいている複数のTodoをDataLoaderを用いて取得する)

## Github Repo
この記事で紹介するコードはGithubに置いています。

**Part5-2までの切り取り**

https://github.com/shion0625/gqlgen-todos/tree/part5-2

## DataLoader(1

元記事を表示

gqlgenでDataLoaderを用いてN+1 問題対処【実装編-Part4】

# DataLoaderを用いてN+1 問題対処

:::note alert
2023/1/4 20時30分以前のコードのuser.goのBatchGetUsersに不備がございました。
:::

:::note warn
間違っている部分、エラーが発生する部分、わかりにくい部分などがございましたら、是非ご指摘をお願い致します。
:::

## 今回はPart5になります。

**基本的な事をメインに行っているので前回までの内容を知らなくても基本的には問題ありません。前回までの内容をgithubから取得して来ても良いかと思います。(importのgithub.comを調整する必要があるかも知れないですが…)**

前回:一人のユーザから複数のTodoを取得する処理を実装しました。

https://qiita.com/shion0625/items/e59fecfd14843f20bd8b

## この記事の内容
前回一人のユーザから複数のTodoを取得する処理で発覚したN+1問題を対処していきます。
– 前回のおさらい
– DataLoaderの実装

## Github R

元記事を表示

Go で AtCoder を半年やってみたのを思い出す

# はじめに
おはこんハロチャオ!
正月実家でやることがなく暇すぎるので昨年半年の振り返りと言う意味も込めて Go で AtCoder をやった感想をまとめようと思います。正月らしく(?)アニメを観ながらだらだら書きます。
![Screenshot from 2023-01-04 03-31-36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3088500/671ff032-d891-3d80-58ad-e6c62b2d8384.png)
# Go で始めた理由
2022年の4月からコードを書くバイトを始めました。そこで Go を使うかもと言われていたので勉強しようと思っていたところ、それと同時期に複数の知人から AtCoder を勧められました。それ以前には Python しか書いたことがなかったのですが、実行速度が気にかかったのと、どうせなら新しい言語を勉強しようということで Go で始めてみることにしました。
# アカウント作成時
レートの画像を見てわかるとおり実はアカウントを作成したのは202

元記事を表示

自作RDBのためにオンディスク並行Skip Listを作ってみた

どうも ryo_grid です。
今回は自作RDBMS [SamehadaDB](https://github.com/ryogrid/SamehadaDB) の開発の中で、インデックスとして用いるためのコンテナとして、オンディスク並行Skip Listなるものを作ってみたので、それについて書きたいと思います。
(以降、文体が変わりますが気にしないで下さい)

## はじめに
– 本文書は筆者がオンディスク並行Skip Listを設計・実装してみた中で得た、知識や知見の共有を目的とするものである
– 英文のものも含め、Skip Listに関して、本文書で共有する種の情報がまとまった形で提供されているWebページ(等)は、筆者が探した範囲で見当たらなかったので、その点で、価値のある知識・知見として、多くの人の役に立てば幸いである

# Skip Listについて

## Skip Listとは
– いわゆる Key-Value ストアを実現する確率的なデータ構造
– 他の同様の機能性を提供するデータ構造に対し、”確率的”というところが特徴的
– O (log N) でデータの探索

元記事を表示

【Golang/gin】いつも使ってるgin.Contextの中身、覗いていきませんか?

# Step Up Gin! gin.Contextの中身を覗いてみよう!

GolangでGinを使ってAPIサーバーの開発をしていると必ず目にするのがgin.Contextという構造体。

実装されているコードに書かれているgin.Context説明を訳すとこのように紹介されています。

>Context is the most important part of gin. It allows us to pass variables between middleware, manage the flow, validate the JSON of a request and render a JSON response for example.

> Contextはginのフレームワークの中でも最も重要な部品の一つです。
> gin.Contextを使うことで、ミドルウェア間での変数の受け渡しや、処理の管理、JSONリクエストのバリデーション、JSONレスポンスの出力等が可能になります。

APIサーバーを立てるとなると、メタ情報の管理やリクエストのデータの受け渡しが必要になる

元記事を表示

Docker x Golang x PostgreSQL で環境構築

# 概要

現場でGo言語の使用する予定があるのでDockerを使用して環境構築をしてみました。
ディレクトリ構成などはブログ記事など参考にしました。
(書籍なども読んでいってデファクトを見つけていきます。)

ソースコードだけ見たいという方は[こちら](https://github.com/suzu12/docker-go-postgresql-sampleapp)から見ることができます。

# 環境

– go 19.1
– PostgreSQL 15.1
– macOS Monterey version12.6

# 対象読者

– docker x Go x PostgreSQL の環境で簡単に動かしてみたい方
– dockerでの環境構築を試そうとされている方

# 目次

– [概要](#概要)
– [環境](#環境)
– [対象読者](#対象読者)
– [目次](#目次)
– [ディレクトリ構成](#ディレクトリ構成)
– [Docker](#docker)
– [cmd](#cmd)
– [sampleプログラム](#sample-プログラム)
– [まとめ](#まと

元記事を表示

OTHERカテゴリの最新記事