- 1. Googleマップで宝探し!たんけんぼくのかそうまちゲーム
- 2. Goの環境変数を扱う(viper)
- 3. AtCoder Chokudai Contest 005 参戦記
- 4. 【Go】基本文法② ステートメント
- 5. gRPCで使う.protoファイルの書き方まとめ
- 6. 【Golang】Go言語基礎 Goroutineとは?
- 7. Golang + Gin + Dockerのホットリロード、VSCodeデバッグ環境の構築
- 8. 【Go】基本文法① 定義
- 9. TinyGoの開発環境をVSCode向けにセットアップする
- 10. golang pointer
- 11. GO/Gin gin-swagger使用してAPI仕様書を生成します
- 12. 【Golang】Go言語の基礎 値レシーバーとポインタレシーバーについて
- 13. ACL Beginner Contest のメモ
- 14. ACL Beginner Contest 参戦記
- 15. cgoのg++用インクルードパス
- 16. golangでPre-Signed URL(署名付きURL)を生成する
- 17. Golangの環境構築
- 18. [Golang]`errors.Is()` `errors.As()` 完全ガイド〜使い方と違いをしっかり調査しました〜
- 19. Go: panicキャッチ後にStackTraceを表示する
- 20. Golangの言語仕様を全部読んでまとめる
Googleマップで宝探し!たんけんぼくのかそうまちゲーム
前々から温めてたのに実装方法が思いつかなかったんだけど、ようやくプロト出来た!
# まえせつ
**自分の住んでいる町を迷路とかゲームのマップ**として簡単に使えたら、遊び方が広がらないかなって思ってて*OpenStreetMap→Blender*変換とかやってたけどうまくいかなくって。
で、とある日、ぼーっとGoogleマップ見てたら
“`
https://www.google.co.jp/maps/@35.6608375,139.7008749,3a,75y,43.91h,92.5t/data=!3m6!1e1!3m4!1sDrFpHa0VreQbapnpTC-QgA!2e0!7i16384!8i8192
“`あれ・・?この**URLの”@”の後って緯度経度**・・・?
### !!!!!!!!
こっからの実装へのブレークスルーは実に早かった。
# つくってみたわ
### 宝探しを通じて現実の町探検を仮想で楽しむゲームです。
![goToMap4.gif](https://qiita-image-store.s3.ap-northeast-1.amaz
Goの環境変数を扱う(viper)
# はじめに
golangで環境設定ファイルを簡単にするライブラリとしてviperというものがあります。
今回はそのviperの使い方を簡単に紹介します# viper
シンプルにviperを使ってみる
今回は構造体にマッピングしてそれを引き回して使うように実装を行います“` :ソースツリー
.
├── config
│ ├── config.yaml
│ └── definition.go
└── main.go
“`“`yaml:config.yaml
# 環境変数設定用のyamlファイル
user:
name: “kosuke”
“`
本来はデータベースのユーザー名等を入れることが多いですが、今回は簡単に上記のような環境変数を設定します。“`go:definition.go
package configimport (
“fmt”“github.com/spf13/viper”
)// マッピング用の構造体
type Config struct {
User User `yaml:user`
}type User
AtCoder Chokudai Contest 005 参戦記
# AtCoder Chokudai Contest 005 参戦記
参加しなくていいかなあと思いつつ、結局参加してしまうやつ.
結果は49,656,737点で、AC 528人中240位でした. 最終コードは以下で Go 言語で提出しました.
“`go
package mainimport (
“bufio”
“fmt”
“math”
“os”
“strconv”
)func min(x, y int) int {
if x < y { return x } return y } func fill(d [][]byte, i, j int, x, y byte) { q := [][2]int{{i, j}} for len(q) != 0 { m, n := q[0][0], q[0][1] q = q[1:] d[m][n] = x if m > 0 {
if d[m-1][n] == y {
q = append(q, [2]int{m – 1, n})
}
}
if m < N-1 {
【Go】基本文法② ステートメント
udemy講座の「ステートメント」編を見終わったので、まとめとふりかえり。
今回も基本的な動作をコンソール上に出力しながら学習しました。
##前提
・udemyで[現役シリコンバレーエンジニアが教えるGo入門 + 応用でビットコインのシストレFintechアプリの開発)](https://www.udemy.com/course/go-fintech/)を視聴してGoを学習中
※「ブログ等で数行のコードの紹介は可能」とのことなので、講義で扱ったコードを引用しています。・開発環境はVSCode + プラグイン(Goのバージョンは1.15)
OSはWindows
・普段はJavaを使用しています。##if文・switch文
・書き方はjavaと似ている。
・if文で条件文に括弧をつけるとエラーになる。
(癖で括弧を記述しても、VSCodeが自動で括弧を取り除いてくれます。)##for文
・for文もjavaと同じ書き方でOK。
・”range”を使用するとより簡単に記述できる。
・”range”はmapでも使用可能。講座で出題された演習問題の自分の回答と解答例を比べ
gRPCで使う.protoファイルの書き方まとめ
– gRPCでは、Protocol Buffersのフォーマットでシリアライズしてデータのやり取りを行う。
– `.proto`ファイルにてスキーマ定義を行い、ツールを使ってコード生成ができる。そのため、クライアント・サーバーそれぞれでこの.protoファイルを共有できれば、仕様のズレなく開発をすすめることが可能。
– この記事では、.protoファイルの文法をざっとまとめてみる## サンプル全体
– [GitHub](https://github.com/captain-blue210/starting-gRPC/blob/main/proto/sample.proto)“`proto
// バージョン定義
syntax = “proto3”;// パッケージ定義
package sample;// import
import “google/protobuf/timestamp.proto”;
import “google/protobuf/duration.proto”;// サービスとRPCメソッド定義
service SampleService {
【Golang】Go言語基礎 Goroutineとは?
本日はgoroutineについて勉強しましたのでここでアウトプットさせて頂きます!
##Goroutineとは?
Goroutineとはgoステートメントで関数を指定することで、並行実行されるものです!まずは普通の関数を書いてみます。
“`go
package main
import (
“fmt”
“time”
)func goroutine(s string) {
for i := 0; i < 5; i++ { time.Sleep(100 * time.Millisecond) fmt.Println(s) } } func hoge(s string) { for i := 0; i < 5; i++ { time.Sleep(100 * time.Millisecond) fmt.Println(s) } } func main() { goroutine("world") hoge("hello") } ``` ``` 実行結果 world world world world world hello hello hel
Golang + Gin + Dockerのホットリロード、VSCodeデバッグ環境の構築
# 概要
Go言語のフレームワークGinの開発環境の構築。(ホットリロード、VSCodeデバッグ対応)今回のコードはGitHubに公開してあります。
https://github.com/yolo-lin/go-demo# 環境
– MacOS 10.15.6
– go version go1.15.2 darwin/amd64# 導入するパッケージ
[Gin](https://github.com/gin-gonic/gin):Goのフレームワーク
[cosmtrek/air](https://github.com/cosmtrek/air):ホットリロード
[delve](https://github.com/go-delve/delve):デバッグ# 事前準備
– Goのインストール:[公式](https://golang.org/)からインストール
– Go Modulesで依存関係を管理するため、環境変数GO111MODULEをonにする“`bash:.zshrc
export GO111MODULE=on
“`– Go Modulesの初期化
【Go】基本文法① 定義
udemy講座の「定義」編を見終わったので、まとめとふりかえり。
基本的な動作をコンソール上に出力しながら学習しました。
##前提
– udemyで[現役シリコンバレーエンジニアが教えるGo入門 + 応用でビットコインのシストレFintechアプリの開発](https://www.udemy.com/course/go-fintech/))を視聴してGoを学習中※「ブログ等で数行のコードの紹介は可能」とのことなので、講義で扱ったコードを引用します。
– 開発環境はVSCode + プラグイン(Goのバージョンは1.15)
– OSはWindows##ライブラリ
・goサイトの”document”か、コマンドプロンプトで説明が読める。
・関数外でimportして使用する。##変数
・宣言した変数が使用されていないとコンパイルエラーになる。
・まとめて宣言することも可能 ↓“`
var (
a int
b float64
c string
d bool
)
“`
・関数の中では、型を指定しなくても宣言できる。(自動で型を判定してくれる。)
TinyGoの開発環境をVSCode向けにセットアップする
TinyGoのVSCode向け開発環境セットアップがちょっと面倒だったので書き残し。
公式の記事は[ここ](https://tinygo.org/ide-integration/)。
TinyGoのインストール・セットアップは他記事をご参照ください。
筆者の環境 : MacBook Air (Retina, 13-inch, 2020) macOS Catalina 10.15.5![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335219/4049cd45-96b1-fe1c-be91-1d644156d27a.png)
## 2020/09/27 追記1
“.vscode/settings.json“ は下記TinyGo拡張機能のインストール・セットアップを行えば自動的に生成されるとのご指摘をいただきました。
なので以下“settings.jsonの作成“ パートはスキップしてしまって構いません。## ~~TinyGoの設定確認~~
~~TinyGoでは本家Goとは
golang pointer
“`p.go
type Vertex struct {
X, Y int
}var p *Vertex
p = &Vertex{1, 2}“`
GO/Gin gin-swagger使用してAPI仕様書を生成します
# 前書
この記事は `gin-swagger`ライブラリ使用してGinプロダクトにAPI仕様書生成するための知見をまとめるものになります。
[gin-swaggerリポジトリリンク](https://github.com/swaggo/gin-swagger)
![swagger-banner.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320164/462bd1f0-1756-44a5-7363-f88e6553281c.png)# テスト用のプロダクトを作成
フォルダを作成“`
// 任意のディレクトリで
$ mkdir use_swagger && cd use_swagger
“`
go modを初期化“`
$ go mod init use_swagger
“`# ライブラリインストール
“`
$ go get -u github.com/gin-gonic/gin
$ go get -u github.com/swaggo/swag/cmd/swag
$
【Golang】Go言語の基礎 値レシーバーとポインタレシーバーについて
今回はGo言語の値レシーバーとポインタレシーバーについてやっていきます!
この記事の後に、[こちらの記事](https://qiita.com/Kiyo_Karl2/items/752c3619240a293a7c0a)まで読んでいただくとよりGo言語に関する理解が深まると思います!#値レシーバーとは
“`gopackage main
import “fmt”
type Vertex struct {
X, Y int
}func (v Vertex) Area() int {
return v.X * v.Y
}//値レシーバー
func (v Vertex) Scale(i int) {
v.X = v.X * i
v.Y = v.Y * i
}func main() {
v := Vertex{3, 4}
v.Scale(10)
fmt.Println(v.Area()) // => 12
}
“`
こちらは値レシーバになります。
めっちゃ乱暴にいうと*がなければ値レシーバーになります。値渡しとか言われるようです。v.Scale(10
ACL Beginner Contest のメモ
# 前置き
Atcoderをやってみたので、自分用のメモです。
あとから加筆・修正する予定です。# 問題
https://atcoder.jp/contests/abl
# A
“`Q_A.go
package mainimport (
“fmt”
)func main() {
var k int
fmt.Scanf(“%d”, &k)var s string = “”
for i := 0; i
ACL Beginner Contest 参戦記
# ACL Beginner Contest 参戦記
## [ABLA – Repeat ACL](https://atcoder.jp/contests/abl/tasks/abl_a)
1分で突破. 書くだけ.
“`python
K = int(input())print(‘ACL’ * K)
“`## [ABLB – Integer Preference](https://atcoder.jp/contests/abl/tasks/abl_b)
2分半で突破、WA1 orz. A < B < C < D のパターンを見落とした. ```python A, B, C, D = map(int, input().split()) if A <= C <= B or A <= D <= B or C <= A <= D or C <= B <= D: print('Yes') else: print('No') ``` ## [ABLC - Connect Cities](https://atcoder.jp/contests/abl/task
cgoのg++用インクルードパス
分かってしまったらなんてことはないが、調べてもなかなか出てこなくて詰まったのでメモ。
環境:go version go1.15.2 linux/amd64
CGOでインクルードパスを指定するときには
“`// #cgo CFLAGS: -I<インクルードパス>“`
とすればよいが、これはgccでのコンパイルのときにしか使用されない。
cppファイルはg++でコンパイルされるので、この時のインクルードパスを指定したければ
“`// #cgo CPPFLAGS: -I<インクルードパス>“`
とする。以上。
golangでPre-Signed URL(署名付きURL)を生成する
GolangでPreSignedUrlを発行するコードを書いたので残しておきます。
“`golang
package mainimport (
“context”
“fmt”
“time”
“os”“github.com/aws/aws-sdk-go/aws”
“github.com/aws/aws-sdk-go/aws/credentials”
“github.com/aws/aws-sdk-go/aws/session”
“github.com/aws/aws-sdk-go/service/s3”
)// S3の接続情報
accessKey := os.Getenv(“AWS_ACCSESS_KEY”)
secretKey := os.Getenv(“AWS_SECRET_KEY”)
region := aws.String(os.Getenv(“CUEE_DB_REGION”))creds := credentials.NewStaticCredentials(accsessKey, secretKey, “”)
sessi
Golangの環境構築
本記事はGo初心者の備忘録になります。
## 環境
OS: Mac Catalina
Shell: Zsh## Go のインストール
#### homebrew でGoをインストール
“`sh
brew install go
“`#### インストールが完了したか確認(バージョンも合わせて確認)
“`sh
go version
# 出力結果例) go version go1.15.2 darwin/amd64
“`#### 環境変数$GOROOTの確認(Goのインストール先)
“`sh
go env GOROOT
# 出力結果例) /usr/local/Cellar/go/1.15.2/libexec
“`#### 環境変数$GOPATHの確認
“`sh
go env GOPATH
# 出力結果例) /Users/ユーザー名前/gols $(go env GOPATH)
# 出力結果例) ls: /Users/ユーザー名前/go: No such file or directory
“`
※パッケージのインストールを終えていない段階では
[Golang]`errors.Is()` `errors.As()` 完全ガイド〜使い方と違いをしっかり調査しました〜
# はじめに
`errors.As()`を雰囲気で使っていたらハマったので、`errors.Is()`も含めて、しっかりと調査してドキュメントとコードを読んだ上でまとめてみました。
ハマったところ、ハマりそうなところを重点的にまとめてみたので、お役に立てれば幸いです。
# 何をするメソッドなのか
## 簡単に
`error`を比較して`bool`を返してくれます。
使いみちとしては、アプリケーションのエラーを外部のエラー(例:gRPCのエラー)に変換したり、ライブラリで使用されているエラーをハンドリングして、アプリケーションのエラーに変換したりするときがあると思います。### `errors.Is()`
– 比較対象が保持している値と比較します。
– 値が同じなら`true`を返します。
– 値が異なるなら`false`を返します。
– `interface`など比較できない者同士だと必ず`false`になります。### `errors.As()`
– 比較対象を型レベルで比較します。
– 型が同じなら`true`を返します。
– 型が異なるなら`false`
Go: panicキャッチ後にStackTraceを表示する
Panicをrecoverした後に、StackTraceを表示したかった
いろんなライブラリをあさって発見したのでメモ“`golang
package main
import(
“runtime”
“log”
)func main() {
defer func() {
if err := recover(); err != nil {
stackTrace()
}
}()panic(“Panic Error!”)
}func stackTrace() {
stack := make([]byte, 1024*8)
stack = stack[:runtime.Stack(stack, false)]
log.Println(string(stack))
}“`
Golangの言語仕様を全部読んでまとめる
https://golang.org/ref/spec の和訳摘要です. 完全性はないです.
Version of Jan 14, 2020
##[ソースコードの表現](https://golang.org/ref/spec#Source_code_representation)
ソースコードはUTF-8である.###[文字](https://golang.org/ref/spec#Characters)
“`
改行 = LF
unicode文字 = Unicodeの”Letter”
unicode数字 = Unicodeの”Number, decimal digit”
“`###[文字と数字](https://golang.org/ref/spec#Letters_and_digits)
“`
文字 = unicode文字と”_”
“`##[字句要素](https://golang.org/ref/spec#Lexical_elements)
###[コメント](https://golang.org/ref/spec#Comments)
“`
プログラム