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

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

# 【Go】画面は作らずにToDo管理システムを作る(第1章)

最近になって仕事、プライベートに余裕が出てきたのでGoに再入門しました。簡単なコードを書こうと思い、DB操作が絡むToDo管理システム(もどき)を作ることにしました。ですが画面を作るのが憂鬱だったので、HTTPリクエストでイベントを起こしてDB操作する仕組みにします。(画面を作るスキルがないのでこの道しかありませんでした。)

先日投稿した記事も本記事に関連しているので、良ければご覧ください。

## 技術スタック

**バックエンド:**Go

**DB:**SQLite

**ツール:**Postman、TablePlus、VSCode

## データベース構造

| カラム名 | id | content | finish | updated | created |
| — | — | — | — | — | — |
| | PK | | | | |
| カラム概要 | ID | ToDoの内容 | 完了フラグ 0:未完了,1:完了 | 更新日時 | 作成日時 |
| 型 | 数値 | 文字列 | 数値 | 文字列 | 文字列 |

“`sql

元記事を表示

ズボラで面倒くさがりな人に向けた git-commit message linter

普段 git の commit message を丁寧に書かかないことをチクリと刺され辛い… ってなってるエンジニアです。

# 日本語読むの疲れるって人に
gitのcommit messageを綺麗にしたいけど、linter よくわからん!!!って人に向けたツールを作ったので使ってください。

https://github.com/masahiro331/go-commitlinter

## 雰囲気
`(): ` のフォーマットに沿わない commit messageにすると git commit を失敗させます。

![スクリーンショット 2022-02-07 8.57.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308125/d988862e-8ede-d941-3740-ed9e46c6da55.png)

## 導入方法
“`
# go言語使ってない人はこれを機に brew install golang してくれ
go insta

元記事を表示

Go言語 テスト用のモックを自動生成する (GoMock)

## はじめに

Go言語を用いた開発においては、コードの品質担保や予期せぬ修正の影響による不具合検知などのために、標準機能の go test で実行できる単体テストをあわせて書くことが多いと思います。

単体テスト実装に際しては、並列実行で短時間にテストを終わらせるためだったり、GitHub Actions や CircleCI のような限定的な環境で実行できるよう、ファイルの入出力や外部のAPIやDBサーバへの接続を行う処理などを、モックで代用して記述することが多いと思います。

インターフェイス定義などからモック処理を自動で生成してくれるツール
[GoMock](https://github.com/golang/mock) の導入と 生成したモックを用いたテストの書き方の紹介です

https://github.com/golang/mock

### 前提

以下の環境、知識を前提とします
– go 1.16以降 Go Modules を利用
– Go言語の基礎知識
– go test の基礎知識

## テスト対象のサンプルコード

※以下サンプルコードではプロジェクトのリ

元記事を表示

リーダブルコードのまとめ。 2/2

前回のリーダブルコードまとめの続きです。

### 8章 巨大な式を分割する
– 式を保持する変数(説明変数)を使う
– ド・モルガンの法則を使う。複雑な論理条件はif(a

元記事を表示

# 【Go】Getパラメータを取得する

以下のリクエストを送って、「サンプル」という文字列を取得したいと思います。

“`
http://localhost:8080/insert?content=サンプル
“`

## コード

“`go
package main

import (
“log”
“net/http”
)

func main() {
handler := func(w http.ResponseWriter, req *http.Request) {
putList(req.FormValue(“content”))
}

http.HandleFunc(“/insert”, handler)
log.Fatal(http.ListenAndServe(“:8080”, nil))
}
“`

## リクエスト送信

![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/951392/f8683707-9ff5-c3a8-3ccc-9df94709a9a7.png)

## 実行結果

元記事を表示

【Go net/http 各メソッド解説】

Goのnet/httpの使い方を理解する必要があったのでまとめてみた。
メモ代わりにする。

## http.ListenAndServe

サーバーを起動するよくあるやつ
第1引数にPORT番号
第2引数に**http.Handler**

## http.Handler
ServeHTTPメソッドを定義しているinterface。つまりinterface。

“`golang
type Handler interface {
ServeHTTP(ResponseWriter, *Request)
}
“`

## http.ServeMux

ServeMux.Handleメソッドを使用して、URLとHandlerの登録ができる。

以下のようにすると/echoURLに対してechoHandlerを登録できる。これによってechoHandlerのServeHTTPメソッドが呼び出されるようになる。

つまり、HandlerInterfaceの実装を第2引数にわたすこととなる。

“`go
func main() {
mux := http.NewServeMu

元記事を表示

[Memo] A Tour of Go -Basics(2)-

# Using the tour

`A Tour of Go`とは
`Go`言語の最も重要な機能について説明するtourです。

https://go.dev/tour/list

## Basics – Flow control statements: for, if, else, switch and defer

### For

`for`ループはセミコロン`;`で3つの部分に分かれています。

1. init statement
2. condition expression
3. post statement

ループは、`condition expression`が false となった場合、停止します

“`Go
func main() {
sum := 0
for i := 0; i < 10; i++ { sum += i } fmt.Println(sum) } ``` 初期化と後処理ステートメントの記述は任意です。 ### For is Go's "while" `init statement`と`post statement`の記述は任意

元記事を表示

# 【Go】文字列をシングルクォートで囲む関数を作る

文字列をシングルクォート(’)で囲む関数を作りました。SQLを動的に作成するときに使いたいと思ます。

## 作成したコード

“`go
package main

import (
“fmt”
“strings”
)

func main() {
str := “Hello World”

fmt.Println(str)
fmt.Println(addSingleQuotesVer1(str))
fmt.Println(addSingleQuotesVer2(str))
}

func addSingleQuotesVer1(ret string) string {
str := []string{“‘”, ret, “‘”}
return strings.Join(str, “”)
}

func addSingleQuotesVer2(ret string) string {
return “‘” + ret + “‘”
}
“`

[https://go.dev/play/p/6k2VGNVzgD4](https://go.dev/play/p/6k2V

元記事を表示

[Memo] A Tour of Go -Basics(1)-

# Using the tour

`A Tour of Go`とは
`Go`言語の最も重要な機能について説明するtourです。

https://go.dev/tour/list

## Basics – Packages, variables, and functions

### Packages

Goのプログラムは、`package`で構成されます。
プログラムは main packageから開始されます。

“`Go
package main
“`

### Imports

このコードでは、括弧でパッケージのインポートをグループ化し、
`factored import statement`としています。

“`Go
import (
“fmt”
“math”
)
“`

### Exported names

`Go`では、
最初の文字が大文字で始まる名前は、
外部のパッケージから参照できる`exported name`です。
例えば、`Pi`は`math`パッケージからエクスポートされています。

“`Go
package main

import (

元記事を表示

初心者がGolangでDiscordBot作って痛い目にあった話

#概要
– GolangでDiscord用抽選Botを開発した
– ライブラリの挿入や構造体の定義が初心者には注意が必要と悟った

#経緯
モンハンで使うBotが作りたかった。以上!

##モンハンワールド・アイスボーン専用のBotを作っていた
毎回モンハンアイスボーンで一緒に狩猟をする友人(HR/MR:999)が

> クエストと狩猟対象もルーレットで決めたい

と~~変なことを~~言っていたため、~~HR400の私は恐怖のあまり拒否できず~~ワールドで出現する武器・モンスター・クエストを全て抽選できるBotをPythonで開発しました。名前を「受付ジョー」としています。食欲が伺える最高の名前ですね。
![スクリーンショット 2022-02-05 16.35.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484148/9d97e2ab-4854-9df1-512e-c0be4a18444e.png)
食事をするだけでなく、武器などの抽選を行ってくれます。
![スクリーンショット 2022-0

元記事を表示

gomock とgotests を使ったCleanArchitectureのusecaseテスト生成術

# 前提
– CleanArchitecture を採用する
– CleanArchitecture のusecase 層のテストをする
– repository 層はgomockによってモックが生成されている
– テストの雛形はVSCode の拡張のgotests の形に基づく[参考: VS CodeのGo言語テストコード生成ツールを使ってみたらめちゃくちゃ便利だった話とか](https://kdnakt.hatenablog.com/entry/2019/01/03/080000)

https://kdnakt.hatenablog.com/entry/2019/01/03/080000

https://github.com/cweill/gotests

# 概要

要件としてrepository 層の関数をモックとして扱う必要がある。
gotests で雛形を生成して[gomock](https://github.com/golang/mock) を用いつつ引数としてmockの初期化関数を渡してモックパターンを柔軟に設定する

https://zenn.dev/sanpo_

元記事を表示

【Udemy】聴きやすい英語のエンジニア向け優良コンテンツ(順次追記)

技術はサッパリだが英語ができるワイは最近Udemyの英語コンテンツで学んでいます。
その中で**聴きやすい英語**で**内容がとてもいい**と判断したものを追記していきます。
合う講師を見つけて、その講師の他の動画を見るのが効率的だと思っています。

#**Udemy英語コンテンツのメリット・デメリット**
**メリット**
・Udemyの英語コンテンツは日本語コンテンツより充実しているものが多い(独断です)
・日本語コンテンツにない技術スタックを扱っている
・最新技術の動画が出るのが明らかに日本語より早い
・副次的に英語力向上にもつながる

**デメリット**
・ネイティブじゃない訛りまくった英語を話す講師も多いため、聞きやすい英語を話す講師を探す必要あり

#**講師リスト**
・[Jonas Schmedtmann](https://www.udemy.com/user/jonasschmedtmann/)
→比較的ゆっくり話す。自分の老いを自覚し、年齢の話題に触れるのを恐れている節がある。
・[Trevor Sawler](https://www.udemy.com/use

元記事を表示

Webex の参加者を Go 言語で取得する

法政大学情報科学部 2 年の阿部哲也です。
今回は Webex の参加者を取得するスクリプトを組みました。

# やること

出席管理を自動化させたいため、webex の参加者を自動で取得するスクリプトを Go 言語で作成します。

流れとしては、mattermost からリクエストが投げられたタイミングで、作成したプログラムがリクエストを投げます。
帰ってきたレスポンスを参考にスプレットシートに反映させるという流れです。(下記参照)
今回は GO 言語で API を取得するところまで書きます。

“`
mattermost → golang → webex API → Googleスプレットシート
“`

本当は Zoom でやりたかったのですが、Zoom API が有料アカウントではないとできない & 法政大学のアカウントは有料アカウントだが API が取得できない設定になっていたため、断念して Webex にしました。

# webex API で情報を取得

大まかな流れは下記みたいな感じです。今回は現在 meeting に参加している参加者をリアルタイムで取得します。

元記事を表示

Homebrewでバージョンを指定してGoをインストールする方法

Homebrewでバージョンを指定してGoをインストールする方法をご紹介します。
まず、`Homebrew`でインストールできるGoのバージョンを確認するために下記のコマンドを実行します。

“`
% brew search “go@1″    #brew search goでも可
==> Formulae
go@1.10 go@1.12 go@1.14 go@1.16 go    gom
go@1.11 go@1.13 go@1.15 go@1.9 gor gox
“`
  

今回は` go@1.16`をインストールしたいと思います。下記コマンドを実行します。

“`
% brew install go@1.16
“`
  

指定したバージョンがインストールされていることを確認します。

“`
% go version
go version go1.16.13 darwin/amd64
“`

元記事を表示

# GoでSQLiteに接続してレコードを取得する

少し間が空きましたが、以前学習していたGoに再入門します。

手始めにデータベース接続するコードを書いてみました。データベースは気軽に使用できるSQLiteを利用しました。テスト用のレコードを作成して、それを取得してみます。

以下は全レコードになります。※貼り方が雑ですみません。

“`
テーブル名:list

id,content,finish,updated,created
1,テスト,0,2022/2/4 21:36:00,2022/2/4 21:36:00
“`

## 作成したコード

“`go
package main

import (
“database/sql”
“fmt”

_ “github.com/mattn/go-sqlite3”
)

func main() {
db, err := sql.Open(“sqlite3”, “./todolist.sqlite3”)
checkErr(err)
defer db.Close()

rows, err := db.Query(“SELECT * FROM list”)
checkEr

元記事を表示

【gRPC】GoでStreaming APIを実装する

#はじめに
前回の記事で、gRPCのAPIタイプの内、1リクエストに対して1レスポンスを返すUnaryを実装しました。
今回は1回のコネクションで複数のリクエストやレスポンスを送るタイプである、Streaming APIを実装してみました。

https://qiita.com/suzuki0430/items/c0efd9a00ba0a7d77a88

#Streaming API
Streaming APIはHTTP/2の恩恵を受けており、リクエスト/レスポンスのたびにコネクションを確立しないというメリットをもちます。
3種類のタイプがあり、それぞれが以下のような特長をもっています。

– Server Streaming: 1リクエストに対して複数レスポンスを返す。サーバが大量のデータを送りたいとき(ライブ配信やチャット)に使い、リクエストを受け取らずとも非同期でレスポンスを返す。
– Client Streaming: 複数リクエストに対して1レスポンスを返す。クライアントが大量のデータを送りたいとき(データアップロードなど)に使い、サーバは非同期でレスポンスを返すことができる

元記事を表示

M1 Mac も速くないことがある

# これは何?

先日まで Mid 2015 の 15 inch MacBook Pro (Core i7 クアッド / 2.2 GHz) を使っていた。
先日 MacBook Pro 14 inch (M1 非Max) を手に入れたんだけど、あんまり速くないなと思うことがあったので、今日も楽しいマイクロベンチマーク。

# 計算内容

ruby で書くと短くていいね。

“`ruby:ruby
N=10000
r=(1..N).max_by{ |x| ((N-x)**x/7) % 6074001001 }
p r
“`
こういう内容。なんの意味もない。

出力は

“`text
8663
“`

となれば正解。

これを、go, java, c++ with boost (clang, gcc), ruby, python3, node で試した。

以降、グラフで出てくる “m1”, “rosetta”, “amd64” の意味は下表のとおり。

|記号|実行ハードウェア|バイナリ|
|:–|:–|:–|
|m1|MacBook Pro 14 inch (M1 非Ma

元記事を表示

Raspberry pi 4 2台を使って映像配信と受信してみた。【Gstreamer +Golang (gocv)】

## はじめに
OpenCV4の入力にカメラ映像ではなく、Gstreamerからの入力を受け取り表示します。
Raspberry piのカメラユニットの映像を別PCで動かしているOpenCvで受信してみます。

今回動かすシステムの構成としてはこのようになっています。

“`
WEB camera – Raspbery pi 4(カメラ配信サーバ) ===== Raspberry pi 4(受信サーバ)
“`

Gstreamer の勉強も兼ねているので、先ずは単機で動かしてステップアップ方式で進めていきます。

記事の構成がわかりにくくてクソなのですが、「機器間配信のテスト」まではWindows10で実行しています。
それ以降はRaspberry pi4 2台を使って配信と受信を行っています。

大まかな流れは変わらないのでご容赦ください。

## Gstreamerでの配信について
配信する側もゆくゆくはソフトとして作っていきますが、今回はコマンドラインで代用します。

### Gstreamerの動作確認
インストール済みだとは思いますが、映像を配信できるかを確かめます。

元記事を表示

[Go] Structs

# Structs とは

`Go` には関連する情報をまとめするため、 `structs` が使われる

# Defining and Declaring

“`Go
package main

import “fmt”

type person struct {
firstName string
lastName string
}

func main() {
var aaa person
fmt.Println(aaa) // The default value is a empty string.
fmt.Printf(“%+v\n”, aaa) // Use the “%+v” can print the fields also.

// Updating Struct Values
aaa.firstName = “aaa”
aaa.lastName = “player”
}
“`

# Embedding Structs

`Structs` に `structs` も宣言できる

“`Go
package main

impor

元記事を表示

Go導入リンク

# Go導入リンク

新しく案件でGoを使うことになったので使えそうなドキュメントをリンクしていく
随時更新予定

追記予定:
デプロイ周り
Unity連携
gRPC-web

# Goダウンロード・インストール

**公式サイト**

https://go.dev/

**ダウンロード**

https://go.dev/dl/

**確認**

“`bash
$ go version
go version go1.17.6 darwin/amd64
“`

# エディタ

VSCodeやAtomなどにプラグイン入れる方法もあるが、すぐ始められて多機能なJET BRAINSのGoLandが一番いいと思う(有料だけどその価値はあった

https://www.jetbrains.com/ja-jp/go/

# チュートリアル

## A Tour of Go

初学者は一通りこれを見ればいい、ポインタ、Goroutineだけ理解を深めるため他のサイトも見た。

https://go-tour-jp.appspot.com/welcome/1

### メモ

以下、Go特有だった

元記事を表示

OTHERカテゴリの最新記事