- 1. gin.Contextを引数にもつ関数をunitテストする
- 2. Goの環境構築
- 3. GoLandでGoデバッグ起動時に遭遇したエラー
- 4. GoでEchoの導入
- 5. AWS Chatbot + Lambda(Go)でSlackからRDSを操作する
- 6. Azure SDKsのGo Guidelines(現在ドラフト版)を日本語訳
- 7. Go 言語スプレッドシートライブラリ:Excelize 2.3.0 がリリースされました
- 8. [Go]自作モジュールを認識してくれない
- 9. PostgresQLのDate型、Time型をGoのTime型にパースする
- 10. AtCoder Beginner Contest 175 バーチャル参戦記
- 11. Goは本当に1980年代の言語みたいなのか。
- 12. main.goを複数ファイルに分ける
- 13. Go1.15改訂版、Go言語アプリのDockerイメージをscratchから作る
- 14. [Go言語]構造体の型入力で処理を分ける
- 15. GoでOSの環境変数を利用する
- 16. 【GORM】公式ドキュメントのメモ・その2「CRUDについて(Query)」
- 17. 【GORM】公式ドキュメントのメモ・その1「モデル、CRUDについて」
- 18. ある型があるinterfaceを実装しているかを保証する
- 19. R50 のリープフロッグ ~ Golang はお前と戯れるアイツを OS とは認めていない
- 20. [Go]文字コードのUTF-8変換を行う – autodetect
gin.Contextを引数にもつ関数をunitテストする
# はじめに
ginのmiddlewareのunitテストをしようと思ったときにちょっとハマったので備忘録としてまとめておきます# テスト内容
まずはソースツリーから“`
├── main.go
└── middleware
├── auth.go
└── auth_test.go
“`シンプルにGinのクイックスタートにmiddleware.Authorizationを噛ましてるだけです
“`go:main.go
package mainimport (
“testing_gin_context/middleware”“github.com/gin-gonic/gin”
)func setupRouter() *gin.Engine {
r := gin.Default()// 認証用のmiddlewareを使用
r.Use(middleware.Authorization)r.GET(“/ping”, func(c *gin.Context) {
c.String(200, “pong”)
})
re
Goの環境構築
ターミナルでの操作手順
1 homebrewをインストールする。
2 “`brew install go“`
3 “`go version “` インストールバージョンの確認
4 echo $GOPATH でパスが通っている先を確認
5 出てこない場合パスを編集
vim source ~/.zshrc
export GOPATH=$HOME/.go を追加
6 source ~/.zshrc パスファイルを更新
echo $GOPATH 出てくることを確認
GoLandでGoデバッグ起動時に遭遇したエラー
## 出たエラー
“`
invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
“`## Xcodeを更新する
“`
xcode-select –install
sudo xcode-select –switch /Applications/Xcode.app/
“`—-
実行できた。
GoでEchoの導入
Echo の詳細
—
[Echoの公式ドキュメント](https://github.com/labstack/echo)インストール
—
“`
go get github.com/labstack/echo/{version}
“`実際に動かす
—“`main.go
package mainimport (
“net/http”
“github.com/labstack/echo”
“github.com/labstack/echo/middleware”
)func main() {
// Echoインスタンス作成
e := echo.New()// ミドルウェア
e.Use(middleware.Logger())
e.Use(middleware.Recover())// ルーティング
e.GET(“/hello”, hello)// サーバー起動
e.Logger.Fatal(e.Start(“:1323”))
}// handler
func hello(c echo.Con
AWS Chatbot + Lambda(Go)でSlackからRDSを操作する
## はじめに
RDSを常時起動させておく必要がないシステムがあります。そのシステムを使う時だけRDSを起動させたいのですが、使用する人はIAMユーザを持っていないため、コンソールから起動、停止できない、ということがありました!そこで、SlackからRDSの操作をできるようにしました!
Chatbotを紐づけたSlackのチャンネルからコマンドを実行し、Lambda関数を呼び出すことで、RDSの操作をします。
## やりたいこと
Slackからやりたいことは以下の3つです。+ RDSの起動
+ RDSの停止
+ RDSのステータスの確認## 方法検討
調べてみると、Slackから実行する方法が2つ見つかりました。+ API Gatewayを使う方法(Slash Commandsの作成)
+ AWS Chatbotを使う方法今回は、2020年4月にGAになった、使ってみたかった、Slackとの組み合わせが素晴らしいらしいという観点から**AWS Chatbot**を使ってみることにしました!
## AWS Chatbotってなに?
[公式サイト](https://
Azure SDKsのGo Guidelines(現在ドラフト版)を日本語訳
Azure SDKに関するサイトとして「[Azure SDKs](https://azure.github.io/azure-sdk/)」があります。
画面右上の「ハンバーガーメニュー」から「Guidelines」-「Go (Draft)」を選択するとGoのページである「[Go Guidelines](https://azure.github.io/azure-sdk/golang_introduction.html)」にアクセスできます。ちなみに「Go Guidelines」は現在ドラフト版です。
また、本サイトのドキュメントはGitHubに「[Azure/azure-sdk](https://github.com/azure/azure-sdk)」として存在しており「Go Guidelines」のドキュメントである「[Azure/azure-sdk/docs/golang](https://github.com/Azure/azure-sdk/tree/master/docs/golang)」を今回もGoogle翻訳ベースで日本語訳しました。
– [qt-luigi/azur
Go 言語スプレッドシートライブラリ:Excelize 2.3.0 がリリースされました
[Excelize](https://github.com/xuri/excelize) は、ECMA-376 Office OpenXML 標準に基づいて Office Excel ドキュメントを操作するための Go 言語で書かれたクラスライブラリです。 XLSX ファイルの読み書きに使用できます。Excelize は、他のオープンソースライブラリと比較して、イメージ(テーブル)付きのドキュメントの作成、Excel へのイメージの挿入、および保存後のチャートスタイルの保存をサポートしており、さまざまなレポートシステムに適用できます。
場合によっては、既存の Excel ドキュメントコンテンツの読み込み、新しい Excel ドキュメントの作成、既存のドキュメント(テンプレート)に基づく新しい Excel
[Go]自作モジュールを認識してくれない
自作のモジュールをVSCodeが認識してくれなかったのでメモ。
##目的
自作モジュールをVSCodeで認識させる。##問題点
自作のモジュールをVSCodeが認識してくれないし、importのところに追加しても保存時に消えてしまってた。##結論
exportしたい自作モジュールのメソッド名の最初は大文字で始めること##補足
こんなことで数時間溶かしてしまった。。。
PostgresQLのDate型、Time型をGoのTime型にパースする
少しハマったのでメモ
## 目的
PostgresQLに保存されているDate型とTime型のレコードをGoのTime型として扱うのに、値をパースしたい。## 問題点
普通にPostgresQLのTime型の’10:00’というデータをロードすると、
`0000-01-01T10:00:00Z`
という文字列になってしまうので、これをGoのtimeパッケージのTime型として認識させたい。## 結論
`createdAt, _ := time.Parse(time.RFC3339, value.CreatedAt)`
これで`createdAt`という変数にtime.Time型の値が入ったので、あとは好きなようにフォーマットを選ぶだけ(valueにはPostgresQLからロードしたデータが入っている)。
今回は時間だけ欲しかったので、`createdAt.Format(“15:04”)`とすればHH:mmのフォーマットの値が取得できる(今回のデータでは10:00)。※time.Time型のフォーマットの方法は他の記事を参考のこと
## 補足
日付の形式には色々あって、P
AtCoder Beginner Contest 175 バーチャル参戦記
# AtCoder Beginner Contest 175 バーチャル参戦記
山に行ってて、時間までに帰ってこれなかったのでバーチャル参戦になった. AtCoder 始めてから、ABC に出れないのは初めて? 結果はABCD完(TLE1)で75:49でした. パフォ1465相当. 出ればレーティングアップだったか、ぐっすん
## [ABC175A – Rainy Season](https://atcoder.jp/contests/abc175/tasks/abc175_a)
2分で突破. 書くだけ.
“`python
S = input()t = 0
result = 0
for c in S:
if c == ‘R’:
t += 1
else:
t = 0
result = max(result, t)
print(result)
“`## [ABC175B – Making Triangle](https://atcoder.jp/contests/abc175/tasks/abc175_b)
7分
Goは本当に1980年代の言語みたいなのか。
# はじめに
2020年8月15日現在、[golang.org](https://golang.org/)のトップページに、[The Why of Go](https://www.youtube.com/watch?v=bmZNaUcwBt4)という動画が、Featured Videoとして紹介されています。Goに初めて触れて、ちょうどなぜこうなっている?と思う機会が多かったので、自分なりにまとめてみようと思います。
注: 要約というよりは、気になる部分をピックアップして解釈して文字にしているものなので、総合的な内容は動画を見てください。# Goとは1980年代の言語なのか
Goとは1980年代の言語のようだと批判される。糖衣構文、多態、Genericsが使えない、依存性管理が粗末等と批判する人にとってGoは、1980年代以降のプログラミング言語の進化の歴史を無視しているように見えるようだ。だけど、それらの要素があったら21世紀のプログラミング言語といえるということなのだろうか?
このプレゼンテーションでは、そういう疑問をきっかけにGoのなぜ(The Why of Go)を
main.goを複数ファイルに分ける
## コード
“`main.go
package mainfunc main() {
test()
}
“`“`test.go
package mainimport “fmt”
func test() {
fmt.Printf(“%s”,”Hello”)
}
“`## 実行
– `main.go`を指定するとエラーというか、test関数を読み込めないでいる“`
yuta:~/func $ go run main.go
# command-line-arguments
./main.go:4:2: undefined: test
“`## 正しい実行
– `*` で実行しよう!“`
yuta:~/func $ go run *.go
Hello
“`# 参考
https://qiita.com/taqm/items/8eed4371bab199b01b65
Go1.15改訂版、Go言語アプリのDockerイメージをscratchから作る
こんばんは、ねじねじおです。
Go言語アプリの Docker イメージを scratch からつくるとき、builder ステージから `/usr/share/zoneinfo` ディレクトリをコピーしていますか?
それとも、 `/usr/local/go/lib/time/zoneinfo.zip` ファイルをコピーしていますか?
あなたはどちら派ですか?もう、そんなことで争う必要はないのです。Go 1.15 がリリースされたから。
## Go 1.14 まで
Go 1.14 までは、タイムゾーンを解決するためにbuilderステージからタイムゾーンデータベースをコピーする必要がありました。
下記の最後の行です。“`Dockerfile:Dockerfile
FROM golang:1.14.7 AS builder
WORKDIR /go/src/app
COPY ./ ./
RUN go mod download
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o ./server ./server.go
[Go言語]構造体の型入力で処理を分ける
# はじめに
go言語でintefaceを使えば、C言語などのポインタ渡しに似た処理を行うことができます。
そのやり方について、覚書の意味で記載します。
# ソースコード
本資料では、入力した構造体の型別で別の処理を行うように関数を作ってプログラムをします。
また、行列にした構造体で複数にわたって異なる構造体が入っていた時の処理別方法についても関数で作ってみます。“`golang:maing.go
package mainimport (
“fmt”
“reflect”
)type User struct {
Name string
Age string
Sex string
}
type User2 struct {
Name string
Age string
Sex string
}
type TextBord struct {
Name string
Text string
}
//個別処理
func Output(v interface{}) {
switch reflect.TypeOf(v) {
case reflect.Ty
GoでOSの環境変数を利用する
– `os.Getenv(“INSTANCE_ID”)`のように書く
“`golang
import “os”
func getInstanceID() string{
var instanceId = os.Getenv(“INSTANCE_ID”)
return instanceId
}
“`
【GORM】公式ドキュメントのメモ・その2「CRUDについて(Query)」
# はじめに
[GORM公式ドキュメント](http://gorm.io/ja_JP/docs/index.html)を読んだ際、頭に残すために書き写したものです。
ほとんど公式通りですが、パッと見で理解しづらかった言い回しなどを書き直しています。
この記事では[【GORM】公式ドキュメントのメモ・その1「モデル、CRUDについて」](https://qiita.com/schwertwal97/items/ae1cb42e174b652d546a)に書ききれなかったCRUDのQuery部分についてのメモを載せています。# Query
“`go
// 主キーでソートし、最初のレコードを取得する
db.First(&user)
//// SELECT * FROM users ORDER BY id LIMIT 1;// ソートせずにレコードを1行取得する
db.Take(&user)
//// SELECT * FROM users LIMIT 1;// 主キーでソートし、最後のレコードを取得する
db.Last(&user)
//// SELECT * FROM use
【GORM】公式ドキュメントのメモ・その1「モデル、CRUDについて」
# はじめに
[GORM公式ドキュメント](http://gorm.io/ja_JP/docs/index.html)を読んだ際、頭に残すために書き写したものです。
ほとんど公式通りですが、パッと見で理解しづらかった言い回しなどを書き直しています。# インストール
“`sh
go get -u github.com/jinzhu/gorm
“`# モデル
## モデルの例
“`go
type User struct {
gorm.Model
Name string
Age sql.NullInt64
Birthday *time.Time
Email string `gorm:”type:varchar(100);unique_index”`
Role string `gorm:”size:255″` // フィールドサイズを255にセットします
MemberNumber *string `gorm:”unique;not null”` // MemberNumberを
ある型があるinterfaceを実装しているかを保証する
## 目的
ある型がinterfaceを実装しているかを保証したい。
## 環境
Go: go1.14 darwin/amd64
## サンプルコード
“`go
package main// 適当なinterfaceを定義する。
type Somether interface {
Method() bool
}// 適当な type alias を定義する。Sometherを満足することを期待する。
type MyType string// メソッドリストにないメソッドを定義する。つまりインターフェースを満足していない。
func (m *MyType) Method2() bool {
return true
}// Somether型の変数を定義する。変数は利用しないので _ で無視する。
// インターフェース値の型にMyType型のポインタ、値はnilをアサインする。
var _ Somether = (*MyType)(nil)func main() {}
// 実行結果
// cannot use (*MyType)(ni
R50 のリープフロッグ ~ Golang はお前と戯れるアイツを OS とは認めていない
# 対象読者
この投稿は、以前書いた「[R50 のリープフロッグ ~ 西暦2020年の今、偏差値50のプログラマを目指すお前が学ぶべきこと](https://qiita.com/y-bash/items/09575a8e3d85656015bc)」という 20 年前の自分に宛てて書いた手紙の追伸にあたるものです。
本稿では Golang がサポートするプラットフォームについて軽く触れていますが、内容が薄いのと、とても個人的なものなので、多くの方にとってはまったく有益な情報ではないでしょう。
# 後日譚
どうだ? その後も元気にしてるか?
お前はそろそろ結婚する時期だし、忙しくてあまり時間もないとは思うが、まあ今回はとても短い文章だから最後まで読んでくれたら嬉しい。
そうか、そもそも前回の手紙が 20 万字もあったから、そっちがまだ読み終わってないかもしれないな(笑)
だけどな、信じられないことに、文庫本 2 冊分にも及ぶあの分量で、しかも酷く拙いあの殴り書きを本当にたくさんの人が読んでくれ、しかもたくさんの人が反応してくれたんだ。とても嬉しかったよ。
そして、その後 Q
[Go]文字コードのUTF-8変換を行う – autodetect
文字コードが分からない際にautodetectする場合、自前でゴリゴリ書いていたのですが
ICU実装をgoで書いた[saintfish/chardet](https://github.com/saintfish/chardet)という便利libraryがありました。# 実装
“`Go
package mainimport (
“errors”
“fmt”
“github.com/saintfish/chardet”
“golang.org/x/net/html/charset”
“golang.org/x/text/transform”
)// Converts to UTF-8.
// Charset automatically detected.
func DecodeAutoDetect(src []byte) (string, error) {
d := chardet.NewHtmlDetector()
r, err := d.DetectBest(src)
if err != nil {
return string(src), err