- 1. プログラミング言語Go完全入門 質問会 質疑応答メモ(ラフ)
- 2. 【Golang】ゴルーチン⑤複数goroutinからチャネルに値を入れ取り出す
- 3. Goの配列とスライスについて
- 4. |
- 5. golang dep にはまった
- 6. 【Go】コンテナを理解するためにコンテナを自分で”造る”【初心者】
- 7. マイクロサービスでも使えそうなエラー処理を考えてみた
- 8. 【Golang】ゴルーチン④range,close
- 9. 【GCP】Cloud Functions の Go 1.13 でファイル構造に変更があった
- 10. 【Heroku】デプロイ後にcode=H14 desc=”No web processes running”が発生する場合はProcfileを作成して対処すればOK
- 11. Goの組込みデータ型を整理した
- 12. Goでよく使われるgormを理解する:目次
- 13. Goでよく使われるgormを理解する:Query編
- 14. WSL&VScode&Go=permission denied
- 15. Go xlsファイルを読み取る
- 16. Goで開発していたが、途中でPythonに切り替えた件を振り返る。
- 17. 【Golang】ゴルーチン③バッファ、チャネル
- 18. Cloud FunctionsのHTTPトリガーをGolang + Echoでさばいてみた
- 19. gobot I2CでLチカ
- 20. aws-sdk-goを通してlocal-kmsを使う
プログラミング言語Go完全入門 質問会 質疑応答メモ(ラフ)
### Q.
interface の使い方、継承との違いがまだしっくりときていません。できること、できないことをできれば他の言語(Java, Rubyなど)と比較して解説していただけると嬉しいです。A.
Goに継承はない。
interfaceは抽象化したい時に使う。
httphandlerが有名なinterfaceのひとつ。あるいは、io.Reader/Writer。
Javaはimplemetsする必要があるが、Goでは必要ない。
⇒ダックタイピング
Goではinterfaceを後から作ることができる。### Q.
保守運用が楽になるエラーハンドリングの方法や参考になる資料があれば教えていただきたいです。根本原因にたどり着くまでに時間がかかることがよくあります。A.
ログを出しましょう。
ラップして上に投げればいいわけではない。
エラーを返すと受取り側の処理が複雑になるので、都度panicで出したい。### Q.
初心者向けに、コードリーディングに最適なライブラリなどありましたら教えてほしいです。A.
標準ライブラリ、という回答が一般的。
stringsパッケージ
【Golang】ゴルーチン⑤複数goroutinからチャネルに値を入れ取り出す
#【Golang】ゴルーチン⑤複数goroutinからチャネルに値を入れ取り出す
Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。 基礎〜応用まで。“`
package main
//producerとconsumer
//複数goroutinからチャネルに値を入れ取り出す//mainから、いくつかのProducerを走らせて、
//その処理結果をchannelに入れて、Consumerでchanelの値を集めれて
//処理を行うimport (
“fmt”
“sync”
“time”
)func producer(ch chan int, i int) {
ch <- i * 5 } func consumer(ch chan int, wg *sync.WaitGroup) { for i := range ch { //インナー無名関数 //処理をまとめたいとき。 func() { defer wg.Done() fmt.Println("process", i*100)
Goの配列とスライスについて
# 書き方
## 配列
* `list := [3]string{“a”,”b”,”c”}`
配列 := [長さの数字]型{要素}* `list := […]string{“a”,”b”,”c”}` 要素の数を自動カウント
##スライス
* `slice := []string{“a”,”b”,”c”}`
スライス := [長さは指定しないので何も書かない]型{要素}* `slice := list[0:5]`
スライス := 配列[n番目:m-1番目]
※部分列の取り方→配列[start:end]or[start:]or[:end]or[:]* `slice := make([]int,5,5)`
make([ ]型,長さ,容量)# 性質
## スライスの長さlen(slice)と容量cap(slice)
* 長さ=要素の数
* 容量=スライスの最初の要素から数えて、元となる配列の要素
※配列をスライスしても元の要素の情報を参照型で保っている## インデックス(順番)
* 配列もスライスもインデックスは0から数える
| <- この演算子は何者?
# はじめに
最近Goのlogパッケージの記事を読んでいたらパイプライン(| <- これ)が+のように中間演算子として使われているのを見て「なにその演算子?」となったので調べて記事にしました。 基本的に記事のコードはGoです。 # 問題のコード ```go log.SetFlags(log.LstdFlags | log.Lshortfile) ``` ちなみに`log.LstdFlags`と`log.Lshortfile`はどちらもint型です(具体的な実装はあとにあります)。 # 公式ドキュメントにはどう書かれていたか Goの公式言語仕様には + や - などと一緒に演算子の一つとして載っています。 ``` + sum integers, floats, complex values, strings - difference integers, floats, complex values * product integers, floats, complex v
golang dep にはまった
dep ensure -v
で数時間かかっても終わらないのでおかしいなと思ったら、
githubに登録したrsakeyにパスをつけていたことが原因だったっぽく、パスなしkeyを登録し直したら、1分で終わった。
ssh-agentも紹介してもらったけど、それを使えば大丈夫なのかは未確認。今度やってみよう。
【Go】コンテナを理解するためにコンテナを自分で”造る”【初心者】
#コンテナを理解するためにコンテナを自分で”造る”
今回は[こちら](https://youtu.be/Utf-A4rODH8)を参考にして自作コンテナを作ってみる。
#コンテナとは
詳しくは他の方の説明を受けてください。
#Goでコンテナを”造る”
##環境
今回は`VMware`で`Ubuntu`を稼働させ、`VM`上で造りました。
“`
Ubuntu 20.04 LTS 64-bitgo version go1.13.8 linux/amd64
“`##まずはコンテナのルートディレクトリとなるFile Systemを作る
`/home/rootfs`ディレクトリ下に今回のルートディレクトリとなる`File System(fs)`を作成します。
“`
/home/rootfs/
├── bin
├── lib
├── lib32
├── lib64
├── proc \\空のディレクトリ
└── sbin“`
`bin`,`lib`,`lib32`,`lib64`,`sbin`ディレクトリは`/usr`ディレクトリ
マイクロサービスでも使えそうなエラー処理を考えてみた
# 元ネタ
`考えてみた`といっても全くのオリジナルではなくて、GoogleさんのDeveloper PageのError Handlingみてたらこれ応用したら汎用的に使えそうだなという感じでつくってみました。
元ネタは以下のようなものです。
## Pattern.1 Cloud API
ref. https://cloud.google.com/apis/design/errors
jsonだとこのようになります。
codeにHTTP Status
statusにgRPCのステータス
messageにエラーの内容
詳細は配列で複数記載できる様になっています“`json
{
“error”: {
“code”: 401,
“message”: “Request had invalid credentials.”,
“status”: “UNAUTHENTICATED”,
“details”: [{
“@type”: “type.googleapis.com/google.rpc.RetryInfo”,
..
【Golang】ゴルーチン④range,close
#【Golang】ゴルーチン④range,close
Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。 基礎〜応用まで。“`
package main//channelのrangeとclose
//結果を随時出力import (
“fmt”
)func goroutin2(s []int, c chan int) {
sum := 0
for _, v := range s {
//全部足す
sum += v
//すぐに送る
c <- sum } //終わったらchannelを閉じる //これ以上ない時は閉じる //閉じないと、中身以上取り出そうとしエラーになる close(c) } func main() { s := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} //実質1つしか入らないので、バッファは1でもいい c := make(chan int, len(s)) goroutin2(s, c) //go goroutine1(s,
【GCP】Cloud Functions の Go 1.13 でファイル構造に変更があった
## Cloud Functions Go 1.13 GA :tada:
GCF/Go 1.13 が GA になったので Go 1.11 から移行してみた。しかし、デプロイに失敗するようになった。
https://cloud.google.com/functions/docs/release-notes#May_28_2020
## 原因
コード内で設定ファイルを読み込むようにしていたが、GCF/Go 1.13 からファイルの構造が変更され読み込みエラーが起きてしまった。
## 調査
どのようにファイルの構造が変更があったのか調べたところ、ファイルの構造を調査したリポジトリを発見。
https://github.com/bcollard/find-go-cloud-function
どうやら、静的ファイル保存ディレクトリは以下に保存されるようだ。
`/workspace/serverless_function_source_code/`ファイル構造について、公式ドキュメントでは見つけることはできなかった。
## 対応
コードの静的ファイルを指定している箇所を下
【Heroku】デプロイ後にcode=H14 desc=”No web processes running”が発生する場合はProcfileを作成して対処すればOK
# 発生したエラー
“`
2020-06-02T00:41:22.345388+00:00 heroku[router]:
at=error code=H14 desc=”No web processes running”
method=POST path=”/xxxx” host=xxxx.herokuapp.com request_id=xxxx
fwd=”xx.xx.xx.xx” dyno= connect= service= status=503 bytes= protocol=https
“`## 私の場合
Go/echoで開発しており、メインのアプリの他にアプリケーションのディレクトリ内にmain関数を持つgoファイルを作成してデプロイしたら発生しました。
main関数が2つになり、Herokuがどちらを実行すべきが判定できなくなったんですかね。(適当)# 対処方法1
[公式ドキュメント](https://devcenter.heroku.com/articles/error-codes#h14-no-web-dynos-running)に基づき、アプリケーシ
Goの組込みデータ型を整理した
コードらしいコードは書いてない…
* [builtin – The Go Programming Language](https://golang.org/pkg/builtin/)
## 概略
* 論理型
* bool
* 文字列型
* string
* 整数型
* 符号付き整数型
* int
* int8
* int16
* int32 ( = rune)
* int64
* 符号なし整数型
* uint
* uint8 ( = byte)
* uint16
* uint32
* uint64
* uintptr
* 浮動小数点型
* float32
* float64
* 複素数型
* complex64
* complex128* エラー型
* Error## 論理型
#### bool
`true`または`false`しか取りうる値が存在しない最も単純なデータ型
## 文字列型
#### string
* 8bit/byteの
Goでよく使われるgormを理解する:目次
##はじめに
golangでアプリケーション開発を行なっている方だと、gormを使用されている方も多いのではないでしょうか。
自分もここ最近、golangを使ったWEBアプリケーションの開発を業務で行なっていますが、十分にgormの仕様を理解できておらず、実装で詰まってしまうことがあったので、この辺りで改めてgormのドキュメントと向き合い、Qiitaにまとめていければと思っています。基本的には、[GORMドキュメント](https://gorm.io/ja_JP/docs/associations.html)に沿って挙動を確認していきますので、ドキュメントも合わせて見ていただけるとよいかと思います。ただし、個人的に確認不要と判断した箇所については割愛していますので、予めご了承ください。
##目次
**はじめに**
・[はじめに](https://qiita.com/tsubasaozawa/items/b8917c57a20ba6daa316)**CRUD Interface**
・[Goでよく使われるgormを理解する:Query編](https://qiita.com/
Goでよく使われるgormを理解する:Query編
##目次
**はじめに**
・[はじめに](https://qiita.com/tsubasaozawa/items/b8917c57a20ba6daa316)**CRUD Interface**
・[Goでよく使われるgormを理解する:Query編](https://qiita.com/tsubasaozawa/items/19889340194cb6faa649)**Associations**
・[Goでよく使われるgormを理解する:Associations編](https://qiita.com/tsubasaozawa/items/5cde0b9b5df87d2334d5)
・[Goでよく使われるgormを理解する:Preloading編](https://qiita.com/tsubasaozawa/items/ac5a8a515fe4f7a139b0)##Query
Queryを用いることで、データの抽出条件を細かく設定することができます。####Where
gormのドキュメントには、AND検索について以下のような例が載っていますが、“`go
WSL&VScode&Go=permission denied
タイトルの通り、WSL上にGoの実行環境を用意した後VScodeのターミナルから色々やってた時に出くわした謎のエラーpermission deniedを解決したお話です。
#経緯
WSL上で[これ](https://github.com/matryer/goblueprints)を参考にGoを勉強してたのだが、いよいよVimだとキツくなってきたため、VScodeからWSL、そしてGoを動かしたいと考えるようになった。
VSCodeにWSLの拡張機能を追加して、VScodeのターミナルからgo buildでWebアプリケーションを立ち上げようとしたときに問題が起こった。
#permission denied
“`terminal
>>go build
….
….
main.go:4.12 ~~~/~~~/: rename ~~~/~~~/: permission denied
“`
う~んと?
WSL上でやっていた時には問題なくビルドできていた筈なのに、なんぞこれ?
不思議に思いWSL上でビルドするも、同じエラー吐くように。
#解決へ
とりあえず調べてみると、[同じような症
Go xlsファイルを読み取る
# Go xlsファイルを読み取る
今回は、Goで Excel の xlsファイル(Excel 97 ~ Excel 2003 ブック) を読み取る方法を考えてみます。
xlsxファイルの場合は、 [excelize](https://qiita.com/hiro_nico/items/0f180f2dfc62cf2559c7) がオススメです。
## ライブラリ
簡単に読み取りを行うなら、下記のライブラリを使うとよいです。
GitHub – extrame/xls: Pure Golang xls library
https://github.com/extrame/xls↓ Example を参考に書いてみるとこんな感じ
“`go
package mainimport (
“fmt”
“log”“github.com/extrame/xls”
)func main() {
xlFile, err := xls.Open(“input.xls”, “utf-8”)
if err != nil {
log.Fatal(err)
}sh
Goで開発していたが、途中でPythonに切り替えた件を振り返る。
# イントロダクション
目下、開発中のプロダクトなので詳しいことは書けないのですが、いろいろと気付きの多い出来事だったので、
少し自分自信の振り返りも兼ねて、投稿してみたいと思います。これは、決してGoよりPythonのほうが優れているとかそういった話ではないです。
今回、自分は開発者というよりプロジェクトマネージャー(以降、PM)という立場になります。# Goの採用
パネイルのコア技術はPythonなのですが、今回、開発にあたってGoを採用していました。
主な採用理由としては、「プロトコルとしてgRPCを採用するにあたって、gRPCとの組み合わせ事例が多い」からでした。gRPCの採用理由は、「同時に企画されていた別プロダクト(Python)との連携が想定されており、異なるプログラミング言語間でも型を維持したままデータ交換が可能」なことからでした。
当初は、プロダクトのリリース時期も未定でプロトタイプ的に実装されていたので、この時点では、社内的に実績のない新規技術を採用しても、特に問題がない状態でした。
問題がなかったかどうか検証するために、そもそも技術選定がどうあるべき
【Golang】ゴルーチン③バッファ、チャネル
#【Golang】ゴルーチン③バッファ、チャネル
Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。 基礎〜応用まで。“`
package main
//Buffered Channels
//同じチャネルに複数ゴルーチンから送信import “fmt”
func main() {
//1
//channelを作成 2はバッファ 2つまで受け取る。長さ
//3つあるとエラーになる
ch := make(chan int, 2)
ch <- 1000 fmt.Println(len(ch)) //>>1ch <- 2000 fmt.Println(len(ch)) //>>2
//ch <- 300はバッファサイズ以上になる為、エラー(デッドロック) //2 //一つ取り出す。channelの中は1つ減るため、追加できる /* x := <- ch fmt.Println(x) ch <- 3000 */ //3 //forで取り出す //2つ以上取りに行くため、エラ
Cloud FunctionsのHTTPトリガーをGolang + Echoでさばいてみた
GCPのCloud FunctionsのHTTPトリガーをGolangで使っているときにEcho使えるんじゃないかと思って試したメモです。
# プロジェクト構成
Cloud Functionsで使えるように以下のようにファイルとディレクトリを作成します。“`
プロジェクトルート/
├── cmd
│ └── main.go
├── functions.go
├── go.mod
├── go.sum
└── shared
└── echo.go
“`## コード
### go.mod
使った依存ライブラリはこんな感じです。“`
module github.com/sert-uw/go_echo_functionsgo 1.13
require (
github.com/dgrijalva/jwt-go v3.2.0+incompatible // indirect
github.com/labstack/echo v3.3.10+incompatible
github.com/labstack/gommon v0.3.0 // indirec
gobot I2CでLチカ
#1.はじめに
goと[gobot](https://gobot.io/)を使って、RaspberryPiのI2Cに接続したIOエキスパンダ(MCP23017)を操作してみます。
[公式にMCP23017がサポート](https://gobot.io/documentation/drivers/mcp23017/)されてるので、チュートリアルチャレンジで終わるかと思ったら、なんと、サンプルコードが書かれてなかったので、覚え書きを兼ねて簡単にまとめてみました。
**実行環境**
| | |
|:–|:–|
|ハードウェア|Raspberry Pi 4 |
|OS|Raspbian Buster|
|go|Ver.1.14.3|
|||
|IOエキスパンダ|[MCP23017](http://akizukidenshi.com/catalog/g/gI-09486/)|
||→これを、RaspberryPiのI2C端子に接続済|“`bash
$ uname -a
Linux raspi4 4.19.97-v7l+ #1294 SMP Thu Jan 30 13:21:14
aws-sdk-goを通してlocal-kmsを使う
# この記事を書いた経緯
aws-sdk-goを用いた案件ソース中にkmsを用いた暗号・復号化の実装があり
kmsという概念すらわからなかった私が、ローカル環境での検証に四苦八苦した時の覚書を認めたものです# コマンドだけ知りたい人へ
## local-kmsコンテナを立ち上げる
**そのままdev環境・本番環境のKMSに作られている鍵を使おうとしても、IAMの認証をかけられてしまうので
権限のないローカル環境では暗号化・復号操作を行うことができません。**ローカル環境においてkmsを用いた処理をデバッグしたい場合、[local-kms](https://hub.docker.com/r/nsmithuk/local-kms)というdocker imageを用いて実現することが可能です。
他コンテナとポートが重複する場合は、環境変数“PORT“を用いることで競合を回避できます“`bash
$ docker run -p 8080:8081 -e PORT=8081 nsmithuk/local-kms
“`## aws configureの作成
local-k