- 1. 使うもの
- 1.1. コード
- 1.1.1. ポインタとは何か、初心者目線で解説してみた
- 1.1.2. Go 再入門 – VSCode で環境構築
- 1.1.3. AWS API Gateway がリクエストヘッダーを小文字にしてしまう時の解決策 (golang)
- 1.1.4. MacへGoをインストール・A Tour of Goをローカルで起動するまでにつまづいた所
- 1.1.5. deno(typescript)でインタプリタを作る
- 1.1.6. 【Golang】goroutineのチャネル(channel)で意図せず無限ループした話
- 1.1.7. 静的型付け言語と動的型付け言語の違いって?
- 1.1.8. 30時間制の時間表現を扱うパッケージを作った
- 1.1.9. AtCoder Beginner Contest 176のメモ
- 1.1.10. 【Go】ServeMux と DefaultServeMux の違いについて
- 1.1.11. AtCoder Beginner Contest 176 参戦記
- 1.1.12. 【Go】値レシーバとポインタレシーバの違いについて
- 1.1.13. 【Go】ポインタについて
- 1.1.14. 【Kubernetes】手軽にPodの状態を監視してTeamsに通知したい
- 1.1.15. 【Go】web サーバーの作成方法が様々あるのでまとめる
- 1.1.16. 【Go】http.ListenAndServe と server.ListenAndServe の違いについて
- 1.1. コード
Golang – Convert uint64 to a String
“`golang
// Ref: https://golangcode.com/uint64-to-string/package main
import (
“fmt”
“strconv”
)func main() {
// Create our number
var myNumber uint64
myNumber = 18446744073709551615// Format to a string by passing the number and it’s base.
str := strconv.FormatUint(myNumber, 10)// Print as string
// Will output: ‘The number is: 18446744073709551615’
fmt.Println(“The number is: ” + str)
}
“`https://golangcode.com/uint64-to-string/
GoでFireBase Dynamic Linksの作成
# GoでFireBaseDynamicLinksの作成
今回はFirebaseDynamicLinksを初めて触ったため、備忘録として記事を投稿します。
基本的には[公式サイト](https://firebase.google.com/docs/reference/dynamic-links/link-shortener)を確認すれば実装できそう。## FirebaseDynamicLinksとは
FirebaseDynamicLinksとは、Twitter等のシェアメッセージをタップした際に、
アプリをインストールしているユーザは直接アプリを開き、
アプリをインストールしていないユーザはWeb等を開くためのリンクを生成する機能。
詳細は[公式サイト](https://firebase.google.com/docs/reference/dynamic-links/link-shortener)をご確認してください。## 今回使用したパラメータ
今回は以下のパラメータを使用|パラメータ|詳細|
|—|—|
|domainURIPrefix|Firebaseコン
色々な言語でファイルIOを競って速度比較
複数のプログラミング言語で約 1GB の CSV ファイルを Read/Write して時間を測定してみました!
# 共通ルール
– どの言語でも同じファイルを使用して確認すること
– ファイルは一行ずつ読み散り、一行ずつ書き込むこと
– OSの差を無くすため、Docker Image は全て base(Ubuntu 18.04 LTS)を使用すること# まずは結果
|言語|5回実行した平均タイム(秒)|
|:–|:–|
|C-lang|6.2962|
|C++|6.0538|
|C#|17.1798|
|Golang|10.3966|
|Java|21.0840|
|Python|32.6949|
|Ruby|30.7153|
|Scala|21.8364|やっぱりC/C++がダントツで早い!!
次点でGo言語# 実装サンプル
5年ぶりくらいにC++書いたので綺麗ではないと思いますが、一番早かったのでサンプルとして載せます。
他の言語でも以下の動作をベースとして実装しました。
– 5回実行した平均時間を計算
– 1行読んで1行書き込む“`c
#inc
[Go] 並列処理と非同期処理
Goで並列処理。非同期処理を組み合わせた場合どう書く
使うもの
sync package (https://golang.org/pkg/sync/)
※ 非同期処理go routine
※ 並列処理コード
“`lang:go
package mainimport (
“fmt”
“sync”
“time”
)const (
MAX_EXECUTION_COUNT = 10 // 実行回数
CONCURRENT_COUNT = 5 // 同時実行数
)func main() {
fmt.Printf(“Start : %s \n”, time.Now())
res := make(chan string, MAX_EXECUTION_COUNT)
concurrent := make(chan string, CONCURRENT_COUNT)
defer close(res)
defer close(c
ポインタとは何か、初心者目線で解説してみた
業務でGO言語を扱うことになり、必死に勉強していたのですが、
ポインタが最初はなかなか理解できずに苦労しました。Rubyとか書いている時はポインタ概念を知らなくともそれなりに書けてしまいますが、GOはルールが厳密でそうもいきません。
今回はそんなポインタとはなんぞやという方に向けて解説していきたいと思います。
抑えておくべき用語
・メモリ
・アドレス
・値渡し
・参照渡し一応、さらっと用語について解説します。
#メモリとアドレス
メモリはデータを一時的に保存する場所ですね。
メモリに変数が格納され、変数に値が格納されています。
つまり、 メモリ<変数<値(文字列とか数値)という構造になります。メモリは広大な野原だと思ってください。
その野原に変数という名の箱がたくさん置かれています。
多すぎて、どれが何の箱なのかわかりません。
なので、箱ごとに住所をつけて管理をします。その住所がアドレスです。
“`main.go
a := “asfd”
fmt.Prin
Go 再入門 – VSCode で環境構築
## 概要
半年ほど前から Go 言語の勉強を始めたのだが、何かと忙しく放置気味になってしまった。余裕ができたので久しぶりに VSCode を開いたものの、PC 交換時に環境移行を怠ってしまい、再び環境構築から Hello, world までやり直したのでその備忘録。今回は Mac での作業だが、Windows でもパスなどを随時読み替えれば OK。
## 前提条件
– macOS High Sierra 10.13.6
– bash 3.2.57(1)-release
– Homebrew 2.4.13
– VSCode 1.48.1## インストール
Homebrew 経由でインストール。
“`bash
brew install go
“`バージョンは記事の執筆時点で `1.15`。
“`bash
go version
go version go1.15 darwin/amd64
“`一応 Windows でもパッケージマネージャの Scoop 経由でインストールが可能。
## PATH 関連
### GOPATH
ソースコードや実行ファイル、
AWS API Gateway がリクエストヘッダーを小文字にしてしまう時の解決策 (golang)
ここ最近業務で API Gateway + Lambda を使った開発を行っており、API Gateway の振る舞いで注意しなければならない点を見つけたので、解決方法も添えて記事にしたいと思います。開発言語は Go言語です
## AWS API Gateway がリクエストヘッダーを小文字にしてしまう
– 今回使用するサンプルプログラムです
“`go
package mainimport (
“errors”
“fmt”
“log”“github.com/aws/aws-lambda-go/events”
“github.com/aws/aws-lambda-go/lambda”
“github.com/aws/aws-lambda-go/lambdacontext”
)type (
request = events.APIGatewayProxyRequest
response = events.APIGatewayProxyResponse
)// handler handles AWS Lambda execution.
func h
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(typescript)でインタプリタを作る
# はじめに
[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 mainimport (
“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 mainimport (
“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 mainimport “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 mainimport (
“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