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

Go関連のことを調べてみた2022年10月08日
目次

【Golang】文字間の複数ホワイトスペースを削除して1つのスペースに置き換える関数

> Go 言語(以下 Golang)で、文字列内の文字間にある複数スペースを 1 つに変換したい。
> つまり、**単語間の空白を詰めたい**のです。
>
> “`bash:こういうことがしたい(before–>after)
> ” Hello, World ! ” –> “Hello, World !”
> “Hello,\tWorld ! ” –> “Hello, World !”
> ” \t\n\t Hello,\tWorld\n!\n\t” –> “Hello, World !”
> “`

[「golang 文字間の複数スペースを削除する」でググって](https://www.google.com/search?q=golang+%E6%96%87%E5%AD%97%E9%96%93%E3%81%AE%E8%A4%87%E6%95%B0%E3%82%B9%E3%83%9A%E3%83%BC%E3%82%B9%E3%82%92%E5%89%8A%E9%99%A4%E3%81%99%E3%82%8B)も、正規表現や `

元記事を表示

プログラミング言語Go アウトプット(4章)

# はじめに
これまでの章のアウトプットやプログラミング言語Goのアウトプットをしようと思ったきっかけなどは[こちら](https://qiita.com/AtomuIshida/items/6e05c02a2bd82f1e133d)でまとめているのでぜひ読んで欲しいです。

# 4章 コンポジット型
## 重要・学びになったと思うところ
### 配列について
Go言語において、配列は“`固定長“`のため直接使われることが少ない(らしい)
しかし、よく使われる“`スライス“`を理解するためには、配列の理解は必須!

配列の宣言
“`go
var a [3]int // 3個の整数の配列
“`

for文を使ったインデックと要素の表示・要素のみの表示
“`go
var a [3]int{1,2,3}

for i, v := range a {
fmt.Printf(“%d, %d\n”, i, v) // 0,1 1,2 2,3
}

for _, v : = range a {
fmt.Printf(“%d\n”, v) // 1,2,3
}
“`

元記事を表示

Go強化月間~開発する上で知っておくべき知見を共有しよう~ 結果発表?

こんにちは、Qiita運営スタッフです。

8月15日(月)〜9月16日(金)の期間に開催いたしました記事投稿キャンペーン「Go強化月間~開発する上で知っておくべき知見を共有しよう~」 へのたくさんのご参加、誠にありがとうございます!

今回のイベントでは、合計123名の方にご参加いただき、59本もの記事が投稿されました!
ご投稿いただき誠にありがとうございます?

本テーマでは、Goを用いて開発する上で知っておくべきことについて様々な内容を記事にまとめていただきました。
投稿された多くの知見を日々の開発に活かしてみましょう :muscle:

今回はご投稿いただいた記事の紹介といいね数のランキングを発表いたします!

## Qiita運営ピックアップ記事
たくさんのご投稿の中から、Qiita運営がおすすめ記事をピックアップしました!
まだ記事を確認できていない方はご参考にしてみてください!

### [Go で Stack と FIFO](https://qiita.com/mattn/items/774280a746c82ee63fc0) by [@mattn](https://q

元記事を表示

Go Moduleって何

# はじめに
GoでDockerでGoサーバーを立てるとき、改めてGo Moduleって何となったので調べたことをまとめます。

# Go Moduleとは
パッケージ(Package)をまとめたもの。パッケージはコードをまとめるもの。すべてのコードはパッケージに入っている。
モジュールがパッケージの依存関係を管理する。
例えばAパッケージの関数がBパッケージの関数を使用するとする。
つまり、AパッケージはBパッケージがないと動かない、AはBに依存しているということになる。

補足:goはmainパッケージのmain関数から処理が始まる。

# go mod でGoモジュールを作成する
goプログラムが入っているフォルダ内で、以下のコマンドを実行することでモジュールが作成できる。
ユニークな名前は、公開する場合はgithubのリポジトリ名、
非公開の場合はローカルでユニークな名前を付ける。
ユニークな名前とは、世界(非公開の場合はローカルで)同じモジュール名がないようにすること。
モジュールを参照するとき、同じ名前のモジュールがあったらどっちのモジュールを参照すべきかわからなくなるため

元記事を表示

Goで2つのスライスから共通要素を取得したいときはgolang-setをつかおう

# はじめに

Goで2つのスライスの共通要素を取得する際、愚直にループを回すと以下のようになると思います

“`go
package main

import (
“fmt”
)

func ExampleIntersect() {
hoge := []string{“a”, “b”}
fuga := []string{“a”, “b”, “c”}

var intersection []string
for _, h := range hoge {
for _, f := range fuga {
if h == f {
intersection = append(intersection, f)
}
}
}

fmt.Printf(“%+v\n”, intersection)
// Output:
// [a b]
}
“`

# Intersect(other Set[T]) Set[T]

golang-setをつかいます

https://github.com/deckarep/golang-set

`target.Int

元記事を表示

Ory Kratosをセルフデプロイ&SSO設定(GitHub)

# はじめに

はじめまして。あかこうです。

最近Ory Kratosを使っているのですが、
その備忘録をここに書きなぐっておきます。

本記事でまとめられているのは、以下の内容です。

1. Ory Kratosをセルフホストする
2. Ory KratosにGithubでSSOする

(※本番用のデプロイではないです。)

# 1. Ory Kratosをセルフホストする

以下のコマンドで、Ory Kratosをセルフデプロイできます。。
[参考にした公式サイト](https://www.ory.sh/docs/kratos/quickstart#clone-ory-kratos-and-run-it-in-docker)

“`sh
git clone https://github.com/ory/kratos
cd kratos
docker-compose -f quickstart.yml -f quickstart-standalone.yml up –build –force-recreate
“`

うまく動けば、http://0.0.0.0:4455/

元記事を表示

PostGISベクトルタイルサーバーの比較: tegola/martin/pg_tileserv

## 概要

通常、ベクトルタイルはGeoJSONなどから変換した静的なファイルとして配信されることが多いです(.pbfファイルの配信)。パフォーマンスやサーバーのコストの観点ではベストな方法と言えますが、いくつか典型的な問題があります。

– 変換に大きなコストがかかる(特にplanet級の、タイル数が膨大な場合に問題となる)。
– データの追加・削除や更新が苦手

そんなわけで、データベースから動的にタイルを配信出来ることはとても重要です。しかしこのアプローチにもパフォーマンス面などで課題があるため、どの方法をなぜ採用するのか、よく検討する必要があります。

FOSS4Gの世界のデータベースといえばPostGISです。世間では、PostGISのテーブルからベクトルタイルを動的に配信するためのアプリケーションがいくつか実装されています。

– [t-rex(Rust)](https://github.com/t-rex-tileserver/t-rex)
– [tegola(Go)](https://github.com/go-spatial/tegola)
– [martin(Ru

元記事を表示

【Go】Templateで二次配列の要素を指定する

二次配列array[index1][index2]をHTML、Goテンプレートで指定する書式は下記の通りです。

“`html
{{.array index1 index2}}
“`

元記事を表示

Go言語 : インターフェース(&循環参照の分離)

## インターフェース
インターフェイスは、実装と使用を分離することが出来る。
また、Go言語のインターフェースは「循環参照」を解決するためにも使われる。

#### 循環参照
Go言語ではパッケージの循環参照が禁止されている。
循環参照というのは、パッケージAとBがお互いに参照しあってるということ。
循環参照の禁止は、レイヤードアーキテクチャを実現することに寄与する。
しかし、時に、循環参照の禁止は厳しすぎる制約となり、プログラム作成の障害となってしまう。
そこで、インターフェースを用いてパッケージを循環参照から切り離し、循環参照可能な仕組みを作ることもある。

## ファイル構造
dog/
  Dog.go
  DogLoar.go
cat/
  Cat.go
  DogInterface.go
main.go

## ポイント
Dog.go

“`Go
func (d *Dog) GetDog() string {
cat := &cat.Cat{ Ca

元記事を表示

曖昧にしないためのDockerコンテナ内のディレクトリ構造(抜粋)について(Golang/PostgreSQL編)

 Dockerを更に使いこなすため、Dockerコンテナ内のディレクトリ構造を分析してみた。(Treeコマンドが使えないようで、使えるように設定するのも手間なので、すべてマニュアルでディレクトリをのぞきながら階層を記録した。)
 Dockerを使いこなすためには、どのディレクトリをバインドマウントさせるか?どのディレクトリをボリュームマウントさせるか?またどのディレクトリがパスが通っていてシェルスクリプト(.sh)を置くのに最適か、など、ローカル側のOSだけではなく、コンテナ側のディレクトリ構造の絵姿についてもある程度の理解が重要になってくる。
 なお、分析に当たってはLinuxのFHS(Filesystem Hierarchy Standard)の理解がとても重要になってくるが、このFHSについては他に良記事が沢山あるためそちらを参照願いたい。

:::note warn
下記ディレクトリは見やすくするためにアルファベット順にはしておりません。また、GolangとPosrgreSQLは通常別々のコンテナにインストールされることが多いかと思いますが、紙面の都合上、マージして記載していま

元記事を表示

GO言語で、確保した配列に、Mapデータからデータ入力する方法

# 前置き
SQLの汎用性があるプログラムを自作中にSQLからデータを読み取る際に、読み取ったデータを配列に変換させる際で汎用性プログラムが作れないか試してみたので、記録する・

## 説明など
構造体を作ったり操作するためにreflect関数というだいぶ便利なものがあるのでデバッガと組み合わせていろいろと試していた。
ポインタ操作がかなりめんどくさいけど、一つづつ調整していくと出来上がるものができたからだいぶ楽になった。

## 実装プログラム

“`golang:main.go
package main

import (
“fmt”
“reflect”
)

func mapToStruct(s map[string]interface{}, i interface{}) {

sv := reflect.ValueOf(i)
if sv.Type().Kind() != reflect.Pointer {
fmt.Println(sv.Type().Kind())
return
}
if len(s) == 0 {
return
}
ii :=

元記事を表示

【Go言語】Windows10環境でLinux用の実行ファイルを作成する

# そもそも
Windows環境で go build するとWindows用の実行ファイル(.exe)しか作成されないので、その他のOSに対応した実行ファイルをWindows環境で作成してみます。とりあえずLinux版から。
今回の環境は以下の通り。

## 今回使用する環境

### 1. OS
 エディション: Windows 10 Pro
 バージョン: 21H2

### 2. 使うもの
* [MinGW-w64](https://www.mingw-w64.org/)
* MinGW(Minimalist GNU for Windows)は32bit環境向けのため、64bit環境向けの派生版MinGW-w64をインストールして使用します。

## 1. MinGW-w64のダウンロード
[MinGW-w64のダウンロードページ](https://www.mingw-w64.org/downloads/)でWindows版(MingW-W64-builds) を選択します。
![image.png](https://qiita-image-store.s3.ap-nort

元記事を表示

Creative BT-W3 が一定時間音声を再生しないと接続が切れるから、一定間隔で音声を再生するプログラムを作った

“`go:main.go
package main

import (
“log”
“os”
“time”

“github.com/faiface/beep”
“github.com/faiface/beep/effects”
“github.com/faiface/beep/mp3”
“github.com/faiface/beep/speaker”
)

func main() {
f, err := os.Open(“beep.mp3”) // 300ms くらいの再生時間のビープ音源を用意しておく
if err != nil {
log.Fatal(err)
}

streamer, format, err := mp3.Decode(f)
if err != nil {
log.Fatal(err)
}
defer streamer.Close()

speaker.Init(format.SampleRate, form

元記事を表示

gin(golang)のリクエストボディを複数回読み取る方法

## TL;DR

1. ginのリクエストボディはread用ストリームで提供されるため、1度読み出すと、再度読み取ることができなくなる
1. ミドルウェアで読み取った結果をginのcontextにセットしておくことで何度でも読み取ることができるようになる

## 経緯

ginでAPIサーバを実装していて、APIの結果をログに出していた。
[gin-contrib/logger](https://github.com/gin-contrib/logger)を使ってAPIの本処理の後に呼ばれログを出力するミドルウェアを組み込むような実装をした。

このログにリクエストボディも出力したくなったので、`gin.Context`の`Request.Body`を読み取って出力しようとした。
合わせて、以下のような実装となった。
(なお、話を単純化するめにリクエストボディはJSON等のテキストである前提とする)

“`golang
func GenerateSetLoggerMiddleware() gin.HandlerFunc {
return logger.SetLogger(
l

元記事を表示

Codecovを活用してカバレッジを可視化する

# カバレッジとは
プロダクションコードのうち、どのくらいテストが実行されているかを割合で見たもの。

# codeカバレッジを見る意義
プロダクションコードに関して、コードカバレッジを恒常的に可視化しておくことで、PRを立てた際にカバレッジの低下に気づくことが可能となり、テストコードによって動作確認がきちんと行われていないプロダクションコードのmain ブランチへのmergeを未然に防ぐことができる様になります。

# codecov をGitHub Actionsで利用する
“`yaml
– name: Run tests
run: go test -coverprofile=cover.out ./…
env:
AWS_S3_BUCKET: ${{ env.AWS_S3_BUCKET }}
AWS_ACCESS_KEY: localstack
AWS_SECRET_KEY: localstack
AWS_REGION: ${{ env.AWS_REGI

元記事を表示

go test について

# testing

“`
import “testing”

func TestArchiveServiceList(t *testing.T) {
if err := fixtures.Load(); err != nil {
log.Fatalf(“failed load fixtures: %v”, err)
}

ctx := context.Background()
conn, err := grpc.DialContext(ctx, “bufnet”, grpc.WithContextDialer(bufDialer), grpc.WithTransportCredentials(insecure.NewCredentials()))
if err != nil {
t.Fatalf(“failed connect grpc: %v”, err)
}
defer conn.Close()

client := genproto.NewArchiveServiceClient(conn)
resp, err := client.List(ctx,

元記事を表示

golang+ginでreact router対応してみた

## 問題
`r.StaticFile(“/”, “./dist”)`などの書き方だと、ルートページから遷移する場合には動作するが、URL直打ちのように直接アクセスすると404が返ってくる
## 結論
file path + request uriで対応できる
“`golang
r.NoRoute(func(c *gin.Context) {
_, file := path.Split(c.Request.RequestURI)
ext := filepath.Ext(file)
//ディレクトリアクセス(ファイル名がない)かパスクエリ(拡張子がない)
if file == “” || ext == “” {
c.File(“./dist” + “/index.html”)
} else {
c.File(“./dist” + c.Request.RequestURI)
}
})
“`
react routerのような静的fileをserveするときなら全部これで対応できるかなと思います。
たとえsolidjsやvueなども可能。
実際主もsolidjs + v

元記事を表示

目指せ!第14回UEC杯コンピューター囲碁大会<本編> Step [O19o_1o0] 石を打つ

目指せ!第14回UEC杯コンピューター囲碁大会<本編> Step [O19o_1o0] 石を打つ

# 連載の目次

? [目指せ!第14回UEC杯コンピューター囲碁大会<本編>](https://qiita.com/muzudho1/items/744f6051954525878b84)

# Step [O19o_1o0] 石を打つ – play コマンド

## Step [O19o0] ファイル作成 – play.go ファイル

? 以下のファイルを新規作成してほしい

“`plaintext
? kifuwarabe-uec14
├── ? kernel
│ ├── ? board_area.go
│ ├── ? board_coord.go
│ ├── ? board.go
│ ├── ? go.mod
│ ├── ? kernel.go
│ ├── ? logger.go
? │ ├── ? play.go
│ ├── ? point.go
│ └── ? stone.go
├── ? .gitignore

元記事を表示

目指せ!第14回UEC杯コンピューター囲碁大会<本編> Step [O12o__11o0] 盤定義(土台)

目指せ!第14回UEC杯コンピューター囲碁大会<本編> Step [O12o__11o0] 盤定義(土台)

# 連載の目次

? [目指せ!第14回UEC杯コンピューター囲碁大会<本編>](https://qiita.com/muzudho1/items/744f6051954525878b84)

# Step [O12o__11o0] 盤定義(土台)

これから盤を作っていく前に、土台を作る

## Step [O12o__11o1o0] ファイル作成 – board.go

? 以下のファイルを新規作成してほしい

“`plaintext
? kifuwarabe-uec14
├── ? kernel
? │ ├── ? board.go
│ ├── ? go.mod
│ ├── ? kernel.go
│ ├── ? logger.go
│ └── ? stone.go
├── ? .gitignore
├── ? engine_config.go
├── ? engine.toml
├── ? go.mod

元記事を表示

目指せ!第14回UEC杯コンピューター囲碁大会<本編> Step [O12o__11o_1o0] 棋譜定義

目指せ!第14回UEC杯コンピューター囲碁大会<本編> Step [O12o__11o_1o0] 棋譜定義

# 連載の目次

? [目指せ!第14回UEC杯コンピューター囲碁大会<本編>](https://qiita.com/muzudho1/items/744f6051954525878b84)

# Step [O12o__11o_1o0] 棋譜定義

## Step [O12o__11o_2o_1o0] ファイル作成 – record_item.go ファイル

? 以下のファイルを新規作成してほしい

“`plaintext
? kifuwarabe-uec14
├── ? kernel
│ ├── ? go.mod
│ ├── ? kernel.go
│ ├── ? logger.go
│ ├── ? point.go
? │ ├── ? record_item.go
│ └── ? stone.go
├── ? .gitignore
├── ? engine_config.go
├── ? engine.toml

元記事を表示

OTHERカテゴリの最新記事