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

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

Ubuntu 22.04 での go のインストール

# Ubuntu 22.04 での go のインストール

https://qiita.com/m-tmatma/items/dff66b3e294293115661 で ubuntu に apt で golang をインストールする方法を記載したが、

https://github.com/longsleep/golang-deb/issues/9#issuecomment-1111964990 によると Ubuntu 22.04 では
標準リポジトリで go のインストールに対応したらしい。

以下でインストールできる。

“`
sudo apt install -y golang-go
“`

2022/4/29 現在で ver 1.18.1 がインストールされた。

“`
$ go version
go version go1.18.1 linux/amd64
“`

元記事を表示

【Go】json-iterator/goのライブラリを使用してJsonから特定の値を取り出す

## 概要
Golangにて、標準ライブラリの使用でJsonから特定の値だけを取り出すことは可能ですが、interface型なので値の取り出しが少し面倒です。何か良いライブラリがないかと探していたところ、[json-iterator/go](https://github.com/json-iterator/go)というものを見つけました。
`json-iterator/go`は標準のライブラリよりも処理が速そうなのと、[こちら](https://github.com/json-iterator/go/tree/master/any_tests)のサンプルにある通り、Jsonから特定の値を取り出すこともできそうです。今回はこのJsonから特定の値を取り出す部分の実装サンプルを紹介します。

## 実装サンプルの前提とするJson
以前に[【OpenWeatherAPI】リクエスト・レスポンスの項目に関するメモ書き](https://qiita.com/someone7140/items/0d6bd671458904ff49d6)で紹介した、OpenWeatherAPIのレスポンスを今回の

元記事を表示

go-swaggerで`ParseComment error in file /go/src/controller/xxx.go :cannot find type definition: json.RawMessage`

# 経緯
GORMのmodelにてjson.RawMessageを定義してると、go-swaggerの`swag init`でドキュメント生成に失敗する

“`
/go/src # swag init
2022/04/28 07:10:29 Generate swagger docs….
2022/04/28 07:10:29 Generate general API Info, search dir:./
2022/04/28 07:10:29 Generating xxxxxxxxx
2022/04/28 07:10:29 Generating xxxxxxxxx
2022/04/28 07:10:29 Generating xxxxxxxxx
2022/04/28 07:10:29 Generating xxxxxxxxx
2022/04/28 07:10:29 ParseComment error in file /go/src/controller/xxx.go :cannot find type definition: json.RawMessage
“`

#

元記事を表示

saml2awsが動かなくなったけど修正のPRが出ていたのでそのブランチでビルドする

いつも通りsaml2awsしようと思ったら
“`
Error authenticating to IdP.: error loading first page: failed to build login form data: could not find any forms matching the provided IDs.
“`

困った困った
ところが、同僚が[修正のPR](https://github.com/Versent/saml2aws/pull/806)を見つけてくれたのでこのブランチでビルドしてみる

# リポジトリのREADMEを見ると
“`shell-session
$ make mod
$ make install
“`
でいけるよ
とのことだったんですが

– 私はsaml2awsをローカルのコンテナ上で動かしている変態なのでlinuxのバイナリが欲しい
– 社内にはmac上でsaml2awsを動かしている人もいるのでdarwinのバイナリも欲しい
– しかし、ローカルにgoの環境構築をしたくない
– [この記事](https://qiita.c

元記事を表示

Goのインターフェースについての備忘録

# インターフェイスとは?
変数の値だけでなく、 __変数の型情報__ も同時に保持することができる言語組み込みの __特殊な構造体__ のこと。

# どんな時に使うの?
いろいろな型の変数を引数として受け取ることのできる汎用的な関数を書くときに使う!(使い方の一つ)

Go言語は静的型付け言語なので、変数宣言の際に変数の型を宣言しないといけない。

しかし、これでは汎用的な関数を書く際に引数に来る可能性のある型の数だけ関数を作成しなければならない。

インターフェースは任意の型の変数を格納できるので、汎用的な関数をひとつ書くだけでよくなる!

# インターフェースの宣言

“`interface.go
var i interface{}

a := 1
i = a
fmt.Println(i) // 1

b := “str”
i = b
fmt.Println(i) //str
“`

# 格納されている型を調べる
格納されている型ごとにごにょごにょしたい場合は以下のような方法で型が取得できる。

“`type.go
import (
“fmt”
“reflect”
)

元記事を表示

Go 1.18でKubebuilderを使うとbin/controller-gen: No such file or directoryが出る

# 実行環境

“`
kubebuilder version
Version: main.version{KubeBuilderVersion:”3.3.0″, KubernetesVendor:”1.23.1″, GitCommit:”47859bf2ebf96a64db69a2f7074ffdec7f15c1ec”, BuildDate:”2022-01-18T17:03:29Z”, GoOs:”darwin”, GoArch:”amd64″}
“`

# エラー

`kubebuilder create api –group webapp –version v1 –kind Guestbook`を実行すると

“`
bash: /Users/nakamasato/projects/guestbook/bin/controller-gen: No such file or directory
make: *** [generate] Error 127
“`

`bin/controller-gen`が存在しないというので落ちてる

元記事を表示

GuardDutyの脅威検出結果をSlack/Teamsに通知する

# 初めに
生産技術部で製品の検査工程を担当しているエンジニアです。AWSのセキュリティ対応のため、GuardDutyを利用しています。GuardDutyを利用することで、悪意のあるアクティビティや異常な動作を継続的にモニタリングすることができます。しかし、検知した結果に気が付かなければ意味がありません。チャットツールに結果を転送することで、早急な対応ができる体制を目指します。

# Slack/Teamsへの通知方法
脅威を検知した結果は、自動的にEventBridge(旧Amazon CloudWatch Events)に送信されるため、EventBridgeでイベントをトリガします。

* Slackを利用されている場合は、EventBridgeからSNSに転送します。SlackはChatbotとの連携が可能なため、ChatbotをSNSのターゲットにします。
* Teamsを利用されている場合は、LambdaをEventBridgeのターゲットとし、Lambdaで結果を加工してIncoming WebhookでTeamsに転送します。

![guardduty-notifica

元記事を表示

【Golang】AND と MOD(Modulo)の速度の違いと反復処理の高速化【論理積と剰余の速度差】【論理演算】

> Go 言語(以下 Golang)で、イテレーションやループ内の反復処理に、`&`(AND, [論理積](https://ja.wikipedia.org/wiki/%E8%AB%96%E7%90%86%E7%A9%8D))と `%`(MODULO, [剰余演算](https://ja.wikipedia.org/wiki/%E5%89%B0%E4%BD%99%E6%BC%94%E7%AE%97))を使った場合の速度の違いが知りたい。

[「golang 論理演算 AND MOD 速度 違い」でググって](https://www.google.com/search?q=golang+%E8%AB%96%E7%90%86%E6%BC%94%E7%AE%97+AND+MOD+%E9%80%9F%E5%BA%A6+%E9%81%95%E3%81%84)も、ピンポイントのタイトルの記事がなかったので、自分のググラビリティとして。

## TL; DR (今北産業)

元記事を表示

逆引き言語差確認メモ(C++,C#,Python,Go)

# アレってこの言語でどう書くんだっけ?
別言語を使う作業に移行した時に、たまにある **”アレって、この言語でどう書くんだっけ?”** をカバー

## 宣言

2次元配列

“`func.cpp
//宣言,初期化
int** table = {{0,1,2},{3,4,5}};
int table[][]={{0,1,2},{3,4,5}};
//引数,返値
int** function(int** table){
return table;
}
int** function2(int table[][]){
return table;
}
“`

“`func.cs
//宣言,初期化
int[,] table=new int[0,1,2][3,4,5];
//引数,返値
int[,] function(int[,] table){
return table;
}
“`

“`func.py
#宣言,初期化
table=[[0,1,2],[3,4,5]]
#引数,返値
def functi

元記事を表示

私が作成した、若しくは改造したアプリ

1. https://github.com/blono/win
* Go 言語から Windows API を呼び出すライブラリ
* [lxn/win](https://github.com/lxn/win) に色々機能追加したやつ
1. https://github.com/blono/git-commit-and-push
* VSCode に、git commit と push を同時に行うコマンドを実行するアイコンやメニューアイテムを追加する拡張機能
* Eclipse にはあったのに VSCode には無いのが気になったので作った
* VS Code Marketplace に公開済み
1. https://github.com/blono/vscode-theme-dark-brown
* VS Code のテーマ(ダークテーマ、かつ茶色や金色よりの配色)
* VS Code Marketplace に公開済み
1. https://github.com/blono/ScriptAutoRunner
* Chrome 拡張(M

元記事を表示

【Golangエラー】type does not implement as method has a pointer receiver

interfaceを受け取る関数に構造体を渡そうとしたところ、エラーが出てきてちょっとつまづいたのでメモです。
`hello world`を出力するシンプルなプログラムを見ながら挙動を確認します。

## うまくいかない場合

以下のコードだと `Type does not implement ‘sampleInterface’ as the … has a pointer receiver`というエラーが出てうまくいきません。

“`main.go
package main

import “fmt”

type sampleInterface interface {
DoSomething()
}

func interfaceReceiverFunc(si sampleInterface) {
si.DoSomething()
}

type sampleStruct struct {}

func (s *sampleStruct) DoSomething() {
fmt.Println(“hello world”)
}

func main() {
s :=

元記事を表示

【Golang】8 バイトの []byte を uint64 に変換する( 64ビット長のバイト・スライスをintに変換したい)

> Go 言語(以下 Golang)で、`make([]byte, 8, 8)` で作成した 8 バイトのスライスを uint64符号なしint に変換したい。

[「`golang “[]byte” uint64 変換`」でググって](https://www.google.com/search?q=golang+cap%E4%BB%98%E3%81%8D+%22%5B%5Dbyte%22+%E7%B5%90%E5%90%88+%E9%80%A3%E7%B5%90)も、逆の `uint64` から `[]byte` に変換するものや、`int32` のリトルエンディアン後ろ詰め方式 だったり、符号あり前提のものばかりだったので、自分のググラビリティとして。

## TL; DR (今北産業)

– `encoding/binary` の Golang 標準パッケージを使う。
– `binary.BigEndian

元記事を表示

sqlmock + gormでDB周りのテストを書く

## sqlmockとは

Goのテスト用のDBを用意しなくてもSQLドライバのような振る舞いをしてくれるモックのライブラリ

## パッケージのバージョン

“`:go.mod
gorm.io/driver/postgres v1.3.4 // indirect
gorm.io/gorm v1.23.1 // indirect
“`

## 困ったこと

gorm.io/driver/mysqlのv1.3.2では正しく動作しない。v1.0.3では正しく動作する。
**Where(“id=?”, 1)** ではなく **Where(“id = ?”, 1)** を記述する。

https://github.com/Watson-Sei/go-sqlmock-gorm

## 解決フロー

このような困った仕様に気づくために記事を見るだけでなく実際に動くコードをGitHubからcloneしてきてコードを色々変えて試してみることがとても大切だと感じた。Versionも確認すること。

## 実際のコード

“`go
package database_test

import (

元記事を表示

GoのORM入門(go-pg ハンズオン)

## go-pgのチュートリアル

### 開発環境の説明
“`markdown:開発環境
PC:Mac(CPUはintel製)
Go:1.17.6 ←Goのver大事。versionは1.16以降をインストールしてください。
開発エディタ:Visual Studio Code
go-pg: v10.10.6
“`

“`shell:ディレクトリ構成
~/go/src/go_pg_lesson $ tree -I “.data|schema”
.
├── db
│ └── migrations
│ ├── 000001_create_users_table.down.sql
│ └── 000001_create_users_table.up.sql
├── docker-compose.yml
├── go.mod
├── go.sum
└── main.go

2 directories, 6 files
“`

“`yml:docker-compose.yml
version: ‘3.1’

services:
postgres:

元記事を表示

Goで2次元mapをgenericsで良い感じのデータ構造にする

# TL;DR
[Githubのコード](https://github.com/yut-kt/gostruct/blob/main/map.go)読んでみてください.

# 前書き
趣味でgolangのHMM音声認識エンジンを作っている際,bigramやtrigramの確率保存で複数キーからなる連想配列が欲しくなりました.
パッと思いつくのは二次元mapかなと思いましたが,良い感じのものないかなと探していました.

記事を探していると[[Goで多重連想配列]](https://qiita.com/daigo2010/items/d46975ad6decd8578c45)があり,確かに何も考えずに二次元のmapにアクセスするとヌルポになりそうということが分かりました.
少し処理が煩わしいのでもっと綺麗に作れないかなと思い探していると,[[Goで多次元マップ(複数のキーからなるマップ)を実現したいときにはどうするか]](https://qiita.com/ruiu/items/476f65e7cec07fd3d4d7)という記事を見つけてカッコイイと思いました.

そこで実際どれが良いかな

元記事を表示

goのgenericsチュートリアルを試してみる

## 使用環境

– Macbook Pro 16inch (Intel)
– Goland IDE

## 準備

1. go 1.18.1を[こちらから](https://go.dev/doc/install)インストール
1. Goland IDEのプロジェクトの言語バージョンを1.18に設定(GOROOTとGOPATH両方を設定しました、正しいかはわかりません)
1. go.modも1.18のものを生成する

Goland IDEを2022バージョンにしないと赤い波線のエラー表示が出ますが、コードは普通に動きます。

## 実際のコード

こちらは[tutorial](https://go.dev/doc/tutorial/generics)ページから取得したものです。

“`main.go
package main

import “fmt”

func SumInts(m map[string]int64) int64 {
var s int64
for _, v := range m {
s += v
}
return s
}

func SumFloats

元記事を表示

Ubuntuに好きなGoのバージョンをaptでインストールする

## golang-backportsをapt repositoryに追加する

“`
sudo add-apt-repository ppa:longsleep/golang-backports
sudo apt update
“`

## バージョンを指定してgoをインストールする

“`
sudo apt install golang-1.18
“`

## 設定

“`bash:~/.profile
GOPATH=~/go
GOROOT=/usr/lib/go-1.18

PATH=$GOROOT/bin:$PATH
“`

元記事を表示

IdeaPad Duet ChromebookにGo言語をインストールする

# パッケージを最新化する
インストールされているパッケージを最新化します。
“`
$ sudo apt clean
$ sudo apt update
$ sudo apt full-upgrade -y
“`

# 必要なパッケージをインストールする
必要なパッケージをインストールします。
“`
$ sudo apt install build-essential -y
$ sudo apt install exuberant-ctags
“`

# Goをダウンロードする
IdeaPad Duet ChromebookのCPUはARMです。
[Goのダウンロードサイト](https://go.dev/dl/)からLinux ARMのファイルをダウンロードします。
ここでは、go1.18.1.linux-arm64.tar.gzをダウンロードしました。

# Goの環境変数を設定する
.profileに以下を追加します。
“`
export GOROOT=/usr/local/go
export GOPATH=${HOME}/go
export PATH=${GOROOT

元記事を表示

【go】インストールしたライブラリで command not foundになるときの対処法

# 対処法
“`
export PATH=$PATH:$HOME/go/bin
“`
でパスを通す

# 問題
“`
go get -u github.com/swaggo/swag/cmd/swag
“`
をインストールして、
“`
swag -v
“`
をすると
“`
command not found
“`
エラーになる

元記事を表示

【Golang】echoサーバーでcsvファイルをstructにする&structをcsvにする

## はじめに

Golangサーバーを新規に構築する中で、CSVファイルの入出力を汎用的にした備忘録です。
GitHub: https://github.com/Sunochi/go_echo_server

## TL;DR

SJIS形式をUTF8形式に`transform.NewReader`で変換して、`csvutil`で構造体にマッピングする。
1行ごとに処理をせずに、全行一気に処理している。
膨大な行のcsvには向かないため、もしバッチ処理などで使用する場合は今後の修正にご期待ください。

https://github.com/Sunochi/go_echo_server/blob/master/internal/csv/csv.go

### csv読み込み

“`csv.go
func ReadFile(fh *multipart.FileHeader, s interface{}) {
csvFile, err := fh.Open()
if err != nil {
log.Println(“csv file open error:”, err)
}

元記事を表示

OTHERカテゴリの最新記事