- 1. Go言語におけるエラー型の生成方法 | erros.Newとfmt.Errorf
- 2. RestAPIをCleanArchitectureで実装する際のreq/resの持ち回りについて
- 3. Goで書かれたLambdaのpanic時、CloudWatchLogsにスタックトレースが出ない
- 4. # 【Go】画面は作らずにToDo管理システムを作る(第1章)
- 5. ズボラで面倒くさがりな人に向けた git-commit message linter
- 6. Go言語 テスト用のモックを自動生成する (GoMock)
- 7. リーダブルコードのまとめ。 2/2
- 8. # 【Go】Getパラメータを取得する
- 9. 【Go net/http 各メソッド解説】
- 10. [Memo] A Tour of Go -Basics(2)-
- 11. # 【Go】文字列をシングルクォートで囲む関数を作る
- 12. [Memo] A Tour of Go -Basics(1)-
- 13. 初心者がGolangでDiscordBot作って痛い目にあった話
- 14. gomock とgotests を使ったCleanArchitectureのusecaseテスト生成術
- 15. 【Udemy】聴きやすい英語のエンジニア向け優良コンテンツ(順次追記)
- 16. Webex の参加者を Go 言語で取得する
- 17. Homebrewでバージョンを指定してGoをインストールする方法
- 18. # GoでSQLiteに接続してレコードを取得する
- 19. 【gRPC】GoでStreaming APIを実装する
- 20. M1 Mac も速くないことがある
Go言語におけるエラー型の生成方法 | erros.Newとfmt.Errorf
## Go言語のコードを書いている時に意図的にエラー型を生成したい時がある
例えば、os.Openやos.Createの関数などはerrorを返す関数になっています。このようなerrorが自然に発生する場合にはerrorを意図的に生成する必要がありません。
しかし、コードを書いていると、errorを意図的に生成したいタイミングがあります。
### エラーが自然に発生しないパターンの例
– string型の引数が空文字の場合、errorを返したい時
▼サンプルコード
“`go
func exampleFunc(str string) error{
if str == “” {
panic(“empty string”) //本当はerrorを返したい!
}
return nil
}
“`– switch文のdefaultでpanicではなく、errorを返したい時
▼サンプルコード
“`go
func exampleFunc(flag int) error{
switch(flag) {
case 1:
fmt.Println(“case 1”
RestAPIをCleanArchitectureで実装する際のreq/resの持ち回りについて
※[zennに投稿した記事](https://zenn.dev/burizae/articles/440abd4624e043)の転載です。
## 概要提題の通り、CleanArchitectureに則ってRestAPIを実装する場合に、
以下の2点に迷ったので、結論とそれに至るまでの考えを書き残しています。– requestオブジェクトはどのレイヤーまで持ち回すべきか?
– responseオブジェクトはどのレイヤーで生成するべきか?## 背景
よくあるシンプルなCRUDアプリを実装する際、以下のような処理を実装するとします。
“`
リクエストボディからタスク名を受け取る
↓
DBに新規タスクとしてレコードを登録する
↓
登録したレコードの情報をレスポンスとして返す
“`この場合、controller→usecase→repositoryとMVCやレイヤーアーキテクチャ的にパッケージを掘っていき処理を実現して行くのは誰もが違和感なく考えられることですが、
今回はCleanArchtectureを採用しているため、c
Goで書かれたLambdaのpanic時、CloudWatchLogsにスタックトレースが出ない
## 現象
Goで書かれたLambdaでpanicが発生した際、CloudWatchLogsにスタックトレースが出ず、下記エラーログに固定されるため、
原因の調査が出来なくて困った。“`shell
2022/02/01 07:16:00 calling the handler function resulted in a panic, the process should exit
“`## 原因
[aws-lambda-go](https://github.com/aws/aws-lambda-go)のバージョン、v1.24.0を利用していたが、
上記だと、panic時にログに出力しない実装になっている。https://github.com/aws/aws-lambda-go/blob/v1.24.0/lambda/invoke_loop.go#L50
## 解決策
[aws-lambda-go](https://github.com/aws/aws-lambda-go)のバージョンをv1.27.1に上げる。
https://github.com/aws
# 【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 mainimport (
“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 mainimport (
“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 mainimport (
初心者が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を利用しました。テスト用のレコードを作成して、それを取得してみます。
以下は全レコードになります。※貼り方が雑ですみません。
“`
テーブル名:listid,content,finish,updated,created
1,テスト,0,2022/2/4 21:36:00,2022/2/4 21:36:00
“`## 作成したコード
“`go
package mainimport (
“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