- 1. println
- 1.1. 「文字列」「+」演算子
- 1.2. コメントの書き方
- 1.2.1. Goの学習備忘録 #1 環境設定とデバッグ
- 1.2.2. 参照型について
- 1.2.3. Microsoft AzureのGo紹介
- 1.2.4. go の json 変換の挙動まとめ
- 1.2.5. golang × SQLite3 でLIKE句を使う
- 1.2.6. Docker環境のgRPC/goでハローワールド
- 1.2.7. Goで排他制御の仕組みを作ってみた
- 1.2.8. [GKE] Deploymentのreplicasを0にしてGoアプリにOSシグナル SIGTERM を通知
- 1.2.9. Go を docker で動かす時の tips
- 1.2.10. anyenvのgoenvにGoLangをインストール
- 1.2.11. docker containerの挙動が変わらなくて困った
- 1.2.12. Goの制御構文について
- 1.2.13. Goのグローバル変数とスコープでハマった話
- 1.2.14. 【Go】CloudFrontの署名付きURLでプライベートコンテンツを配信
- 1.2.15. Fluentdのhttpアウトプットを調査してみた
- 1.2.16. GO言語+ginでテストを書く
- 1.2.17. GoでCRUDアプリをMysql、GORM、Echo、Clean Architectureで作る
- 1.2.18. AtCoder Beginner Contest 181のメモ
- 1.2.19. Goで双方向リストをJSONに変換する際のつまずき
GOちょーきそ めも1
println
println()の()の中に文字を書くと、()の中身がコンソールに表示されます。
println というのは、Goが用意している「命令」の一つ
要は()の中のもを出力してくれという意味“`
pacage imo
func imo() {
println(“hello.世界”)
}
“`「文字列」「+」演算子
文字列はダブルクォーテーション(”)で囲んであげる必要があります。” “で囲んでいないとエラーが発生します。
(“xx”+”xx”)文字列を連結し1つの文字列にします。~~~
package imo
func imo(){
println(“hhello,正解”)
println(“hello”+”正解”)
}
~~~コメントの書き方
**ブロックコメント**と**行コメント**の2種類があります。ブロックコメントは/*と */で挟まれた部分をコメントとし、行コメントは//(スラッシュが2つ)から行末までをコメントになる
~~~
package imo
fun
Goの学習備忘録 #1 環境設定とデバッグ
## 環境設定
### Goをインストール for mac
https://golang.org/
からダウンロードterminalからgoを実行
command not foundの場合、terminalを再起動
それでもダメな場合、PATHを通す“`bash
export GOPATH=”$HOME/go”
export PATH=”$GOPATH/go//bin/:$PATH”
“`### パッケージをインストールしてみる
Goのドキュメントを見れるパッケージ
“`bash
$ go get golang.org/x/tools/cmd/godoc
“`
https://godoc.org/golang.org/x/tools/cmd/godoc“`bash
$ godoc fmt# go doc fmt.Printfにコマンドが現在では変更されているらしい
“`## VSCodeでのデバッグのしかた
### delveをインストール
“`bash=
$ go get -u github.com/derekparker/delve/cmd/d
参照型について
##前提
###参照型とは
それ自体は含まない、そのデータの場所を指し、保持するものである。といった具合に、言葉では表現し難いデータ構造です。Goにはそれぞれ、**スライス**・**マップ**・**チャネル**という3つの参照型が定義されています。
###組み込み関数makeとは
スライス・マップ・チャネルの3つの参照型を生成できる、組み込み関数です。型によってパターンが違ったりするので、各理解が必要になります。###lenとcap
この2つの組み込み関数は、3つの参照型に対して有効に使用できるので、前提知識として押さえておきます。・**len** 各型の要素数を調べることができます。
・**cap** 各型の容量(キャパシティ)を調べることができます。##スライス
###スライスとは
**可変長配列**のようなものを表現するデータ構造です。前述の通り、組み込み関数makeで型を生成することができます。
“`golang
a := make([]int, 5)
a[0] = 1
fmt.Println(a) //[1 0 0 0 0]
“`容量が5であ
Microsoft AzureのGo紹介
2020年11月3日(火)にオンラインで「[合同勉強会 in 大都会岡山 -2020 Winter Online-](https://gbdaitokai.connpass.com/event/189232/)」が開催されました。今回は初のオンライン開催でしたが、バラエティ豊かなセッションが揃った、これまで通りの雰囲気だったので安心しました。
2020年、これまでの「[Azure SDK for Go](https://docs.microsoft.com/ja-jp/azure/developer/go/)」の学習の過程で私が知り得たMicrosoft Azureな情報のお裾分けと、裏テーマとしてお世話になった方々への恩返しとして、「Microsoft AzureのGo紹介」にて発表させて頂きました。
【スライド】 [Microsoft AzureのGo紹介](https://www.slideshare.net/qt-luigi/microsoft-azurego)
直前まで何回リハをしても予定の20分を超えてしまいどうなるかと心配していましたが、いざ本番、ほぼ時間通りに終わ
go の json 変換の挙動まとめ
go の json 挙動を色々と試したのでそれをまとめます。
## json への変換の仕方
まずは、基本的なjsonへの変換の仕方です。 最も簡単な方法としては、以下のような感じで変換を行ないます。
“`go
import “encoding/json”
//…
jsonout, err := json.Marshal(対象のオブジェクト)
“`このやり方は分かりやすいですが、実際は以下のような形で変換することが多いと思います。
“`go
encoder := json.NewEncoder(jsonの書きこみ先のio.Writer)
err := encoder.Encode(対象のオブジェクト)
“`上記のやり方だと、 `io.Writer` のインターフェイスであれば何でもいけるので、ファイル(os.File)に書きこんだり、httpのレスポンス(http.ResponseWriter)に書きこんだり、バッファ(bufio.Writer)に書きこんだりと自由度が高いです。
## 基本的な出力
次に基本的な構造体の出力を見ます。 以下のような普通の
golang × SQLite3 でLIKE句を使う
## はじめに
Go言語の基礎を1~2週間ほど学び、CRUD機能を持つ簡単なwebアプリを作成しました。
その過程のデーターベース操作で躓き(LIKE句)調べても中々解決に繋がる記事を見つけられなかったので
この記事を書くことにしました。https://qiita.com/__init__/items/2edfc7acf11234e5b1aa
上記の記事にて基本的なデータベース操作は書かれています。
初めてQiita記事を書くのでとりあえず今回は自分が躓いたLIKE句のことのみ記事にしてみます。
## 環境バージョン:go 1.15.3
db:SQLite3
PC:Mac
## 事前準備
golang、SQLite3、go-sqlite3のインストール※先ほどの記事でインストール手順も詳しく書かれています。
https://qiita.com/__init__/items/2edfc7acf11234e5b1aa## テーブル作成と中身
####まずはテーブル作成
“`
package mainimport (
“database/sql”
_ “gi
Docker環境のgRPC/goでハローワールド
# はじめに
goのお勉強しはじめた。gRPCのお勉強しはじめた。まず、これを試してみた。
思ったより、つまづいたので記録を残しておく。
[Quick start – gRPC](https://grpc.io/docs/languages/go/quickstart/)goもgRPCもよくわかってない。
環境は、このdockerイメージを使った。名前的に、欲しいの入ってそうやったので。
[grpc/go – Docker Hub](https://hub.docker.com/r/grpc/go)# Docker
こんな感じで立ち上げた。Dockerよくわからん 。“`
docker pull grpc/go
docker run –name grpc-go -it grpc/go /bin/bash
“`# Quick Start
Quick Startにそって順番に実行していく。下記コマンドを実行すると、
“`
$ go run greeter_server/main.go
“`こんな感じのエラーが出る。
“`
cannot find
Goで排他制御の仕組みを作ってみた
#概要
2度目の投稿です。
Goで排他制御の仕組みを書く機会があったので、記録していきます。
今回は2種類の方法で排他制御の仕組みを作っていきます。#各種ツール
– go 1.14
– VSCode(1.50.1)
– golang.org/x/sync v0.0.0-20201020160332#シナリオ
今回はあるテーブルを共有資源として、テーブルに対して複数のプロセスから処理が行われたときに、先行のプロセスが終わるまで、後続のプロセスがテーブルを操作することが出来ないようにする仕組みを作っていきます。まずは排他制御を行わず、ゴルーチンをつかって同時にテーブルをupdateしてみます。
(sync.WaitGroupはメインのgoroutineを待機させるためのものです。詳しくは[こちら。](https://qiita.com/ruiu/items/dba58f7b03a9a2ffad65))“` go
var w sync.WaitGroupfunc main() {
w.Add(2)
go update()
go update()
w.Wait(
[GKE] Deploymentのreplicasを0にしてGoアプリにOSシグナル SIGTERM を通知
# お題
表題の通り。
実際の動きとしてそうなることを確認したかっただけ。# 前提
– GCP環境は用意済み。
– GCPローカル設定済み。(`gcloud`コマンドが使用できる状態になっている。)
– `kubectl`コマンドが使用できる状態になっている。
– GKEクラスタ作成済み。# 開発環境
## # OS – Linux(Ubuntu)
“`
$ cat /etc/os-release
NAME=”Ubuntu”
VERSION=”18.04.5 LTS (Bionic Beaver)”
“`## # gcloud
“`
$ gcloud version
Google Cloud SDK 312.0.0
“`## # kubectl
“`
$ kubectl version
Client Version: version.Info{Major:”1″, Minor:”17″, GitVersion:”v1.17.9″, GitCommit:”4fb7ed12476d57b8437ada90b4f93b17ffaeed99″, GitTreeSta
Go を docker で動かす時の tips
## docker image
### go mod を利用するパターンの参考
“`dockerfile
# buildイメージ
FROM golang:1.13 AS builderWORKDIR /go/src
## 依存ライブラリをダウンロードする(キャッシュを使いたいので、これを先にやる)
ENV GO111MODULE=on
COPY go.mod go.sum ./
RUN go mod downloadADD . /myapp
WORKDIR /myapp## main.goをコンパイルし、実行バイナリを保存
RUN CGO_ENABLED=0 GOOS=linux go build -o server ../myapp/cmd/main.go# run-timeイメージ
FROM alpine:3.10
COPY –from=builder /myapp/server /app
EXPOSE 50051
ENTRYPOINT [“/app”]
“`### dep を利用するパターンの参考
“`dockerfile
# buildイメージ
anyenvのgoenvにGoLangをインストール
突如業務でGo言語、GoLangを使うことになる可能性が出てきたので、勉強を始めようと思いました。
せっかくなので環境作りを控えておきます。どなたかの役に立つと幸いです。## 環境
HARD: MBP2015
OS: macOS Catalina 10.15.7## anyenvのインストール
多言語でもよくよく出てくる言語のバージョン管理ツールですが、GoLang版もあり、 `goenv` となります。色々試そうとするとバージョン管理ツールが山程溜まってくるので、ここは `anyenv` を使って一元管理しましょう。後から導入しようとすると、pathを通したりするので大変なことになります…。
`anyenv` のインストール手順については、調べると山程出てくるので、そちらを参照してください。参考: [anyenv + macOS環境構築](https://qiita.com/rinpa/items/81766cd6a7b23dea9f3c)
“`
$ anyenv install -l
Renv
crenv
denv
erlenv
exenv
docker containerの挙動が変わらなくて困った
#はじめに
コードを変更しても、コンテナ内のアプリの挙動が変わらなくて、困ったことになっていました。その対処法についてのメモです。(キャッシュが効いていた系ではない)#先に対処法
`Dockerfile`内でbuildした`app`(実行ファイル)を、`docker-compose.yml`で設定していたvolumesのローカルディレクトリ内にあった`app`が上書きしてました。
よって、余計なマウントをしないように変更することで解決しました。#Problem
1. dockerコンテナで作成していたgolangのアプリがある
2. `Dockerfile`内でbuidしてappを起動するようにしている
3. 例えば、`main.go`を編集して保存する。
4. `docker-compose up -d –build` でアプリを再作成・起動する
5. あれ?変更されてないぞ!?(buildは実行されている)
6. `docker-compose build –no-cache` を試すが同じ…ディレクトリ構成↓
“`
myapp
– docker-comp
Goの制御構文について
Goの制御構文は、非常にシンプルにデザインされており、最低限の予約語で記述できるようになっています。そのため、記述方法にはたくさんのバリエーションがあるので、それについてまとめていきます。
##if文
まず、条件分岐を制御する**if文**です。if文の基本形は下記の通りです。“`
if 条件式 {
条件成立時の処理
} else if 条件式 {
最初の条件式が成立しなかった場合の処理
} else {
すべての条件式が成立しなかった場合の処理
}
“`ちなみに、条件式はbool値である必要があります。
##簡易文を設定したif文
条件式の前をセミコロンで区切り、簡易文を設定することができます。“`go
x, y := 5, 10if a := x * y; a == 50 {
fmt.Println(“変数aは50です”)
} else {
fmt.Println(“変数aは謎です”)
} //変数aは50です
“`また、if文を利用してエラー処理も実現できます。
“`go
import (
“os”
Goのグローバル変数とスコープでハマった話
グローバル変数使わないといけないときってありますよね。たとえば、テストのときの初期化に必要ですよね(今回はこれでハマった)
あとで私がハマった現実的なシチュエーションを説明します(たぶん、同じことでハマった人100人くらいはいる)がひとまずクイズ形式で気楽にいきましょう。## クイズ
皆さんは以下のmain関数の出力は何だと思いますか?“`go
package mainimport (
“fmt”
)var global string
func main(){
global = “initial state”
fmt.Println(global)
}
“`
「馬鹿にしてるのか?」という声が聞こえてきそうですね。
念のため答えは“`console
initial state
“`
です。
じゃあ、次はこちらです。(次からimportとかは省きます)答えを予想してくださいね?“`go
var global stringfunc main(){
global = “initial state”
global ,err := double(
【Go】CloudFrontの署名付きURLでプライベートコンテンツを配信
Golangで署名付きURLを発行します。
“`golang
import sign “github.com/aws/aws-sdk-go/service/cloudfront/sign”
func main() {
type CFConfig struct {
KeyID string
Domain string
KeyPath string
}// cloud front config
cfConf := &model.CFConfig{
KeyID: “xxxxxxxxxxxxCQ”
Domain: “http://xxx.cloudfront.net”,
KeyPath: “key/xxxxxxxxxxxxCQ”,
}privKey, err := sign.LoadPEMPrivKeyFile(r.cfConf.KeyPath)
if err != nil {
log.Println(“failed to load pem file:”, err)
return “”, err
}keyID := r.cfCon
Fluentdのhttpアウトプットを調査してみた
この投稿では、Fluendのhttpアウトプットプラグインについて調査した結果についてお伝えします。
## Fluentdのhttpアウトプットプラグインとは?
Fluentdではアウトプットプラグインを設定することで、ログの送信先をファイルやElasticsearchなどさまざまなストレージに送信できます。httpアウトプットプラグインもその一種ですが、送信先のミドルウェアが決まっているものではなく、HTTPリクエストを受け取れるミドルウェアならどんなものに送信できる万能選手です。httpアウトプットを使うと、Webhook的なことができます。受け取る側のHTTPサーバーはどんな言語で実装しても構わないので、ログを受け取ったら任意の処理を行うことができます。
* 公式ドキュメント: https://docs.fluentd.org/output/http
## out_httpがビルトインになったのはv1.7.0
Fluentdでout_httpがビルトイン、つまり、プラグインをインストールしなくても使えるようになったのはv1.7.0からです。
Docker Hubで公開
GO言語+ginでテストを書く
##はじめに
とりあえず[sourcegraph.com/github](https://sourcegraph.com/github.com/gin-gonic/gin@8f3047814e86442c8efbd91ef7007905d47cf6c9/-/blob/context_test.go#L517)をみてください。この記事は、先程みてもらったコードの一部を紹介します。
golang+ginで簡単なテストを書いてみます。
テストは難しい
##参考にしたもの
+ ginに書いてあるテストを真似して書きました。
[sourcegraph.com/github](https://sourcegraph.com/github.com/gin-gonic/gin@8f3047814e86442c8efbd91ef7007905d47cf6c9/-/blob/context_test.go#L517)+ 公式
[GoDoc](https://godoc.org/github.com/gin-gonic/gin)##環境
go version go1.13.8 linux/amd
GoでCRUDアプリをMysql、GORM、Echo、Clean Architectureで作る
#はじめに
本記事では `Clean Architecture` で、
DBは `Mysql` 、フレームワークは `Echo` 、ORMapperには `GORM` を用いて
`CR(U)D機能を持つAPI` 作っていきます。### 作るもの
Create、Read、(Update)、Delete機能を持つAPI
Updateだけ未実装ですので、ぜひご自身で追加してみてください!### 対象読者
Goの環境構築まで終えて、簡単なAPIを作ってみたい人
### 使用技術
|技術 |種類 |
|—|—|
|DB |Mysql |
|ORM |GORM |
|フレームワーク |Echo |# 目次
# Clean Architectureとは
Clean Architectureというと、以下の図が大変有名です。
![clean.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633802/b785a780-20e9-96ae-52ae-597a7
AtCoder Beginner Contest 181のメモ
# 前置き
Atcoderをやってみたので、自分用のメモです。
あとから加筆・修正する予定です。# 問題
https://atcoder.jp/contests/abc181
# A
“`Q_A.go
package mainimport (
“fmt”
)func main() {
var n int
fmt.Scanf(“%d”, &n)if n % 2 == 0{
fmt.Printf(“White”)
}else{
fmt.Printf(“Black”)
}}
“`# B
“`Q_B.go
package mainimport (
“fmt”
)func main() {
var n int
fmt.Scanf(“%d”, &n)var a, b int64
var result int64
for i := 0; i < n; i++ { fmt.Scanf("%d %d", &a, &b) result +
Goで双方向リストをJSONに変換する際のつまずき
# 何があったか
Goでコーディング中、双方向リストっぽいものを自作&JSONに変換する必要性があった。方針としては `encoding/json` を使っていくつもりが、ごちゃごちゃ詰まってしまった、という話。# 要するに
* structに自分自身がいるときはちゃんとポインタにしましょう
* JSONに変換するとき、そいつが循環する可能性があるなら、`json:”-“` で無視させて、阻止しておこうね# structに自分自身がいると invalid recursive type
当たり前っちゃ当たり前の話ですが。
## 失敗編
“`golang
package mainimport (
“encoding/json”
“fmt”
“log”
)type Person struct {
Name string
Parent Person
Child Person
}func main() {
sora := Person{}
sora.Name = “Sora Amamiya”
j, err := json.Marshal(sor