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

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

「Goプログラミング実践入門」サンプル実行エラー解消方法

Go初学者です。
[「Goプログラミング実践入門」](https://www.amazon.co.jp/Go%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80-%E6%A8%99%E6%BA%96%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%A7%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89Web%E3%82%A2%E3%83%97%E3%83%AA%E3%82%92%E4%BD%9C%E3%82%8B-impress-top-gear/dp/4295000965)に載っているサンプルプログラムを実行しようとした時に発生したエラーと、その解決方法です。

# 環境
– macOS Catalina 10.15.6
– Go 1.15

# 事象

“`
$ go install first_webapp
package first_webapp is no

元記事を表示

[golang] http パッケージの Handle, Handler, HandleFunc, HanderFunc についての覚書

今まで JavaScript を書いていたが、Go 言語の学習を始めた。
golang の標準パッケージの、http パッケージの以下

– Handle
– Handler
– HandleFunc
– HanderFunc

の区別が全然ついていないので、自分の言葉でまとめようと思う。
理解しないまま書いていて、いつまで経っても覚えられないので、ちゃんと理解したい。

## http パッケージ

まず go doc の http パッケージについての説明を確認
https://godoc.org/net/http

>Package http provides HTTP client and server implementations.
http パッケージは、 HTTP クライアントとサーバーの実装を提供する。
Get, Head, Post, and PostForm make HTTP (or HTTPS) requests
Get、Head、Post、および PostForm は、 HTTP (or HTTPS )リクエストを作成する

なるほど。

### func

元記事を表示

Go の ServeMux について

golang を勉強し始めてたが、ServeMux がいまいちわからないのでまとめる

※注意: これはあくまで個人的に整理しただけの記事で、内容としては不完全なものになります。読んでも参考にならない可能性が高いです。

## ServeMux とは
公式ドキュメントには以下のように書いてある
https://golang.org/pkg/net/http/#ServeMux

> ServeMux is an HTTP request multiplexer. It matches the URL of each incoming request against a list of registered patterns and calls the handler for the pattern that most closely matches the URL.
ServeMuxはHTTPリクエストマルチプレクサーです。各着信リクエストのURLを登録済みパターンのリストと照合し、URLに最も近いパターンのハンドラーを呼び出します。

元記事を表示

ECS上のコンテナアプリをCircleCIでCI/CDする

# この記事について
イケてる開発をするためにはCI/CDは欠かせません。
特にAWSを使って本番環境を作っている場合、デプロイ操作をいちいちWebコンソールでぽちぽちしながら行うのは結構面倒です。

そのため今回は、ECSを使ったコンテナアプリを、CircleCIを使ってCI/CDパイプラインにのせるための手順、主にCircleCIの設定周りについて詳しく解説します。

## 使用する環境・バージョン
macOS Mojave 10.14.5

## 前提条件
GitHub, CircleCI, AWSのアカウントは取得済みの状態から始めます。

## 読者に要求する前提知識
– ECSへの手動デプロイが問題なくできること、およびECS用語(タスク・サービス等)の理解
– gitの基本的な操作(add, commit, push, リモートリポジトリとの連携)
– CircleCIでのプロジェクト作成(GitHubリポジトリとの連携)ができる
– IAMユーザーの作成ができる

# 構築するCI/CDパイプライン
![スクリーンショット 2020-08-19 23.56.23.png

元記事を表示

【Go】ターミナルでホロライブの推しの配信予定を確認する

# はじめに
Go言語でホロライブの推しの配信中の枠 or 配信予定の枠をターミナル上で確認できるツールを作りました.
こんな感じに名前とstatusを指定することで検索結果を表示します.
![スクリーンショット 2020-08-20 12.44.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242603/7bbad874-6280-3e73-b198-986e35593447.png)
この記事では核となるYoubue DATA APIに関する説明をメインにします.
コードの全てを説明はしないので, 興味がある方は[githubのリポジトリ](https://github.com/shinya-ml/holo_check_CLI)をご覧になってください.

# Youtube DATA API
今回の核となるサービスです. Youtubeといろんな情報をやりとりするためのAPIで, [ここ](https://developers.google.com/youtube/v3/getting

元記事を表示

Go 1.15 testing パッケージの TestMain は os.Exit を呼ばなくてよくなった

# TL;DR

– Go1.15 がリリースされました
– testing パッケージの実装の変更にて TestMain で os.Exit を呼ばなくてよくなりました
– testing.M の実装変更及び、 go test で生成される main 関数のテンプレート修正によって実現されている

# Go 1.15

2020年8月11日、 The Go Blog より、 Go 1.15 のリリースが公表されました。

https://blog.golang.org/go1.15

Release Note を読むと、さまざまな機能が追加されています。 

https://golang.org/doc/go1.15

これを読んでいて、ふと Minor changes to the library から testing パッケージにいくつか変更があって、バージョンアップしたらちょっっっとテストの書き方が変わるなって思ったので深堀り確認してみました。


※ はてなブログで同じものを見たぞと思ったとしたら、それは同一の記事です。 https://khigashigash

Golangで動的SQLを作成するライブラリ(sqlpatchwork)を作ってGitに公開してみた

# [**bubusuke/sqlpatchwork**](https://github.com/bubusuke/sqlpatchwork)についてご紹介します!
* Golang勉強中です!
* 初めてのOSS。しかもAuthor。
* みんなに使ってもらいたいので説明頑張りました!長文です。ご容赦ください。

# Update!!
SQLファイルなしでも使えるようになりました!(2020.08.21)

“`2020.08.21.go
package main

import “github.com/bubusuke/sqlpatchwork”

func simpleSample() {
qps := map[string]string{
“prefix”: “INSERT INTO hoge_table (col1, col2) VALUES”,
“loopVal”: “(:col1_@@,:col2_@@)”,
“loopDelim”: “,”,
}

spw := sqlpatchwork.NewSimplePWSkipPrs(“SkipFi

gin.Contextを引数にもつ関数をunitテストする

# はじめに
ginのmiddlewareのunitテストをしようと思ったときにちょっとハマったので備忘録としてまとめておきます

# テスト内容
まずはソースツリーから

“`
├── main.go
└── middleware
├── auth.go
└── auth_test.go
“`

シンプルにGinのクイックスタートにmiddleware.Authorizationを噛ましてるだけです

“`go:main.go
package main

import (
“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 main

import (
“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 がリリースされました

github.com/360EntSecGroup-Skylar/excelize

[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 main

func main() {
test()
}
“`

“`test.go
package main

import “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