- 1. deferの実行タイミング
- 2. 【Go】http.HandleFunc()とhttp.Handle()の使い分けは構造体のフィールドを使うかどうか
- 3. GoでExcelを操作する
- 4. echoでより高速なJSONを返す
- 5. A Tour of Go メモ【2】1日目
- 6. A Tour of Go メモ【1】1日目
- 7. レイヤードアーキテクチャ+DDDでAPI開発[入門]
- 8. sqlfile : GoでSQLファイルを簡単に実行する
- 9. production-ready なGo製2Dゲームライブラリ Ebiten の紹介 & リンク集
- 10. AtCoder Beginner Contest 174 参戦記
- 11. GoのBenchmarkに出てくる関数名の後ろの数字
- 12. Go言語のチュートリアル A Tour of Go のチートシート その1 - Basics
- 13. [Go] Cobraをgo getでインストールしようとするとcommand not foundになる問題の解決
- 14. Goでスライスを逆順にする
- 15. 構造体のインスタンス作成時に&を付ける必要がある時
- 16. goreleaserをGithub Actionsで利用するまでのQuick Start
- 17. Go言語で kintoneアプリのフィールド情報をCSV出力するコマンドラインツールを作った話し
- 18. 毎回go.modとmain.goを作るのがめんどくさい
- 19. 【Go】sqlxでBulk Insert
- 20. 身に覚えのない"invalid character 'ã' looking for beginning of value"の原因
deferの実行タイミング
# タイミング
– return
– panic# 参考
– [kakakakakku blog](https://kakakakakku.hatenablog.com/entry/2015/12/15/222217)
【Go】http.HandleFunc()とhttp.Handle()の使い分けは構造体のフィールドを使うかどうか
# はじめに
http.HandleFunc()とhttp.Handle()でServeHTTPを読んでいるのに
なにが違っているのか分からなかったので調べてみました。# 結論
構造体のフィールドを使いたいかどうか# http.HandleFunc()とhttp.Handle()
[GoのドキュメントのPackage http](https://golang.org/pkg/net/http/)のよると>ListenAndServe starts an HTTP server with a given address and handler. The handler is usually nil, which means to use DefaultServeMux. Handle and HandleFunc add handlers to DefaultServeMux:
とどちらもDefaultServeMuxのパターンとしてハンドラを登録するもの。
DefaultServeMuxについてやハンドラとの関係性については以下の記事がわかりやすいです。
[【Go】ne
GoでExcelを操作する
Goでエクセルファイルを操作する方法のメモです。
**tealeg/xlsx**ライブラリを使うと簡単でした。## Gitのインポート
github上のライブラリを使用するため、[Git](https://git-scm.com/)のダウンロードが必要でした。
※設定はデフォルトのままで行いました。## ライブラリのインポート
コマンドプロンプトで以下のコマンドを実行すると、エクセルの[ライブラリ](https://github.com/tealeg/xlsx)が使えるようになります。go get の後のURIは[GoDoc](https://godoc.org/github.com/tealeg/xlsx#pkg-index)で検索して取得しました。
“`
go get github.com/tealeg/xlsx
“`コマンドで実行するだけなので楽でした。
## プログラム作成
テスト用として、エクセルにシートを追加するプログラムを作成しました。<手順>
1. goファイルと同階層に新規ワークシートを作成
2. ファイル名を「テスト」とリネームして保存
echoでより高速なJSONを返す
# はじめに
goのwebフレームワークである[Echo](https://github.com/labstack/echo)にてデフォルトのJSONよりも高速なJSONを返したいことがあると思います。その例として[easyjson](https://github.com/labstack/echo)で作ったJSONを返そうとしたときに少し詰まりどころがあったので書き留めておきたいと思います。# まずはデフォルトから
“`golang:main.go
package mainimport (
“github.com/masibw/echo_json/model”
“net/http”
“github.com/labstack/echo/v4”
“github.com/labstack/echo/v4/middleware”
)func main() {
// Echo instance
e := echo.New()// Middleware
e.Use(middleware.Logger())
e.Use(middleware.Recover())
A Tour of Go メモ【2】1日目
[A Tour of Go](https://go-tour-jp.appspot.com/flowcontrol/1 #)
時折、コードを変更したり、関連記事を調べたりしながら、学習しました。# for
“`
func main() {
sum := 0
for i :=0; i < 10; i++ { sum += i fmt.Println(i) fmt.Println(sum) } } #省略可能 for ; sum < 100; { sum += sum } #さらに省略可能 for sum < 100 { sum += 100 } # 無限ループ for { } ``` # if ``` func judge(x int) string { if x > 0 {
return “マイナス”
}
return fmt.Println(“プラス”)
}
func main() {
fmt.Println(judge(−100
A Tour of Go メモ【1】1日目
# goのチュートリアル
[A Tour of GO](https://go-tour-jp.appspot.com/basics/1 #)
時折、コードをいじって、どんなエラーが出るかなどを試しながら、学習しました。#出力
“`packages.go
package main# パッケージをインポート
import (
# 出力のためのパッケージ
“fmt”
)func main() {
# 出力
fmt.Println(“Hello World”))
}
“`#パッケージのインポート
“`packages.go
package main#複数行で書くこともできる
import “fmt”
import “math”#こっちの方がスマート
import (
“fmt”
“math”
)
“`#関数と引数
“`function.go
package mainimport “fmt”
#変数の後ろに型名を指定する必要がある
func add(x int, y int) int {
return x + y
}
レイヤードアーキテクチャ+DDDでAPI開発[入門]
## 前書き
– 著者の理解が甘く間違っている箇所もあるかもしれません。その際は優しく教えていただけると幸いですmm
– レイヤードアーキテクチャは具体的なディレクトリ構成等を示すものではなく、あくまで**概念的な指標**です。正解はありません。なるべく初学者にもわかりやすい様に書きました。
始めは実装コード等理解しづらいと思いますが、概念的な理解の足掛かりにしていただけると嬉しいです☺️## レイヤードアーキテクチャって何?
### 概要
**ソフトウェアの関心事をレイヤー毎に分離するための設計方法の一つ**です。
他にもクリーンアーキテクチャ・オニオンアーキテクチャなどが有名ですが、どれも**責務・依存関係を明確化する**というゴールは変わりません。### メリット
アーキテクチャを導入する主なメリットは以下の二つです。– DBやUI・ビジネスロジックなど、**仕様変更の際にコードの修正箇所が明確・軽微**
– 各レイヤーにおいてテストする目的が明確・処理をモックしやすいことから**テストしやすい**仕様変更に強くテストもしやすいことから、**保守運用しやすい*
sqlfile : GoでSQLファイルを簡単に実行する
GoでSQLファイルを簡単に実行するためのライブラリを作ったので,その紹介をします.
https://github.com/tanimutomo/sqlfile
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224401/71f574df-6389-83ce-4762-a47c06a653c7.png)
## はじめに
Goで複数のクエリが書かれたSQLファイルを実行できるライブラリがなかったので,作りました. [sqlfile](https://github.com/tanimutomo/sqlfile)**作成の背景**
Goで,DAO (data access object) パッケージのユニットテストの際にseed data挿入が必要になりました.
RailsのFixtureのような,seed dataを作成するためのパッケージとして,[testfixtures](https://github.com/go-testfixtures/testfixtures) という
production-ready なGo製2Dゲームライブラリ Ebiten の紹介 & リンク集
## はじめに
[Ebiten](https://ebiten.org/) は、Goで書かれた非常にシンプルな2Dゲームライブラリです。(公式サイト: https://ebiten.org)圧倒的な安定性を誇り、今2Dゲームを作るなら非常にオススメ! というわけで、改めて紹介記事を書いてみます。
ねずみバスターズ、インドとブラジルに数万人規模でリリースしたんですが、報告されたクラッシュが30件程度なので驚愕の安定性…
— Daigo (@daigo) September 11, 2020
AtCoder Beginner Contest 174 参戦記
# AtCoder Beginner Contest 174 参戦記
9ペナの大爆死. 終了1分半前にギリギリE問題を通したおかげで、レーティングが小ダウンで済んだ.
## [ABC174A - Air Conditioner](https://atcoder.jp/contests/abc174/tasks/abc174_a)
1分で突破. 書くだけ.
```python
X = int(input())if X >= 30:
print('Yes')
else:
print('No')
```## [ABC174B - Distance](https://atcoder.jp/contests/abc174/tasks/abc174_b)
2分半で突破. 書くだけ.
```python
N, D = map(int, input().split())result = 0
for _ in range(N):
X, Y = map(int, input().split())
if X * X + Y * Y <= D * D:
GoのBenchmarkに出てくる関数名の後ろの数字
Goのベンチマークをするときに出てくる
関数名の後ろの数値ってなんだっけとど忘れしたのでメモしておきます。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54313/2f10a318-b5d7-2cf1-3116-f2ab5be38cd1.png)
関数名-4 <-この"-4"の事ですね。 これはベンチマークに使ったCPU数です。 なので ``` go test -bench . -cpu 2 ``` のようにCPU数を指定すると ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54313/61b32db7-e8ba-b004-31b0-4882c21f2fa2.png) ちゃんと変わります。 普段からGo使ってる人にとっては当たり前の事かもしれませんが 使ってないと知らなかったり忘れたりするので。
Go言語のチュートリアル A Tour of Go のチートシート その1 - Basics
Go言語入門の定番、チュートリアル [A Tour of Go](https://go-tour-jp.appspot.com/list) をやったので、復習を兼ねて内容をまとめておきます。
また、チュートリアル中、何度も前のページに戻って確認しなければならなかったので、これからやろうという方にはチートシートとしてお使いいただけます。
チュートリアルをやる代わりに、さらっと眺める用途にもどうぞ。
# Packages, variables and functions
## パッケージとインポート・エクスポート
- プログラムはmainパッケージから実行される。
- importでパッケージを読み込む。
- 大文字で始まる名前はエクスポートされる。```go
// ファイルの冒頭にpackage名を宣言する
package main// パッケージのインポートをグループ化できる
// factored import statementと呼ばれる
import (
"fmt"
"math"
)func main() {
// Printf /
[Go] Cobraをgo getでインストールしようとするとcommand not foundになる問題の解決
## 問題
cobraをインストールしてCLIを書いてみようと思って、cobra公式のインストールコマンドを実行した。
```
go get -u github.com/spf13/cobra/cobra
```その後cobraがインストールされたか確認しようとしたら`command not found`と表示された。
```
cobra --help
command not found
```ちゃんと`$GOROOT`や`$GOPATH`、`$GO111MODULE`などの環境変数の設定もしているので謎だった。
## 環境
* MacOS Catalina 10.15.6
* go version go1.15 darwin/amd64
* goenv 2.0.0beta11## 解決策
よく見るとインストールコマンドを実行した時のメッセージは以下のようになっていた。
```
go: github.com/spf13/cobra/cobra upgrade => v0.0.0-20200909172742-8a63648dd905
go get git
Goでスライスを逆順にする
ドキュメントをみたら、`sort.Reverse()`という関数があった。お、これはPythonの順番を逆転する例のやつかな、と思って使ってみた。
```go
a: l = []string{"a", "b", "c"} // lはLess, Len, Swapが定義されたインタフェース
sort.Reverse(a)
log.Println(a)
// "a", "b", "c"
// 変わってない!
```え、何も仕事してないじゃん、と思ってコードを見てみたら・・・
つまり、`sort.Interface`を実装してからソートしていたもうはるか思い出せないぐらい過去の時代のためのコードで、単に`Less()`メソッドのtrue/falseを逆転させた別のインタフェースを作っているだけで、ここからソートしてあげないとソートはされない
```go
a: l = []string{"a", "b", "c"}
sort.Sort(sort.Reverse(a))
log.Println(a)
// "c", "b", "a"
// 変わった!
```まあ、今時なら`sor
構造体のインスタンス作成時に&を付ける必要がある時
Goでhttp.Clientを使う際に
```
transport := &http.Transport{}
```なんで&付けないとダメなのだろうと調べてみた。
付けないと```
client := http.Client{
Transport: transport, // ここでエラーが出る
}
```> cannot use transport (type http.Transport) as type http.RoundTripper in field > value:
> http.Transport does not implement http.RoundTripper (RoundTrip method
> has pointer receiver)怒られる。
> RoundTrip method has pointer receiver
interfaceを実装する構造体で、メソッドにポインタレシーバを使うと
構造体を作成する際に、ポインタを取らないとダメらしい。```
type Hoge interface {
SetNam
goreleaserをGithub Actionsで利用するまでのQuick Start
goreleaserは、Goプロジェクトをビルドして、各OS向けの実行可能バイナリやDocker Imageを作成し、GithubのReleaseやDocker Repositoryに配布してくれるツールです。この記事ではGithub Actionsを利用して、goreleaserによるビルドから配布までを自動化するまでの手順を示します。
# 1) goreleaserのインストール次のURLを参考にgoreleaserをインストールし、`goreleaser`コマンドを利用できる環境にします: https://goreleaser.com/install/
個人的には公式のDockerイメージを使うのが一番楽かと思います。
# 2) .goreleaser.ymlの作成
プロジェクトディレクトリの直下に`goreleaser.yml`を作成します。作成には`goreleaser init`コマンドを利用します。
```
cd project-directory
goreleaser init
```goreleaserのインストールにDockerを利用した場合は、次の
Go言語で kintoneアプリのフィールド情報をCSV出力するコマンドラインツールを作った話し
Go言語の自習の仕上げに、[yaclik](https://github.com/sy250/yaclik) という小さなコマンドラインツールを作ったのでその紹介です。
kintoneアプリからレコードを取得・登録などを行う、Go言語で書かれたコマンドラインツールに、cli-kintoneがあります。
https://github.com/kintone/cli-kintone
今回試しに作ったのは、kintoneアプリの[フィールド情報](https://developer.cybozu.io/hc/ja/articles/204783170#anchor_getform_fields)をAPIで取得して、CSV形式でターミナルに表示するだけのツールです。
それ以上のことは何も出来ないのですが:sweat_smile:、kintoneアプリのフィールド一覧がドキュメントで必要になった時には使えるかと思います。出力できる情報は下記の3つだけです。
1. フィールドコード
2. フィールド名称
3. フィールドタイプ一応テーブル内のフィールドにも対応していますが、その際の
毎回go.modとmain.goを作るのがめんどくさい
#コマンドで生成すればよかった
###gogen.go
```
package mainimport (
"io/ioutil"
"log"
)func main() {
if err := ioutil.WriteFile("go.mod", []byte("module sample"), 0755); err != nil {
log.Fatal(err)
}
if err := ioutil.WriteFile("main.go", []byte("package main\r\n\r\nimport \"fmt\"\r\n\r\nfunc main() {\r\n fmt.Println(\"Hello World\")\r\n}\r\n"), 0755); err != nil {
log.Fatal(err)
}
}```
##実現方法
* 適当なディレクトリを作成する
* そこにgogen.goを作る
* 上記のコードをgogen.goにはっつける
* go install gogen.go##使い方
Go書き始めたい時に空
【Go】sqlxでBulk Insert
## 概要
以下のようなテーブルがあるとします。
```
user
- id
- name
```userテーブルに対して、以下のように複数のValueを一度にinsertをしたい。
```sql
INSERT INTO user (name)
VALUES ('tom'),('james'),('piyo'),('alex'),('josh');
```上記をsqlxで実現する方法
## 実装
NamedExecを使って、以下のように実装する
```go
import (
"database/sql"
"fmt"_ "github.com/lib/pq"
"github.com/jmoiron/sqlx"
)type User struct {
ID int32 `db:"id"`
Name string `db:"name"`
}func main() {
db, _ := sql.Open("postgres","user=postgres password=pw dbname=postgres sslmode=d
身に覚えのない"invalid character 'ã' looking for beginning of value"の原因
# TL;DR
`json.Unmarshal`で```
invalid character 'ã' looking for beginning of value
```というエラーが出た時は、JSON文字列に全角スペースが紛れている可能性大!!
```json:スペースが全角になっている
{"name": "Taro"}
```# 背景
APIサーバ実装中に上記のエラー発生。「`a`がなんで不正やねん」と思いがっつりハマったので備忘録として書きました。
(※実際にはチルダのついた`ã`です)## 環境
- Go 1.14
# サンプルコード
```go:main.go
package mainimport (
"encoding/json"
"fmt"
)type Person struct {
Name string `json:"name"`
}func main() {
// コロンの直後に全角が!
jsonStr := `{"name": "Taro"}`
person := Person{}
err := json.U