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

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

MacへGoをインストール・A Tour of Goをローカルで起動するまでにつまづいた所

ちょこちょこつまづいたので、どう解決したか順を追って書いておきます。

### HomebrewでGoをインストール

“`bash

$ brew install go
“`
### インストールされた場所を確認する
“`bash

? /usr/local/Cellar/go/1.15: 9,769 files, 494.3MB
“`
Homebrewだと/usr/local/Cellar/直下に入っていきます

### versionを確認する
“`bash

$ go version
go version go1.15 darwin/amd64
“`

### 適当なディリクトリにファイルを作成
“`bash

$ mkdir -p ~/go/src/practice
“`

### Hello woldしてみる
practiceディリクトリにhello.go を作成する
参考 [Golang公式:Test your installation](https://golang.org/doc/install#testing)

“`go:hello.go

元記事を表示

denoでインタプリタを作る

# はじめに
[Go言語でつくるインタプリタ](https://www.amazon.co.jp/Go%E8%A8%80%E8%AA%9E%E3%81%A7%E3%81%A4%E3%81%8F%E3%82%8B%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%97%E3%83%AA%E3%82%BF-Thorsten-Ball/dp/4873118220)という本を最近読みました。

この本はmonkeyと名付けられた独自言語が動くインタプリタをgoで作る本なのですが、理解を深めるためそのインタプリタをdenoで再実装をしました。
https://github.com/pokotyan/deno-monkey

そして、これをwebで実行できるようなプレイグランドにしました。
https://monkey-playground.netlify.app/
※herokuにデプロイしているのでサーバーが落ちてた場合、レスポンスが返ってくるのが遅いです
![スクリーンショット 2020-08-23 13.59.34.png](https://qiita-image-stor

元記事を表示

【Golang】goroutineのチャネル(channel)で意図せず無限ループした話

# 要約

– goroutineのfor-selectパターンでは、ゼロ値を受信して予期せず無限ループすることがある
– 受信チャネルからの第2返り値でゼロ値チェックをしよう

“`golang
for {
select{
case v, ok := <-ch: if ok { // 正常系処理 } else { // 異常系処理 } } } ``` # 発生状況 無限ループが発生したコードがこちら。 ```golang package main import ( "bufio" "context" "fmt" "io" "os" "strings" "time" ) func main() { if err := start(); err != nil { fmt.Fprintf(os.Stderr, "Error: %s\n", err) os.Exit(1) } } func start() error { bc := context.Background() timeou

元記事を表示

静的型付け言語と動的型付け言語の違いって?

Goを学習するにあたって、「静的型付け言語」と「動的型付け言語」の違いが、
なんとなく分かるような(説明はできない)レベルだったので、簡潔にまとめてみた。

## 静的型付け言語とは?

変数や、引数や返り値などの値の**型が**コンパイル時など、
その**プログラムの実行よりも前にあらかじめ決められている**、という言語

(例) Java, Go, C#, Scalaなど

“`java:hoge.java
public int add(int a, int b) {
int c;
c = a + b;
return c;
}
“`
※ 整数型`int`を設定している

### メリットは?

プログラム実行の前にコンパイルを行うので、

・**実行時の処理が速く**、**事前に型の整合エラーをチェックできる**

実行して初めてわかる問題をかなり減らすことできるため、大規模開発等に向いている。

## 動的型付け言語とは?
変数や、引数や返り値などの値の**型**を、**プログラムの実行時に決める**、という言語

(例) Python、Ru

元記事を表示

30時間制の時間表現を扱うパッケージを作った

## どうして?

テレビやラジオのタイムスケジュールを見ると、25:00のような表現を目にすることがありますよね。
ラジオ番組を日常的に聴取していると、”木曜1:00″という表現よりは、”水曜25:00″という表現の方がしっくりくるのですが、これを感覚的に使えるパッケージが見当たらなかったので、作ることにしました。
そもそも、この表現方法の名前が分からなかったので、ここでは仮に30時間制としています。(28時間制とか30時間制とか、いくつかありそうです)

![30時間制の説明.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271949/445c26d4-2f0f-2234-34a3-256f23758961.png)

## やったこと

timeパッケージを拡張してtimeextパッケージを作りました。
0:00:00-05:59:59間の時刻を30時間制に置き換えます。

用意した機能は`Parse`と`Forma

元記事を表示

AtCoder Beginner Contest 176のメモ

# 前置き

Atcoderをやってみたので、自分用のメモです。
あとから加筆・修正する予定です。

# 問題

https://atcoder.jp/contests/abc176

# A

“`Q_A.go
package main

import (
“fmt”
)

func main() {
var n, x, t int
fmt.Scanf(“%d %d %d”, &n, &x, &t)
var a = n / x
var b = n % x
var c int
if b == 0{
c = a * t
} else {
c = (a+1) *t
}
fmt.Printf(“%d\n”, c)
}
“`

# B
“`Q_B.go
package main

import (
“fmt”
“strconv”
)

func main() {
var n string
fmt.Scanf(“%s”, &n)

var a int
a = 0
var i int
for _, d := range n {

元記事を表示

【Go】ServeMux と DefaultServeMux の違いについて

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

ServeMux と DefaultServeMux の違いについて、具体的に把握したい。

ServeMux については不完全な内容ながら以下にメモした。
[Go の ServeMux について](https://qiita.com/twinemarron/items/1c847501e0af8b35a93c)

### DefaultServeMux とは
公式ドキュメントには以下のようにコメントしてある。
https://golang.org/src/net/http/server.go?h=defaultServeMux#L2240

> DefaultServeMux is the default ServeMux used by Serve.
DefaultServeMuxは、Serveが使用するデフォルトのServeMuxです。

“`golang
var DefaultServ

元記事を表示

AtCoder Beginner Contest 176 参戦記

# AtCoder Beginner Contest 176 参戦記

## [ABC176A – Takoyaki](https://atcoder.jp/contests/abc176/tasks/abc176_a)

2分で突破. 書くだけ.

“`python
N, X, T = map(int, input().split())

print((N + X – 1) // X * T)
“`

## [ABC176B – Multiple of 9](https://atcoder.jp/contests/abc176/tasks/abc176_b)

1分半で突破. 書くだけ.

“`python
N = input()

if sum(int(c) for c in N) % 9 == 0:
print(‘Yes’)
else:
print(‘No’)
“`

Python では以下でも良かったらしい. なんだかなあ.

“`python
N = int(input())

if N % 9 == 0:
print(‘Yes’)
else

元記事を表示

【Go】値レシーバとポインタレシーバの違いについて

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

構造体のメソッドを作成するにあたり、値レシーバとポインタレシーバの二つの方法があった。
この二つの違いがわかっていなかった為、まとめてみる。

[A Tour of Go](https://go-tour-jp.appspot.com/methods/4) に良いサンプルがあったので、こちらで確認。

ポインタレシーバから確認。

**ポインタレシーバ**

“`golang
package main
import (
“fmt”
“math”
)
type Vertex struct {
X, Y float64
}
func (v Vertex) Abs() float64 {
return math.Sqrt(v.X*v.X + v.Y*v.Y)
}
func (v *Vertex) Scale(f float64) {
v.X = v.X * f
v.Y = v.Y * f

元記事を表示

【Go】ポインタについて

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

今まで JavaScript のみをやっていたので、pointer という概念がなかなか入ってこないので一旦整理

## Pointer

一旦以下の挙動を確認

“`golang
package main

import “fmt”

func main() {
i := 1 // i という変数を定義し、1を代入
fmt.Println(i) // 1
p1 := &i // p1 という変数を定義し、& 演算子を使用して i のポインタを格納
fmt.Println(&i) // 0xc0000b6001
fmt.Println(p1) // 0xc0000b6001
fmt.Println(&p1) // 0xc0000b6003
fmt.Println(*p1) // 1
*p1 = 2 // p1 を * 演算子を使用したものに、 2 を格納
fmt.Printl

元記事を表示

【Kubernetes】手軽にPodの状態を監視してTeamsに通知したい

# 背景
Kubernetesを用いる場合にはPodは割とカジュアルに再作成されるため、Podの死活を監視したくなる場合がある。
特に開発の途上や小さいチームにおいては、きっちりとした監視を運用していくハードルの観点や、技術習得観点を考慮し、簡素な監視が必要になるタイミングがある。
そうした場合に、Prometheusなどのデファクトな監視基盤ではなく、一時的なつなぎとして使用できる簡易的な監視ツールが欲しくなった。
それと、純粋にGoでプログラムを書いたことがなかったため、簡素なツールを作る目的でPodの監視ツールを作成した。

# [PodMonitoringTool](https://github.com/iaoiui/PodMonitoring

元記事を表示

【Go】web サーバーの作成方法が様々あるのでまとめる

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

go を学習していて、Web サーバーの作成方法がいくつもあったので、自分の整理用にまとめる。

### パターンその1

handler というハンドラ関数を定義

– http.HandleFunc を使用
– index という handler 関数を別で定義し、http.HandleFunc の第二引数に関数を渡す
– 最後に http.ListenAndServe 実行

“`golang
package main

import (
“fmt”
“net/http”
)

func index(writer http.ResponseWriter, request *http.Request) {
// 省略
}

func main() {
http.HandleFunc(“/”, index)
if err := http.ListenAndServe(“:8080

元記事を表示

【Go】http.ListenAndServe と server.ListenAndServe の違いについて

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

### http.ListenAndServe と server.ListenAndServe の違い

http.ListenAndServe 使用例

“`golang
func main() {
http.Handle(“/”, &templateHandler{filename: “index.html”})

if err := http.ListenAndServe(“:8080”, nil); err != nil {
log.Fatal(“ListenAndServe:”, err)
}
}
“`

server.ListenAndServe() 使用例

“`golang
func main() {
mux := http.NewServeMux()
mux.HandleFunc(“/”, index)
se

元記事を表示

「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

元記事を表示

【Go】 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 HT

元記事を表示

【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。
* みんなに使ってもらいたいので説明頑張りました!長文です。ご容赦ください。

# できるようになること
* 動的SQLの仕組みを簡単に導入できます。
* 複数レコードを一括処理するバルククエリ(MultiRow-INSERTなどのMultiRowクエリ)のSQLを動的に簡単に作れます。
* MultiRowクエリの書き方や特徴について知りたい方は [**こちら**](https://qiita.com/bubu_suke/items/a6a36c9dd02ccc56d40c) も合わせてご覧ください。

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

“`2020.08.21.go
package main

import “github.com/bubusuke/sqlpatchwork”

fu