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

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

Goのcobraで作るコマンドラインツール(Hello World)

## はじめに

Goでコマンドラインツールを作るフレームワーク[spf13/cobra](https://github.com/spf13/cobra)を使うと簡単にコマンドを実装することができるので、ハンズオン形式で紹介します。

今回は以下のような、表示させたい名前をコマンドライン引数で指定すると、
`Hello <引数で指定した名前>!!!`と出力するHello World的なコマンドを実装していきます。

“`shell:Usage
> go run main.go -h
greet is a simple command line tool that greets you in English.

Usage:
greet [flags]

Flags:
-h, –help help for greet
-t, –toggle Help message for toggle
“`

“`shell:引数を指定
> go run main.go 田中太郎
Hello 田中太郎!!!
“`

“`shell:引数の指定なし
> go run

元記事を表示

Goの正規表現 (?) と和解せよ

# TL; DR

– `(?i)`, `(?m)` 等は、マッチのルールを変更するフラグを表す
– 大文字、小文字の区別をなくす/行を跨いでマッチできる等
– グループはキャプチャされない
– リファレンス: https://github.com/google/re2/wiki/Syntax

# はじめに

とあるライブラリを調べていたところ、大文字でも小文字でもマッチする謎の正規表現を見つけました。

“`go
re := regexp.MustCompile(`(?i)(ab)(c+)`)
fmt.Println(re.FindStringSubmatch(“abccc”)) // [abccc ab ccc]
// 大文字でもマッチする!?
fmt.Println(re.FindStringSubmatch(“AbCcc”)) // [AbCcc Ab Ccc]
“`

~~実際は謎でもなんでもなかったので~~ 調べた内容を備忘録として残しておきます。

# 正規表現のドキュメント

Goの `regexp` パッケージでは、re2の文法が使われています。([pk

元記事を表示

【Golang】recoverについて

# 概要
リリース前のプロジェクトのソースコードを見ていく中で、ふとrecoverが入っていないことに気づきました。recoverについての理解が浅く、どんな挙動をするのか、何のためにrecoverするのか理解できていなかったので備忘としてまとめます。
golangのフレームワークのリファレンスなどに記載されているから、なんとなくrecoverを入れている、使い方や用途は実はいまいちわかっていない方などに読んでいただけますと幸いです。

# recoverでできること
– panicが発生したとしてもプログラムを終了せずに復帰できます。
– 本当にシンプルにこれだけです笑

# 疑問
ここで疑問に思ったのがrecoverの使い方でした。
例えばサーバーでpanicが発生したとして、panic=致命的なエラーなのでこれをrecoverしたところで全ての処理に失敗するのでは・・?
今はどこも実環境でコンテナ技術を用いたサーバーを構築していると思うので、いっそrecoverを入れずにサーバーを落としてしまって、リクエストを処理の成功するコンテナに誘導するほうがいいのでは・・?

# 結論

元記事を表示

go テストに環境変数を使う

https://pkg.go.dev/testing#B.Setenv

testingのSetEnvを使う

OK?

元記事を表示

Go言語で作るインタプリタ go test ./lexer で import “monkey/token” ができない

## バージョン

“`
$ go version
go version go1.18.3 darwin/amd64
“`

## 問題点

– `~/SOME/PATH/monkey/token` の用にフォルダを作成する(自分の場合は`~/program/go/interpreter/monkey/token`としている)

– `go mod init github.com…..`としたらダメだった

“`
$ go test ./lexer
# github.com/yojiyama7/go_interpreter/lexer
lexer/lexer_test.go:5:2: package monkey/token is not in GOROOT (/usr/local/go/src/monkey/token)
FAIL github.com/yojiyama7/go_interpreter/lexer [setup failed]
FAIL
“`

## 解決策

– `go.mod`ファイルを削除して、
– `monkey`ディレクトリで `go mod i

元記事を表示

GCP の Pub/Sub と Gmail APIを使って、メールをトリガーにイベントを実行する

## 背景
Gmail API の送信する方法は記事たくさんあると思うんですが、受信側はなかなかないですよね。
GAS使うっていうのも一つの手かとは思うんですが、1分ごとに実行し続けるっていうのもちょっと気持ち悪いですし、ラグが出てしまうと思うので、今回 [Cloud Pub/Sub](https://cloud.google.com/pubsub/docs/overview?hl=ja)を使って実装してみたいと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340121/90bd4997-f735-d44c-1a25-5d5e4a29f286.png)

## Pub/Subとは
> Pub/Sub を使用すると、パブリッシャーとサブスクライバーと呼ばれるイベント プロデューサーとコンシューマーのシステムを作成できます。パブリッシャーは、同期リモート プロシージャ コール(RPC)ではなく、イベントをブロードキャストすることによってサブスクライバーと非同期に通信します。

元記事を表示

Go言語の英語チュートリアル ペライチ Hello world go version go1.18.3 windows

大学でCのTAをやって以来ですが、Go言語を勉強してみます。

# チュートリアルの概要
Windowsで、cmdとVSCode(要ダウンロード)を使いました。
Go version : go1.18.3 windows/amd64

#1 Hello worldの表示
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/34625e78-333a-b6f9-4b52-35464b7afb52.png)

# 参考リンク
Goのgetting started(入門講座)
https://go.dev/doc/

# Installing Go
## 1. Goのインストール
windows版をインストール

### 1.2 VSCodeのインストール
 https://zenn.dev/em0/articles/41bbfb9aae6bb9240fa9
 を参照。
 https://code.visualstudio.com/docs/?dv=win

### Step3

元記事を表示

DDDをざっくり理解してみる① ~エンティティと値オブジェクト編~

# はじめに
設計方面の知見が虚無すぎたので、以下書籍を用いて社内でDDDの勉強会を開催することにしました。
この記事は勉強会の内容をまとめたものです。
スタンスとしては初めはざっくりと理解して、回を追う毎に正確に理解していくというものです。
ただざっくりと言っても「さすがに間違っているのでは」というところもあると思うので、是非色々とご指摘いただけたら嬉しいです。

https://www.amazon.co.jp/%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88%E5%85%A5%E9%96%80-%E3%83%9C%E3%83%88%E3%83%A0%E3%82%A2%E3%83%83%E3%83%97%E3%81%A7%E3%82%8F%E3%81%8B%E3%82%8B-%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88%E3%81%AE%E5%9F%BA%E6%9C%AC-%E6%88%9

元記事を表示

【自己学習】Go言語を学ぶ(5)

公式チュートリアルから基本を学ぶ
https://go-tour-jp.appspot.com/list

# Zero values(ゼロ値)

* 変数に初期値を与えずに宣言すると、ゼロ値( zero value )が与えられます。

* 初期値
* 数値型(int,floatなど): 0
* bool型: false
* string型: “” (空文字列( empty string ))

サンプルコード

“`go
package main

import “fmt”

func main() {
var i int
var f float64
var b bool
var s string
fmt.Printf(“%v %v %v %q\n”, i, f, b, s)
}
“`
結果:0 0 false “”

# Type conversions(型変換)

サンプルコード
※`math.Sqrt`を使って各値の平方根を計算する

“`go
package main

import (
“fmt”
“math”
)

fun

元記事を表示

JavaとVB.NETしか仕事でやったことないけどGo言語触ってみる

# Go言語の本がKindleで安かったので買ってみた
Kindleの日替わりセールでたまたま500円だったので買いました。
友人もお勧めしてたのでせっかくなので読み進めてみます。
業務では5年ほどJava、VB.NETを扱ってきましたが、それぞれの違いなどについてざっくり書こうかなって思います。(基本Javaです)
あとこれを書き終わるくらいには何か動くものがあればうれしいなと思ってます。

↓これを読みました。

# 開発環境を作る
## IDE
新しい言語ならVSCode一択でしょ、と思ってVSCodeをダウンロードします。
プラグインは、軽くググって必須なものに加えてざっくり便利そうなものをいくつか選んで入れておきます。
まだ歴が浅いのでこんなの便利だよ~みたいなのあれば教えてほしいです。

## バージョン管理
SourceTreeが見やすいのでこれを入れます。
それとGitHubアカウン

元記事を表示

【自己学習】Go言語を学ぶ(4)

公式チュートリアルから基本を学ぶ
https://go-tour-jp.appspot.com/list

# Basic types(基本型)
### 基本型についてまとめ

* 論理値型
bool ()

* 文字列型
string

* 数値型
* 符合付き整数型
int int8 int16 int32 int64
* 符合なし整数型
uint uint8 uint16 uint32 uint64 uintptr

* byte型
byte // uint8 の別名

* rune型(Unicodeの番号を10進数に変換したものを返す)
rune // int32 の別名
// Unicode のコードポイントを表す

* 浮動小数点型
float32 float64

* 複素数型
complex64 complex128

# 論理値型
サンプルコード
“`go
package main

import “fmt”

func main() {
var b bool

b = true
b = false
b = trie

元記事を表示

【自己学習】Go言語を学ぶ(3)

公式チュートリアルから基本を学ぶ
https://go-tour-jp.appspot.com/list

# Variables(変数)

* varで変数宣言を行える。

サンプルコード
* c, python, javaはbool型
* i はint型

“`go
package main

import “fmt”

var c, python, java bool

func main() {
var i int
fmt.Println(i, c, python, java)
}
“`
結果:0 false false false

# Variables with initializers(変数の初期化)

* var 宣言では、変数毎に初期値を指定できます。

サンプルコード
* i jをint型で i = 1 j = 2を指定
“`go
package main

import “fmt”

var i, j int = 1, 2

func main() {
var c, python, java = true, false, “no!”
fmt

元記事を表示

GORM v1.0からv2.0への移行時のハマりポイント(v1とv2の変更点)

# 概要

* 以前、GORM v1.0からv2.0にアップグレードをしたのですが、その際ハマったポイントとどんな変更があるのかについてまとめていきます。

## ハマりポイント

* GORM v2.0は仕様変更がかなり多く、すんなりv1.0からv2.0に移行できません。
* かくいう私もGORMのアップグレードをした際ちゃんと調べなかったので、テストコードを書いている時に挙動のおかしさに気づいてから原因解明までに時間がかかってしまいました。。
* 実際に私がぶち当たったハマりポイントというのが、外部キーによる参照をした際に、正しく外部キーの参照が行えておらず期待値とは違うSQLが発行されていました。

### 変更点1

* 外部キーによる参照を行う際にforeignkey, association_foreignkeyの指定があったのですが、この書き方が変わり、foreignkeyとreferencesを使った書き方に変更されました。

**v1**
“`go
`gorm:”foreignkey:hoge;association_foreignkey:huga;” json:”

元記事を表示

Interface って一体なんなの?

こんにちは。masafumiです。
現職場に転職してきて約半年が経ちました。
GoやPerl、DDD、API実装、テストコードなど日々新しい知識に触れ、まだ分からないことだらけですが、一つ一つ自分の身にできていってるのではと感じます。
最近、新しいプロジェクトが始まり、そこからほとんどGo言語でのコーディングにシフトしましたが、その中でこの **Interface** というやつが特に最初よく分からなかったので、現状の私なりの理解をまとめたいと思います。

# Interfaceとは?

職場の先輩の「まずは公式ドキュメントを見る」という心がけに私も習って、まずはGo言語公式の「[A tour of Go](https://go-tour-jp.appspot.com/methods/9 “Interfaces”)」の中でのInterfaceの定義を再確認してみます。

「Interfaceとはメソッドの集合」
Interfaceはメソッドのシグネチャーの集合です。
従って、Interfaceの中に含まれる型は全てメソッドである必要があります。
A tour of Goの中では、例と

元記事を表示

goで画像のトリム処理を行う

# はじめに

こんにちは、icemint0828です。
今回は自作パッケージの紹介も兼ねて、goでの画像のトリム処理の方法を紹介します。

## 動作環境
go 1.18.1

## 使用パッケージ

* icemint0828/imgedit
画像のトリム処理に使用しています。
画像ファイルの拡張子の変換にも使用しています。

https://github.com/icemint0828/imgedit

## インストール

“`shell
$ go get github.com/icemint0828/imgedit@v1.3.0
“`

# 画像のトリム処理

“`main.go
package main

import (
“github.com/icemint0828/imgedit”
)

func main() {
// 切り取り開始位置の指定(px)
left, top := 100, 100

// サイズの指定(px)
width, height := 400, 400

// FileConverter
fc, _, err := i

元記事を表示

Goで学ぶTEE入門(EGo)

# はじめに

コンピュータの処理で利用中のデータを保護することが求められている。
これはサービスの内部犯や、サーバに不正ログインした攻撃者といった脅威から、資産を守るためである。
(一般的な暗号技術は、転送中や保存したデータを保護するが、実行中は保護しない。)

そこで利用中のデータを保護するフレームワークである[EGo](https://www.edgeless.systems/products/ego/)について紹介する。
EGoはTEE(Trusted Execution Environment)と呼ばれる技術を用いて、利用中のデータを保護する。
TEEは外部からの不正なアクセスが難しいハードウェアを用いて利用中のデータを保護する。

EGoはGo言語を使ってTEEで動作するプログラムを記述できる。

TEEは主に以下の性質を持つ[^seisitu]。

– **機能1. 隔離性** OSやアプリケーションから隔離される
– **機能2. 機密性** メモリに保存する内容を暗号化する
– **機能3. 証明可能性** TEEで動いているプログラムについて証明できる

**この

元記事を表示

不変性とエイリアス参照と意味論と

## はじめに

これはGoに不変参照が存在しない理由を雑に推測してみたものを文章にまとめたものです。
ぜんぜん間違っている可能性があるので、そうだった場合はこっそり教えてください。

## Go

Goは値セマンティクスと参照セマンティクスを明確に使い分ける言語です。
それはだいたいの言語がそうなのですが、Goではどうやらこれを不変性と結びつける、すなわち不変セマンティクスと値セマンティクスが結びつき可変セマンティクスと参照セマンティクスが結びついているといった言説を目にすることが少なからずあります。

当然みなさんはC言語を履修していますから、const参照といった概念があるではないかと気がつかれたかと思います。

Goには参照に対して不変性を与えるセマンティクスはありません。
[公式のFAQ](https://go.dev/doc/faq#methods_on_values_or_pointers)では値を渡すか参照を渡すかによって使い分けるような設計を奨励しているようです。

なんということでしょう!Goは安全性のための意味論を無意味にゴミ箱に投げ捨てて、値は不変・参照は可変と

元記事を表示

クライアントサーバ方式とP2P (STUN)でファイルの転送速度を比較してみたらP2Pの方が圧倒的に遅かった件

# 初めに
タイトルが全てです。ファイル転送をクライアントサーバ型とP2Pで実装して速度を比較しようとしましたが、良い結果が得られなかったのでその過程をここで供養します。

# 目次
[クライアントサーバ型とP2Pの通信方式について](#クライアントサーバ型とp2pの通信方式について)
[P2Pに立ちはだかる課題「NAT越え」とは](#p2pに立ちはだかる課題nat越えとは)
[NATを越える為の技術](#natを越える為の技術)
[基本P2Pの方が早い](#基本p2pの方が早い)
[仮説](#仮説)
[検証方法](#検証方法)
[結果](#結果)
[考察](#考察)
[まとめ](#まとめ)

# クライアントサーバ型とP2Pの通信方式について
**クライアントサーバ型**
コンピュータをサーバ(サービスを共有する側)とクライアント(サービスを授受する側)に分け、役割を分担して運用する仕組みです。
クライアントはサーバに対してほしいデータをリクエストし、それに対してサーバは要求されたデータを送ります。
P2Pと比較したときに、クライアントサーバ型は中央集権型の構造として語られます。おそ

元記事を表示

WebSocket Byte、Stringの送受信の検証

ブラウザからWSを通して送受信できるデータについて確認、実装を行います。

## クライアントで扱うことができるデータタイプ

[規格](https://websockets.spec.whatwg.org/#ref-for-dom-websocket-send%E2%91%A0)のレファランスから「Blob、ArrayBuffer」を扱っていることがわかりますが、[MDNのレファランス](https://developer.mozilla.org/ja/docs/Web/API/WebSocket/send)からは「USVString」も追加でサポートしていることが記載されています。
「Blob」は基本的にファイルデータを指していますが、データを転送する際に「ArrayBuffer」からバイトを転送することと大きく変わりはないため、今回はByteデータの送信で検証します。

## クライアントが受け取るデータタイプ

データ転送時とは違く、[MDNのレファランス](https://developer.mozilla.org/en-US/docs/Web/API/MessageEve

元記事を表示

Go言語で Codewars の問題を解くための設定

# はじめに

Codewars の Go の問題はテスティングフレームワークとして Ginkgo https://onsi.github.io/ginkgo/ を使っているけれど、このフレームワークの使い方がわからなて試行錯誤して一応問題を解く上では困らなくなったのでメモを残す。
手順は以下の通り

– 作業ディレクトリの作成
– モジュールの初期化
– フレームワークのダウンロード
– テストコードのコピー・ペースト
– テストの実行

Codewars ではパッケージ名に kata を使うのが一般的なようなので、モジュール名を codewars、パッケージ名を kata にする。

## 作業ディレクトリの作成

“`
mkdir -p codewars/kata
“`

## モジュールの初期化

“`
cd codewars
go mod init codewars
“`

## フレームワークのダウンロード

ginko は v2 を使うことにした。特に理由はないが、Codewars のテストコードは v2 を使うように後で変更する。

“`
go ge

元記事を表示

OTHERカテゴリの最新記事