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

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

社内勉強会でGo言語を学ぶのにやってること

# 概要
社内で勉強会の時間を取り分けることが出来たので、数人で集まって毎週2時間程度を取り分けてGo言語の勉強をする事にしました。PHPプログラマや機械学習チーム、インフラさんの混成チームで、社歴も年齢も様々なので、基本的に皆Go言語の初心者としてスタートしました。(途中から詳しいメンバーが合流)

Goを選んだ理由としては、

* PHP以外の選択肢を増やしておきたい
* PHPでは難しい処理(並行処理等)が行える言語がよい
* 複数人で限られた時間で行うので、学習コストがそこまで高くない
* 業務の合間での息抜きや刺激が欲しい

と大それた志があるわけではありません。

業務ですぐいに活かせそうな、Vue.jsとも迷ったのですが、今回はサーバーサイド言語になりました。

# Tour of Go
* https://go-tour-jp.appspot.com/welcome/1
* 6時間程度
* 「あーでもないこーでもない」 と言いながらドキュメントも参照しつつ動かしてみる
* 環境作りもこの頃学ぶ

# Codewars
* https://www.codewa

元記事を表示

longcatのオプションメモ

[mattn/longcat]のオプションまとめ

## インストール

“`bash
$ go get github.com/mattn/longcat
“`

## オプション一覧

`longcat [-n,l int][-i float64][-r,R,H][-o filepath][-d dirpath][-t themename][-themes][-pixterm][-dark][-ascii]`

### `-n int`

– how long cat
– 長さ指定(<-5でエラー) - def: 1 ### `-l int` - number of columns - 横に並ぶ数指定 - def: 1 ### `-i froat64` - rate of intervals - lオプションを使用した際のカラム同士の幅を指定 - def: 1.0 ### `-r` - flip holizontal - 横に反転 - def: false ### `-R` - flip vertical - 縦に反転 - def: false ### `-H`

元記事を表示

go修行9日目 ポインタとか

## ポインタ型

– `&n`でポインタのアドレスを指定
– `*int`で指定したアドレスの中身を取得

“`golang

package main

import “fmt”

func main() {
var n int = 100
fmt.Println(n)
fmt.Println(&n)

// pはポインタ型
var p *int = &n

fmt.Println(p)

fmt.Println(*p)
}
“`

“`
100
0xc000104030
0xc000104030
100
“`

## newとmake

“`golang

package main

import “fmt”

func main(){
// メモリのアドレスを確保している
var p *int = new(int)
fmt.Println(p)

// メモリのアドレスは確保していないのでnil
var p2 *int
fmt.Println(p2)
}
“`

“`
0xc0000120b8

“`

## stru

元記事を表示

Goのプロジェクトでもタスクランナーとしてnpmを使う

[Go](https://golang.org/) のタスクランナーとして [npm](https://www.npmjs.com/) を使ってみたら案外よかった。Go に限った話ではないけど、Go が特に開発ツールチェーン周りの管理がしにくいので噛み合いやすいのではないかと思う。

[npm](https://www.npmjs.com/) は [Node.js](https://nodejs.org/ja/) 用のパッケージマネージャだが、[npm-scripts](https://docs.npmjs.com/misc/scripts) という簡易なタスクランナー機能がついている。また、Node.js 用の便利な開発ツールをそのまま利用できて、開発ツールのインストールも一括で管理できる。

## npm をタスクランナーとして使う利点

– Node.js のインストールだけで利用できる
– 簡易なタスクランナーが利用できる
– **Node.js 用の開発ツールが利用できる**
– husky + lint-staged, Prettier, etc
– 開発ツールのイ

元記事を表示

Go Web開発の大枠

#Web開発の大枠

今日学んだWeb開発の大枠の流れについてまとめてみた。

(参考)
[Goプログラミング実践入門 標準ライブラリでゼロからWebアプリを作る](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-gear%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-Sheong-Chang-ebook/dp/B06XKPNVWV)
##HTTP通信の流れ
まずHTTP通信の流れを理解する。

1.クライアントがサ

元記事を表示

Go Module Mirror から壊れたパッケージが落ちてくる

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

# 概要

今日、Go 向け Discord クライアントライブラリの `DiscordGo` にアップデートが降ってきました:

[bwmarrin/discordgo](https://github.com/bwmarrin/discordgo/releases/tag/v0.21.0)

さて、早速自身のプロジェクトの依存関係のアップデートを試みます:

“`
$ go get -u github.com/bwmarrin/discordgo
go: downloading github.com/bwmarrin/discordgo v0.21.0
go: downloading golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9
go: downloading github.com/gorilla/websocket v1.4.2
go: downloading golang.org/x/sys v0.0.0-

元記事を表示

GoでHTTPサーバを立ち上げる(超基礎)

#GoでHTTPサーバを立ち上げる

“`server.go
package main

import (
“fmt”
“net/http”
)

func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, “HTTPserver”)
}

func main() {
http.HandleFunc(“/”, handler)
http.ListenAndServe(“:8080”, nil)
}
“`
##ハンドラを定義する
“`
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, “HTTPserver”)
}
“`
・1つ目の引数:**レスポンス先**
・2つ目の引数:**リクエストの受付**
・{ }内はハンドラで行う処理内容
##ハンドラとエントリポイントを結びつけ
“`
http.HandleFunc(“/”, handler)
“`
・1つ目の引数:エントリポイント
・2つ目の引数:呼

元記事を表示

Golangで自作パッケージに対して入力補完が効かない場合

Golangを試している時にハマったので、事象と対応方法のメモです。

# 環境
OS:mac
エディタ:Visual Studio Code(Goの拡張機能インストール済み)
Golang Version:go1.14.4 darwin/amd64

# 自作パッケージに対して入力補完が効かない?

下記のような自作パッケージを作成して、
別のソースから呼び出そうとしたところ、入力補完が効かない・・・

“`golang/sample/testpackage
package testpackage

import “fmt”

func Test() {
fmt.Println(“test”)
}
“`

image.png

# 解決策
go install {パッケージ名} コマンドを実行すると入力補

元記事を表示

次の水曜日の18:30をtimeパッケージで作る

## はじめに

Goの`timeパッケージ`で「次の水曜日の18:30」を作る方法を備忘録として残します。ここではエラー処理は省略します。
作ったコードは以下の通りです。

“`go
// ロケーション情報を取得
loc, _ := time.LoadLocation(“Asia/Tokyo”)

// 指定ロケーション(Asia/Tokyo)の現在時刻を取得
now := time.Now().In(loc)

// 指定ロケーション(Asia/Tokyo)の18:30を作成
next := time.Date(now.Year(), now.Month(), now.Day(), 18, 30, 0, 0, loc)

// 水曜日まで1日ずつ進める
for i := 0; i < 7; i++ { if time.Wednesday == next.Weekday() { break } next = next.AddDate(0, 0, 1) } fmt.Println(next) ``` [playgroundで試してみる](https://play.gol

元記事を表示

[LINE Bot] LIFFとリッチメニューでも管理画面が作りたい! 2 -リッチメニュー切替-

この記事はこの記事の続きです
[[LINE Bot] LIFFとリッチメニューでも管理画面が作りたい! 1 -グループ管理-]()

# リッチメニューを作る
さて、前回はグループへの招待・退会で管理メンバーの追加・削除をできるようにしました。
その際にリッチメニューをユーザ用と管理者用に切り替えます。
今回はそのリッチメニューを作ります。

今回はユーザー用を 3 x 1 (1200 x 405)
管理者用を 3 x 2 (1200 x 810) のメニューを作ります。
動作確認のため、上の段はユーザと同じものにします

## Line Messaging APIでリッチメニューを作る
Line Account Managerで作成したリッチメニューは残念ながらAPIでは使えません。
画像を準備し、APIで作成する必要があります。
画像はpngかjpgで1MB以内です。

pythonで適当に書いたので、ライブラリをインストールします。

“`bash
pip install line-bot-sdk
pip install pyyaml
pip install boto3

元記事を表示

echo APIがGoのオリジナルエラーをハンドリングしてくれたよ

# 初めに
> Qiita…初カキコ…ども…
> 俺みたいな中3でログ見てる腐れ野郎、他に、いますかっていねーか、はは
> it’a true wolrd.狂ってる?それ、400ね。

と言う訳で,駆け出しエンジニアのすなるQiita記事というものを書いてみたいと思います!
(お手柔らかにお願いします……)

# 動機
エラーのハンドリングを全体でカスタマイズする動機は,大きく分けて以下の2つがあると思われます.
1. Webページで,独自のエラーページに誘導したい
2. APIで,独自エラーをハンドリングしたい

恐らく2.に関してはアドホックにその場で対応すれば十分な場合が多く,あまり恩恵は得られないかもしれません.
どちらかというと,大規模なWebページを作る際に独自のエラーページを使用する事が多く,
また独自エラーハンドリングの書き方で調べて出て来るのが[^1]でしたので,
1の需要が大きい様に思われます.

しかし,**「APIが大規模化した場合」**且つ**「独自エラーをハンドリングしたい場合」**は重要性が高まると期待されます.
他の方の記事でも近いものがありま

元記事を表示

AWS X-Ray+Goを使ってSQSでのメッセージングを観測する

## 概要
タイトルの遠り、AWS X-Rayを使って、SQSでのメッセージングを観測します。X-Rayを使えば、複数のアプリケーション間で「どこからどこにメッセージが送られているか」が図示されるため、アプリ間通信の仕様や障害発生箇所の把握がしやすくなります。今回は、Go言語を使って実装します。

結論(ソース)はページ下部にあります。

## 環境

– Go言語 1.14.3
– aws-sdk-go
– aws-xray-sdk-go
– Mac OS X 10.15.4

前提として、aws-sdk-go, aws-xray-sdk-goは`go get`コマンドでインストール済みとします。

## この記事の対象読者
– AWSの有名どころサービスなら開発したことがある。AWS CLIも設定済み。
– SQSは知識があるがX-Rayはあまり知らない。X-Rayの概要や実装方法を知りたい
– (実装部分については)Go言語はそれなりに読める

## X-Rayの概要
アプリから情報を収集して、以下のような__サービスグラフ__を作成したり、リクエストの実行時間を計

元記事を表示

Go言語 + QtでGUIアプリ開発する時の環境構築

# 概要
Go + QtでGUIアプリ開発する環境を整えてみたのでメモを残しておきます。環境構築してサンプルを動かしただけで、開発はまだ全然進んでません。

# Qtとは?
マルチプラットフォームなアプリケーション開発フレームワークです。GUI開発で有名だそうです。
Wikipediaによると登場したのは1992年となかなか歴史が長く、最新版の5.15が出たのが2020年5月26日(記事執筆日の25日前)と現在も活発に開発が進められている、いい感じのフレームワークです。

本来はC++で開発するようなのですが、他の言語でも使えるように多くのバインディングが提供されています。それでGoにも対応しているというわけです。

# なぜGo?
macOSとWindowsの両方で動作し、なおかつランタイム不要なGUIアプリを作りたいと考えていたのですが、「マルチプラットフォーム」で「ランタイム不要」となるとGoだろうという先入観があり、調べてみたらQtとの組み合わせでいけそうだったので使ってみることにしました。
最近流行っているのはElectronでしょうし、Electronでも要件は満たせるわけ

元記事を表示

Golang – 本番環境に向けたDockerfileの書き方

# Dockerfile

本番環境で動くGoアプリのためのミニマルdockerfileを記す。

“`dockerfile:dockerfile
FROM golang:1.14.4 as builder

WORKDIR /go/src

COPY go.mod go.sum ./
RUN go mod download

COPY ./main.go ./

ARG CGO_ENABLED=0
ARG GOOS=linux
ARG GOARCH=amd64
RUN go build \
-o /go/bin/main \
-ldflags ‘-s -w’

FROM scratch as runner

COPY –from=builder /go/bin/main /app/main

ENTRYPOINT [“/app/main”]
“`

## 補足

“`dockerfile:レイヤー1
FROM golang:1.14.4 as builder
“`
ベースイメージには、golangのバージョン 1.14.4 を使いbuilderと名付けた。
後で[マ

元記事を表示

[Go,Rust,React] AWS APIGatewayでもCORSがしたい

# CORS = ブラウザからAPI叩く時にいつも引っかかるやーつ
WebページとAPIがポート番号も含めて同じであれば何も問題ないですが、
そうでない場合はクロスオリジンドメイン関連の設定しないとブラウザがエラーを表示します。
なお、APIのアクセス自体は飛んでいることもあります。

### 開発環境
– Rust 1.4.3
– Go 1.12
– React 16.13
– Serverless Framework

細かい設定や構成はこっち -> [[AWSLambda x LINEBot] GoとRustでも連携がしたい](https://qiita.com/alivelime/items/274966b10df905920d89)

# 結局、何が必要なのか
### ブラウザ側
CORSオプションをつける必要があります。
意外とこれを忘れていたりしてハマったりします。

“`typescript
fetch(
`${process.env.REACT_APP_API_HOST}/${env}/api/hoge/fuga`,
{
metho

元記事を表示

Goでよく見るコードやイディオムを書いとく

# 複数の変数を定義する場合

“`go
//varで変数定義をまとめる書き方(こっちを使おう!)
var (
n = 1
s = “string”
b = true
)

//暗黙的な定義を並べる書き方
n := 1
s := “string”
b := true

“`

この場合は前者の方が、変数定義のブロックを目立たせる事が出来るため前者の方が良い。(普段は暗黙的な定義を積極的に使って、Goの型推論というメリットを享受した方が良いけど)

# 関数とエラー処理について

“`go
//varで変数定義をまとめる書き方
result, err := doSomething()
if (err != nil) {
//エラー処理
}
“`

Goには例外機構がないため、その処理が成功したかどうかを何らかの形で返してあげる必要がある。
Goの関数が複数の戻り値を返す事ができるというメリットを活用して、errを追加してあげるのが良い。
上記の書き方は死ぬほど頻出するので、Goのイディオムとして覚えておく。

ここでerrという名前にしているのも、一

元記事を表示

『Golang』 closureは何?

#目次
ー挨拶
ーclosureは
ーclosureの例え
ーなぜClosureを使う?
ーまとめ
#挨拶
こんにちは。
2020年から日本で働いているキムと申します。
今回初めてqiitaに投稿しようと思います。
まだ苦手な日本語ですか宜しくお願い致します。

#closureは
Closureは関数の外側にある変数を参照する事を言います。
この時の関数は外側に存在している変数をまるで関数の中に引き込んだように、その変数を読み込んだんり書き込んだりすることができます。

#closureの例え
“`
package main

import “fmt”

func adder() func(int) int {
sum := 0
return func(x int) int {
sum += x
return sum
}
}

func main() {
pos := adder()
for i := 0; i < 10; i++ { fmt.Println("posの値>", pos(i))

元記事を表示

[LINE Bot] LIFFとリッチメニューでも管理画面が作りたい! 1 -グループ管理-

# bot用の管理機能を作るのは面倒だからLIFFでしたい!
LINEBotで色々開発をしていると、当然管理者用のAPIが生えて来たり、管理者用のリッチメニューが欲しくなったりしますよね。
今までの開発方法だと、管理者用のシステムを一つ作って、そこにソーシャルログインを連携させて、メンバー管理画面を作って、、、と平気でひと月やふた月飛んでいきます。
そこで、今回は、
1. 管理画面はLIFFで作る
2. 管理者用のLINEグループを一つ作る
3. そこにメンバーを招待したら管理者にする (DBにユーザIDを追加)
4. そこからメンバーを退出させたら管理者から除外する (DBからユーザIDを削除)
5. ついでにリッチメニューもユーザー用と管理者用で切り替える
6. LIFFでアクセストークンを取得してサーバ側で認証する (アクセストークンからユーザIDを取得し、DBにあるかチェックする)

||よくあるパターン|新しいやつ|
|—|—|—|
|管理仮面|PCorスマホ用管理画面|LIFF|
|アクセス方法|URLを教える|リッチメニューからアクセス|
|ログイン方法|ソー

元記事を表示

main.go

package main

import “fmt”

func main() {
totalScore := 0
// 引数にtotalScoreのポインタを渡してください
ask(1, “dog”,&totalScore)
ask(2, “cat”,&totalScore)
ask(3, “fish”,&totalScore)

fmt.Println(“スコア”, totalScore)
}

// 渡されるtotalScoreのポインタを受け取るように変更してください
func ask(number int, question string, scorePtr *int) {
var input string
fmt.Printf(“[質問%d] 次の単語を入力してください: %s\n”, number, question)
fmt.Scan(&input)

if question == input {
fmt.Println(“正解!”)
// ポインタを使って加算してください
*scorePtr += 10

} else {
f

元記事を表示

Goのjsonのomitemptyや-(ハイフン)の挙動

Goの`omitempty`オプションや`-`タグの挙動がいまいちわからなかったので確認してみました。

“`golang
type Hoge struct {
Foo string `json:”foo,omitempty”`
Bar string `json:”-“`
}
“`

## 結論

結論としては次のような挙動になるようでした。ドキュメントにも書かれてますが。。。

* `omitempty`オプションは、フィールドの値が空の値(false, 0, nil、 空配列、空マップ、空文字など)の場合、エンコーディング時にフィールドを省略する
* `”-“`タグは、エンコーディング、デコーディング時に常にフィールドを省略する

## 検証結果

### ドキュメント確認

まずは、[公式ドキュメント](https://golang.org/pkg/encoding/json/)を読むとそれぞれ次のように記載されています。

> The “omitempty” option specifies that the field should be omitted fr

元記事を表示

OTHERカテゴリの最新記事