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

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

YAML+Mustache+go-generate で go の メタプログラミング をする

※この記事は、[CyberAgent PTA Advent Calendar](https://adventar.org/calendars/5741) 2020の24日目の記事です。

株式会社AbemaTV ビジネス開発本部 で広告システムのエンジニアをしています @shunta-furukawa です。
今日はクリスマスイブですね。メリークリスマスイブ!!

# はじめに

さて、[AJA SSPとその技術について](https://qiita.com/_tarof/items/3d568a23dba9b11b9ebe#go%E8%A8%80%E8%AA%9E)、でも触れられていましたが、サイバーエージェントで作られるシステムで Go言語が用いられることは多いです。

Go言語は、他の言語と比べて 言語仕様がシンプルなためハイパフォーマンスを出しつつも 扱いやすいために人気がある言語だと思います。反面、抽象化された賢い記法などがなく、記述量が多い言語でもあると思います。

– 書いていると気付いたらもう夜に…
– どうにか実装スピードをあげたい…

そんな時に、`go

元記事を表示

おまえもLGTM GIF画像を生成して、チームの生産性を上げてみないか?

# TL;DR

golangで
1. 既存gif拾ってきて
2. 文字列を合成して
3. LGTM画像を大量製造してみた

ソースコード: https://gist.github.com/tng527/484d77db0b86ff6c7aa13435073e1100

# 取り組みのモチベーション

レビュー時に拾い物のLGTM画像を貼っていたところ、以下のように喜んでもらえた。
![スクリーンショット 2020-12-22 13.44.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68104/a6280042-75bf-7b04-3378-24c8acc1ed27.png)

常に新鮮なLGTM画像を利用することで、メンバーのモチベが爆上がりするのではないか?(仮説)

拾い物のLGTM画像は面白みに欠ける画像が多い(個人の感想)ので、生成してみることにした。

# 注意点

いつもどおり、アドカレに間に合わせるための動けば良いやコードです。
エラー処理は基本してませんし、使い勝手の向上は今後

元記事を表示

VSCode + Remote Containerで環境構築(Go・応用編)

# 序文と謝辞

先日Go言語で簡単な方法を使ってリモートコンテナをつくりました(参考:[VSCode + Remote Containerで環境構築(go編)](https://qiita.com/honami/items/a1d943c31874cf576e43))が、作ったあと心の師匠(@MegaBlackLabel)からLGTMとともに以下のような~~ツッコミ~~天啓が。

元記事を表示

Goクイズ: Type assertions

# はじめに
本記事は, [Goクイズ Advent Calender 2020](https://qiita.com/advent-calendar/2020/goquiz)の12/24用に書かれました。

昨日は, @binzumeさんの[「Goクイズ: int = float64」](https://qiita.com/binzume/items/14f73f0f5da7f409fac9)でした。

Index expressionsに関する問題を出そうと思ったのですが, 以前[Twitterで出題した問題](https://twitter.com/task4233/status/1339189806958403585?s=20)と似ている気がしたので, 急遽Type assertionsに関する問題に取り替えました。

では, 本題に入ります。

# 問題
以下のコードを実行すると, どのように出力されるでしょうか?
[Playground](https://play.golang.org/p/28BcX6Eq4S-)

“`go
package main

import (

元記事を表示

Progate Goコースを終えた人へ贈るWeb API開発入門

# はじめに

この記事は[Go 3 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/go3)の23日目の記事です。

## あなたは誰?

プログラミング歴1年半くらいで、普段はWebプログラマ(Go, React)のインターンとして働いています。

## なぜこのような記事を書くに至ったか

この記事は[Progate](https://prog-8.com)のGoコースを終えたけどこれからどうやって学んでいけばいいかわからない人のためのガイド的なものです。

筆者自身、完全プログラミング初心者のときProgateにお世話になったのですが、Goのすべてのコースを終えたあとどのように学んでいけばいいのかわからずに困惑した記憶があります。

Progateの言語紹介文句には「Googleが開発した 人気上昇中のサーバーサイド言語」とありますが、Progateのレッスンは基本的な文法を学ぶものであり、WebアプリやWeb APIを作成するガイドはありません。
巷で「やるといいよ!」と言われている[A Tour of

元記事を表示

Goで作れる自作デスクトップアプリ【Wails】

この記事は[Go 2 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/go2) 24日目の記事です。

# この記事について
デスクトップアプリをGoで作りたいと思ったこと、ありませんか。

私は以前ElectronというNode.js駆動のアプリフレームワークの[記事](https://qiita.com/saki-engineering/items/203892838e15b3dbd300)を書いたものです。それから数ヶ月後にGopherになり、「GoでもElectronみたいにデスクトップアプリって作れるのかな?」と思い立ちました。

今回はその私の欲求にぴったりの(笑)、Goでデスクトップアプリを作れるWailsというパッケージの使い方を紹介します。

## 環境
– OS: macOS Mojave 10.14.5
– go version go1.14 darwin/amd64
– github.com/wailsapp/wails v1.7.1

# Wailsとは?
![logo_cropped.

元記事を表示

バックエンド側で Sign In With Google を実装する

この記事は [LinuxClub Advent Calendar 2020](https://qiita.com/advent-calendar/2020/linuxclub) の 24 日目の記事です. ~~遅刻しました…~~
タイトル通り, バックエンド側で Sign In With Google を実装し, メールアドレスを取得するまでのお話です.

# 背景
個人的な案件で Google のアカウントでログインするという機能を実装する必要があったのと, `golang.org/x/oauth2` ではできない部分があったので, その部分を自分で実装しました.

環境は Go 1.15.5 で行っています.

## `golang.org/x/oauth2` でできなかった部分
詳しいことはライブラリのドキュメント[^1]や, ソースコードを見ていただければわかるんですが, `golang.org/x/oauth2` では, ライブラリで得る `oauth2.Token` 構造体が以下の形になっております:

“`go
type Token struct {
// Acces

元記事を表示

Firestore (in Datastore mode) のトランザクションの挙動を試してみる

(本記事は今年の夏頃に某勉強会で発表した内容の焼き直しです。参加者の方が読むとかなりの部分重複があると思いますがご容赦下さい?‍♂️)

# はじめに

旧Cloud Datastore(以降、旧Datastoreと記します)を長く使ってきましたが、そろそろFirestore in Datastore mode(以降Firestoreと記します)に真面目に取り組もうと重い腰を上げることにしました。

Firestoreの仕様はDatastoreとほぼ変わらないですが、主にトランザクション周りに大きな変更があります。
本記事ではFirestoreのトランザクションの挙動を実際にプログラムを動かしていろいろ検証してみます。

なお、本記事ではnative modeについては扱いません。
ただ、おそらくトランザクション周りの挙動はほぼ共通なのではと思っている(違っていたらごめんなさい)ので、参考にはなるかと思います。

基本的には公式ドキュメントに書かれている内容に沿って試します。
https://cloud.google.com/datastore/docs/concepts/transa

元記事を表示

Goのnetパッケージを理解する~1日目~

# はじめに

Goのパッケージの中でも、苦手意識しかないパッケージの一つである`net`パッケージの勉強をしていきます。

# netパッケージとは

`netパッケージは、TCP/IP、UDP、ドメイン名解決、UNIXドメインソケットを含むUnixネットワークソケットへのポータブルインタフェースを提供します。
`
引用:http://golang.jp/pkg/net

# とりあえずサーバの起動

“`go:main.go
package main

import (
“fmt”
“net/http”
)

func main() {
http.HandleFunc(“/”, handler)
http.ListenAndServe(“:8080”, nil)
}

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

これで、8080番ポートにアクセスすると、`Hello World`と出力されるはずです

一旦、ここまでで、

元記事を表示

go get したのに command not found で配属直後に躓いた話

## 忙しい人向け

#### 解決策①: パスを通す

“`
$ export GOPATH=$HOME/go;
$ export PATH=$PATH:$GOPATH/bin;
“`

単純にパスが通っていないだけであればこれで解決するだろう。

#### 解決策②: go get で `$GOPATH/bin` に落としたバイナリを `$GOROOT/bin` にコピーする

しかし、こっちが本記事の結論。

今回は、Goのバージョンを切り替えやすくするために $GOROOT にシンボリックリンクを貼っていて、実行環境にバイナリ(実行ファイル)を go get できていなかった。

[解決策はこちら](https://qiita.com/y-kaanai/items/7a1d274a441003144106#%E8%A7%A3%E6%B1%BA%E7%AD%96)

## 経緯
当時の私は新たな MacBook PRO を手に入れ(貸与され)、配属先でGo製のAPIを開発することになっていたため、ワクワクしながらGoの開発環境を構築していた。

(後々躓くことも知らずに)言わ

元記事を表示

Go言語 学習記録

# Go言語とは
 2009年にGoogleが開発したプログラミング言語です。
 静的型付け言語であり手続き型言語に分類されます。

# 私がGo言語を学ぶ理由
 大きく分けて2つあります。

### 理由1. 違うタイプの言語に触れてみたいと思ったため
 私は今まで、いわゆる「オブジェクト指向」かつ「動的型付け言語」であるRubyとJavaScriptを主に勉強してきました。

○「動的型付け言語」と「静的型付け言語」の違いとは?
 ざっくり言うと、「変数を定義するとき、文字列型とか数値型などの型を指定するかどうかの違い」があります。
 動的型付け言語の場合、指定しませんが、静的型付け言語の場合だと指定する必要があります。

### 理由2.Goの将来性
 現在、Go言語の需要は伸びています。求人数などもそうですが、技術的に今後のトレンドになるみたいです。
 Goは、マイクロサービス(複数の独立したWebアプリケーションをまとめたWebサービス)開発向けの言語です。今、マイクロサービスが注目されており、今後Goが開発環境で使われていくことは間違いないでしょう。

# んで、実際に学ん

元記事を表示

UbuntuにGoをインストールする方法

# 最新版を調べる

[https://golang.org/dl/](https://golang.org/dl/)

# インストール

“`
cd ~
wget https://golang.org/dl/go1.15.6.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.15.6.linux-amd64.tar.gz
rm -f go1.15.6.linux-amd64.tar.gz
echo ‘PATH=”/usr/local/go/bin:$PATH”‘ >> .profile
source ~/.profile
“`
# 確認

“`
go version
“`

元記事を表示

go:embed 詳解 – 使用編 –

この記事は [Go Advent Calendar 2020](https://qiita.com/advent-calendar/2020/go) 23日目 と [CyberAgent Developers Advent Calendar 2020](https://adventar.org/calendars/5711) 24日目 の記事です。

## はじめに

[来年の2月にリリース予定の Go1.16](https://tip.golang.org/doc/go1.16) にはいつものリリースと同じように興味深い新機能が多数追加される。その中でも特に注目されている機能として、Go のビルド済みバイナリに読み込み専用の静的ファイルを埋め込む `go:embed` ディレクティブがある。これまで静的ファイルをバイナリに埋め込むアプローチは種々提案されてきたが[^1]、ツールやOSごとに埋め込み方がバラバラで、それぞれ使い方を覚えたり、特定ツールへの依存がどうしても避けられなかった。今回このディレクティブの導入により Go 公式として統一される形となる。

このディレクティブ導入が

元記事を表示

GoによるFyneを使ったGUI開発

GUI開発は、コマンドラインアプリケーションよりも作成が複雑なのは当然だ。
Fyneは、Goの優れた設計を使用して、GUIの構築を単純かつ迅速にするとのことで、一応は、Fyneを選んだ。
ゆくゆくは、Go謹製のshinyを使えるようになりたい。
んで、以下のプログラムをGUIに移行したい。

[りそなIB用CSVファイルまとめGoプログラム](165c67ebe042a93d036b)
[minecraftのセーブデータを管理するGoプログラム](bf0caf40e3e9c91952b4)

と言うことで、参加する予定は無かったアドベントカレンダだが、枠があったので急遽投稿することにした。
(空きに入ったとは言え、遅延させた感じが嫌だな・・・投稿忘れに思われるよ・・・悲しい)

## 入手(環境構築)方法
以下のコマンで使えるようになる。

“`terminal:コンソール
go get fyne.io/fyne
“`

上記コマンドで環境構築が終わる。
以下はデモ設定

“`terminal:コンソール
go get fyne.io/fyne/cmd/fyne_demo
fyn

元記事を表示

ECSでService Discoveryを使ってみよう

皆さんこんにちは!
シュークリーム大好きエンジニアの[くろちゃん](https://twitter.com/TakumaKurosawa)です。

こちらの記事は、[Applibot Advent Calendar 2020](https://qiita.com/advent-calendar/2020/applibot)の23日目の記事です!
昨日は @h_km さんの[UnityプロジェクトにおけるSmartBeatの活用例紹介](https://qiita.com/h_km/items/50354e4864d0125c68fd)でした。是非チェックしてみてくださいね!

## 背景

11月と12月の2ヶ月間、[株式会社アプリボット](https://www.applibot.co.jp/)さんで内定者アルバイトをしていました。
そのうち、初めの1ヶ月間はゲームの新規タイトル開発プロジェクトのサーバサイド開発チームでお世話になっていました。

そこで一任していただいたタスクを実装した経験を元に、ECSでサービスディスカバリを使うための実装方法についてアウトプットしようと思います!

元記事を表示

goで ~~ is not a typeのエラーが出た原因と対応

goで独自で定義した型を使用していた時に`~~ is not a type`といったエラーが出たのでその原因と対応です。

## 何があったのか

“`go
type responce struct {
Ok bool `json:”ok”`
Messages []message `json:”messages”`
}

var responce responce

var replyResponce responce //responce is not a type
“`
このように独自で定義した構造体を使っていたら`responce is not a type`と言うエラーが出てきました。

## 原因
変数を定義する時の型が1回目はtypeを参照しているが、2回目は1回目で定義した変数を参照している。

## 対応

定義した構造体とは別の名前をつける。

“`go
type responce struct {
Ok bool `json:”ok”`
Me

元記事を表示

Firestore Emulator を使って GitHub Actions でテストを動かしてみる

この記事は [フラー Advent Calendar 2020](https://adventar.org/calendars/5034) の23日目の記事です。
22日目は [@ujikawa1026](https://adventar.org/users/33961) さんで
「[小さな開発組織のマネージャーになってから1on1で考えていることを少しだけ書く](https://namaninotiteti1026.hatenadiary.jp/entry/2020/12/22/000541)」でした。

#はじめに
はじめまして。
今年の4月から、フラー株式会社のエンジニアとしてアルバイトをさせていただいております。
普段は、サーバーサイドエンジニアとしてGoを用いたAPI開発を行っています。

今回は、Firestore EmulatorとGitHub Actionsによる自動テストを作成したので、記事にまとめてみました。

#きっかけ
3ヶ月ほど前にFirestoreとGoで書かれたAPIを作成する機会があり、
ついでにテストも書くことになったので、Github Actions

元記事を表示

LeetCodeに毎日挑戦してみた 121 Best Time to Buy and Sell Stock(Python、Go)

#### Leetcodeとは

[leetcode.com](https://leetcode.com/)
ソフトウェア開発職のコーディング面接の練習といえばこれらしいです。
合計1500問以上のコーデイング問題が投稿されていて、実際の面接でも同じ問題が出されることは多いらしいとのことです。

golang入門+アルゴリズム脳の強化のためにgoとPythonで解いていこうと思います。(Pythonは弱弱だが経験あり)

#### 30問目(問題121)

## 121 Best Time to Buy and Sell Stock

#### 問題内容

> Say you have an array for which the *i*th element is the price of a given stock on day *i*.
>
> If you were only permitted to complete at most one transaction (i.e., buy one and sell one share of the stock), design a

元記事を表示

GoLandを使いましょう 2020冬

# はじめに
この記事は[アドベントカレンダー Go5](https://qiita.com/advent-calendar/2020/go5)の22日目の記事です。

みなさん、Goのエディタ何を使っていますか?
Vim? Vscode?

そうですねGolandを使いましょう。

[去年](https://qiita.com/junpayment/items/f66e85af6a854ca2a296)も同じタイトルの記事を書いたのですが、最新バージョンも2020.3となり新機能が続々と加わっています。
基本的なセットアップの再掲とともに新機能で僕が良いなあと思ったものをピックアップして行きたいと思います。

# GoLandセットアップ
## 前提環境
mac
windowsやLinuxでも大体同じだと思います。多分。

##

元記事を表示

bitbucketのprivateリポジトリからgo modする

# 背景
* bitbucketで管理しているprivateなリポジトリから他のgo言語のモジュールを使いたい
* ソースコードは公開したくない

# 前提

* bitbucketにアクセスできるSSH鍵を登録している
* 補足:Personal settings > SSH 鍵
* この記事はgo version go1.14.2 darwin/amd64 で書いています
* これ以前のバージョンであると他の設定が必要かもしれません

# ローカル設定

SSH鍵を登録していればgitコマンドを使用してcloneやpushなどSSHプロトコルで行うことができるがgo get はhttpsプロトコルを使ってアクセスしている。

なのでgit(bitbuket)からSSHプロトコルを使って取得するために以下の設定を行う

“`
git config –global url.”git@bitbucket.org:”.insteadOf “https://bitbucket.org/”
“`

以下が追加されていること

“`
$ cat ~/.gitconfig
[ur

元記事を表示

OTHERカテゴリの最新記事