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

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

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

元記事を表示

目指せ!第14回UEC杯コンピューター囲碁大会<本編> Step [O12o__11o__100o0] データファイル作成 ~ Step [O12o__11o__10o0] 連データベース定義 ~ Step [O12o__11o__10o5o__10o0] 連データベースのロード

目指せ!第14回UEC杯コンピューター囲碁大会<本編> Step [O12o__11o__100o0] データファイル作成 ~ Step [O12o__11o__10o0] 連データベース定義 ~ Step [O12o__11o__10o5o__10o0] 連データベースのロード

# 連載の目次

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

# Step [O12o__11o__100o0] データファイル作成 – data/ren_db1.json ファイル

あとで使うファイルを先に作成する

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

“`plaintext
? kifuwarabe-uec14
├── ? data
? │ └── ? ren_db1.json
├── ? kernel
│ ├── ? go.mod
│ ├── ? kernel.go
│ ├── ? logger.go
│ └── ? sto

元記事を表示

Go言語とMySQLを使ってログイン機能と単語を記録するWebアプリケーションを作ってみた

# はじめに
GoでなにかしらのWebアプリケーションを作成したいと思いました。
私はGoをはじめて1ヶ月ほどしか経っていないので今回は最低限の機能を実装した簡単な単語アプリを作りました。
githubのページです。
[word_and_meaning_keep](https://github.com/Yuorei/word_and_meaning_keep)
## このサイトの使い方
1.このサイトは単語とその意味を記録できるサイトです
アカウントを持っている場合はそのままログイン
お持ちでない場合には「新規ユーザーの登録」より
登録をお願いします

2.単語が登録されている場合はログインすると表示されます
登録されていない場合は登録をしてお使いください

## こだわりポイント
ログインユーザーごとにwordを表示させたこと
**[デモ動画](https://youtu.be/HNB_35jIqaE)**
目指せ!第14回UEC杯コンピューター囲碁大会<本編> Step [O11o_3o0] カーネルのインタープリター ~ Step [O11o_4o0] 石の色定義 ~ Step [O11o_4o2o0] 連の定義 ~ Step [O11o_5o0] 石定義 ~ Step [O12o__10o0] 点定義、またはその盤座標符号定義

目指せ!第14回UEC杯コンピューター囲碁大会<本編> Step [O11o_3o0] カーネルのインタープリター ~ Step [O11o_4o0] 石の色定義 ~ Step [O11o_4o2o0] 連の定義 ~ Step [O11o_5o0] 石定義 ~ Step [O12o__10o0] 点定義、またはその盤座標符号定義

# 連載の目次

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

# Step [O11o_3o0] カーネルのインタープリター

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

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

元記事を表示

ServerlessFrameworkでLambda(Go)を動かしたらファイルが見つからずエラーになる

# はじめに

GoをLambdaにデプロイしたのですが、ファイル読み込みで多くの時間を使ったのでまとめます
ServerlessFrameworkを利用したLambdaでファイル読み込みをする方の参考になればと思います

# 問題

Lambda(go)で以下のコードを実行していました
ここでは`config.ini`という設定ファイルを本番環境では、`main`の実行ファイルと同じ階層にあるものを読み込むようにします

しかし、このコードでは`not found ./config.ini`となってしまいます

“`go:config.go
path := “/go/src/config/config.ini”

if os.Getenv(“ENV”) == “production” {
path = “./config.ini”
}

cfg, err := ini.Load(path)
“`

# 解決方法

現在serverless frameworkを利用して`serverless.yml`で`main`と同じフォルダに`config.ini`がアップロード

元記事を表示

目指せ!第14回UEC杯コンピューター囲碁大会<本編> Step [O11o__11o0] デバッグ可能標準入力 作成

目指せ!第14回UEC杯コンピューター囲碁大会<本編> Step [O11o__11o0] デバッグ可能標準入力 作成

# 連載の目次

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

# Step [O11o__11o0] デバッグ可能標準入力 作成

## Step [O11o__11o1o0] git向け対応 – .gitignore ファイル

? 以下の既存ファイルを編集してほしい

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

“`plaintext
# この下に kifuwa

元記事を表示

目指せ!第14回UEC杯コンピューター囲碁大会<本編> Step [O11o__10o0] ロガー設定 ~ Step [O11o__10o3o_2o0] welcome プログラム

目指せ!第14回UEC杯コンピューター囲碁大会<本編> Step [O11o__10o0] ロガー設定 ~ Step [O11o__10o3o_2o0] welcome プログラム

# 連載の目次

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

# Step [O11o__10o0] ロガー設定

## Step [O11o__10o1o0] インストール

? 以下のコマンドをコピーして、ターミナルに貼り付けてほしい

Input:

“`shell
go get -u go.uber.org/zap
“`

## Step [O11o__10o2o_1o0] 設定 – .gitignore ファイル

? 以下の既存ファイルを編集してほしい

“`plaintext
? kifuwarabe-uec14
├── ? kernel
│ └── ? go.mod
? ├── ? .gitignore
├── ? engi

元記事を表示

目指せ!第14回UEC杯コンピューター囲碁大会<本編> Step [O11o___100o0] カーネル作成 ~ Step [O11o__10o_1o0] 思考エンジン設定ファイル

目指せ!第14回UEC杯コンピューター囲碁大会<本編> Step [O11o___100o0] カーネル作成 ~ Step [O11o__10o_1o0] 思考エンジン設定ファイル

# 連載の目次

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

# Step [O11o___100o0] カーネル作成

? ここでは、カーネルは以下の意味を指す

* 思考エンジンのプログラムのうち、おおまかに言って **ゲームの知識(ドメイン)以外の部分**
* 1つのカーネルは、1つの対局に対応する

## Step [O11o___100o1p0] フォルダー作成

? 以下のフォルダーを新規作成してほしい

“`plaintext
? kifuwarabe-uec14
? ├── ? kernel
├── ? .gitignore
├── ? go.mod
├── ? go.work
└── ? main.go
“`

元記事を表示

目指せ!第14回UEC杯コンピューター囲碁大会<本編> Step [O1o0] 導入

# 目指せ!第14回UEC杯コンピューター囲碁大会<本編> Step [O1o0] 導入

# 連載の目次

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

# 本文

## Step [O1o0] はじめに

? Step の変な数字の説明

? [電脳向量表記](https://qiita.com/muzudho1/items/fdbf31e41dd8c247081f)

? 練習編を読み終わってるものとする

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

? また、技術的でない内容を含むブログを別の場所に 開設する

? [目指せ!第14回UEC杯コンピューター囲碁大会☆(^q^)<その2>](http://grayscale2.dou-jin.com/go/%E7%9B%AE

元記事を表示

SonarQubeにgithub actions経由で色々な言語を解析させてみた【Typescript】【Python】【Go】【C++】【Flutter】

# はじめに

SonarQube と github actions の言語別の連携方法のまとめを書きます
SonarQube CommunityEdition(無償版)想定です

# 環境

– SonarQube は AWS EC2 で立てている
– master に PR が merge された時に github actions が発火して、SonarQube の静的解析をキックする
![連携](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641313/cd9b9164-bfda-79d3-e1dd-679ac5f7f0e9.png)

# 前提

– 既に SonarQube は起動済みの状態
– SonarQube 内でプロジェクトが作成済みで、key と token が発行されている
※ このあたりは他の色んな記事で丁寧に解説されていると思います。

## github actions の secret 設定

| 項目 | 値

元記事を表示

Go言語 Docker Engine SDK でホストからコンテナへファイルコピー

あらかじめイメージに埋め込めんでおけないコンテナ固有の設定ファイルを物理ファイルを作成せずにコンテナへコピーしたいと思い、Go言語の Docker Engine SDK API を試そうとしたら手短なサンプルコードが見つからなかったので紹介します。

## 動作確認環境
– go 1.18.2
– Docker version 20.10.15
– ApiVersion:1.41

## コード

NGINX コンテナの index.html を上書きします。

API の CopyToContainer() を使いますが、ドキュメントに次のようにあるので注意ください。
> Note that `content` must be a Reader for a TAR archive
> `content` は TAR アーカイブの Reader である必要がある

“`golang
package main

import (
“archive/tar”
“bytes”
“context”
“github.com/docker/docker/api/types”
“gi

元記事を表示

OTHERカテゴリの最新記事