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

Go関連のことを調べてみた2020年03月17日
目次

GAE/Go 2nd generationでDatastoreのmutationを使う上でトランザクションに気をつけろ!

僕は普段GAE/Goで開発をしているのですが、自社でdatastoreの機能をまとめたライブラリを作ることになって、[GoDoc](https://pkg.go.dev/cloud.google.com/go/datastore?tab=doc)を読んでいるときに初めて知ったのですが、datastoreにMutationがあるのをしりました!
それでMutationの使い方や使い所の記事を探したのですが、SpannerのMutationの記事と[公式ドキュメント](https://cloud.google.com/datastore/docs/reference/data/rest/v1/projects/commit?hl=ja)しか出て来なかったので、自分で記事を書くことにしました!

# Mutationとは?

自分が探した限り、datastoreのmutationに関する説明は書いていなかったので、何とも言えないんですけど、
Insert, Update, Upsert, Deleteを一括で行うもので、副作用を起こすものですね

で、何がよくなったかというと

– Inse

元記事を表示

【Go】変数宣言の違い( := 、 var )

## 変数宣言の違い( := 、 var )

基本的にはこちらで理解

[他言語プログラマがgolangの基本を押さえる為のまとめ](https://qiita.com/tfrcm/items/e2a3d7ce7ab8868e37f7#%E6%A6%82%E8%A6%81)

## 自分なりの整理

#### :=

・varとタイプ型を省略(自動判断してくれるのか、初期化の時間・容量に無駄がでるのか)
・関数内のみで宣言可能

#### var

・指定したタイプ型によって初期化される(ポインタ型はnilで初期化)
・関数外でも宣言可能

“`Go:
func main() {
var a int
var b string
var c []int

var d *int
var e *string
var f *[]int
g := 1

fmt.Println(a)
fmt.Println(b)
fmt.Println(c)

fmt.Println(d)
fmt.Println(e)
fmt.Println(f)

fmt.Println(g)

元記事を表示

Trello風Webアプリケーションを作成してみた

## 作ったもの

最近、プログラミングから少し離れていたので、思い出すこともかねてTrello風のWebアプリケーションを作ってみた。

![vue-trello – Google Chrome 2020_03_17 3_05_51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/279498/b545e34f-a1da-e8aa-97e0-ce7653247eb2.png)

▼デモ( https://x-color.github.io/vue-trello )
![demo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/279498/7f07b984-ce2b-8db6-c8d4-c11ff41d7c34.gif)

▼完成品のリポジトリ
エンジニアの貴方必見

https://www.reiwarss.com/OpenProject

Top tags
python
swift
javascript
go
C
C++
C#
Ruby
TypeScript
PHP

元記事を表示

Go で GitHub App (Bot) を作る

シンプルな GitHub App (Bot) を Go 言語で作ってみます。
順を追って作り方を解説していくので「サンプルコードだけ見たいよ」という方は[「まとめ」](#まとめ)に記載されているものをご参照ください。

## 作るもの

下図のように Issue を作成すると `hello, ${username}` と反応してくれる Bot を作ります。

![githubapps1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586035/a648cead-5d5c-d8ac-d02c-854abd86e05e.png)

## 準備

GitHub に動作確認用のリポジトリを作っておきしょう。

また、GitHub から Webhook イベントを受け取る必要があるので、パブリックアクセス可能な URL が必要です。
今回は開発しながら適宜動作確認が行えるように [ngrok](https://ngrok.com/) というプロキシサービスを利用してローカル開発マシンのポートをインターネットに

元記事を表示

Go の json.Marshal の思いがけない仕様

# 結論

`json.Marshal` は、`uint8` 型のスライスを base64 文字列にする。
`int8` 型だったり スライスじゃなくて配列だったりすると配列になるけど。

# ソースコードと実行結果

“`golang:golang
package main

import (
“encoding/json”
“fmt”
)

type S struct {
U8Array [3]uint8
U8Slice []uint8
S8Array [3]int8
S8Slice []int8
U8SliceP *[]uint8
PU8Slice []*uint8
IFSlice []interface{}
}

func main() {
a:=uint8(1)
b:=uint8(2)
c:=uint8(3)
o := S{
U8Array: [3]uint8{1, 2, 3},
U8Slice: []uint8{1, 2, 3},
S8Array: [3]int8{1, 2, 3},
S8Slice: []int8

元記事を表示

パワーワードが作れる?ランダム単語合成アプリを作ってみた

# はじめに
クリックするだけ!ランダムに2つの単語を「反応」させて、パワーワードを作りましょう!

![rand.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239887/df038918-b418-b274-9be1-20f82fcad614.gif)

モードは

– 形容詞+名詞
– 副詞+動詞
– 名詞+助詞+動詞

の3種類です!

![phrases.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239887/90a32f70-1533-99a7-3fec-3f38f772eb53.gif)

# ソースコード

[GitHub – Syuparn/LiteralReaction: ランダムに単語を「反応」させて、パワーワードを作ろう](https://github.com/Syuparn/LiteralReaction)

(DockerやVue.jsをはじめて使ったので、汚いところもあると思います…ツ

元記事を表示

Docker + VSCodeでGoの環境構築(ホットリロード対応)

## はじめに

個人開発で最近Go言語を使う機会が増えてきました。
Go言語で開発するにあたり私が感じたことは、

– Dockerで動かしたい
– ホットリロード機能が欲しい
– 開発用・本番用でコンテナを分けたい
– 開発時は、VSCode上でコンテナ内とリモート接続して作業したい

色々な方々のDocker環境を参考にDockerでGo環境を作りました。
よろしければ参考にしてください。

## ホスト環境
– Docker: ver.19.03.8
– docker-compose: ver.1.25.4
– VSCode: ver.1.43.0

## ホットリロード
Go言語でホットリロードをする際、調べていたら、

– fresh
– realize

があるのを知りました。
しかし、筆者は**realize** の方はエラー(`error: returned a non-zero code: 1`)が発生して`go get` ができませんでした。

一度コンテナを立ち上げて、コンテナ内で`go get` したらうまく行くのですが解決出来ませんでした…

ですので

元記事を表示

【Go】MySQLのTimestamp型カラム(日本時間が入ってる)をtime.TimeにするとUTCになってしまうのを対応する

こんにちは:smiley:

MySQLのTimestamp型カラムに`2020-03-12 15:00:00`(日本のおやつの時間!)が入っていて、それをGo言語のコードで`time.Time`型として取ってくると`”2020-03-12 15:00:00 +0000 UTC”`になってしまう。

あるとおもいます。

それを期待通りの値に直す小ネタです。

“`例.go

tempTime := dbResults[0].CreatedAt
location := time.FixedZone(“JST”, 9*60*60)
tempTime = tempTime.In(location).Add(-9*time.Hour)
log.Print(tempTime)
“`

* 強引に`JST`に変換します。
* そのとき勝手に9時間足されてしまうので、自前で引き直します。

“`bash
2020/03/16 19:44:57 2020-03-12 15:00:00 +0900 JST
“`

やったぜ。

元記事を表示

Go言語でSliceに要素が存在するか調べるには、要素個数を見るだけで良い ( #go : Error: slice index out of range )

“`golang
if len(mySlice) > 3 {
// …
}
“`

[How to check if a slice has a given index in Go? – Stack Overflow](https://stackoverflow.com/questions/27252152/how-to-check-if-a-slice-has-a-given-index-in-go)

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/3036

元記事を表示

Go言語でSliceを要素に持つStructを定義する例 ( #Go )

“`golang
package main

import “fmt”

type Card struct {
Names []string
}

func main() {
card := Card{[]string{“Ace”, “Jack”, “King”}}

fmt.Println(card.Names[0]) // Ace
fmt.Println(card.Names[1]) // Jack
fmt.Println(card.Names[2]) // King
}

“`

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/3034

元記事を表示

Go 言語で declared but not used のエラーを回避したい。未使用変数だが名前はつけておきたい時は? ( #go )

未使用変数を無理やりアンダースコアに代入してエラーを防ぐ。

“`go
package main

func main() {
foo := “bar”

_ = foo
}
“`

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/3033

元記事を表示

Go言語のdelve でブレークポイントを設定してデバッグ実行する ( #go / dlv cli / dlv debug / set break point and debug with single go lang file )

# ファイル

こんなファイルがある場合

“`go
package main

import (
“fmt”
)

func main() {
fmt.Println(“A”)
fmt.Println(“B”)
fmt.Println(“C”)
fmt.Println(“D”)
fmt.Println(“E”)

foo()
}

func foo() {
value := “FOO”
fmt.Println(value)
}
“`

# delveの実行

go run みたいにファイル名を指定して実行する

“`
dlv debug go/dlv/main.go
“`

# ブレークポイントの指定

ファイル名+行数指定で3つのブレークポイントを指定してみる

例: `break main.go:9`

“`
(dlv) break main.go:8
Breakpoint 1 set at 0x10c23af for main.main() ./go/dlv/main.go:8
(dlv) break main.go:10
Breakpoint 2

元記事を表示

フロント・バックエンドサービスをコンテナ化してもGitコミット時にLefthookでテストやLint実行

### TL;DR
– フロント・バックエンドサービスをそれぞれコンテナ化、docker-composeで全てのコンテナを管理する
– monorepoで管理した際に1リポジトリとなるので気軽にGit Hookの処理ができない
– Lefthookを導入してpre-commit時にすべてのコンテナに対してLintツールを動作させるようにした

### サンプルコード
https://github.com/MegaBlackLabel/lefthook-docker-node-go-dev-sample

### 1リポジトリで開発環境を管理したい
渋川さんの記事

マイクロサービスほどじゃないけどウェブサービスを分割開発したい人向けDocker設定を集めるスレ
https://qiita.com/shibukawa/items/fd49f98736045789ffc3

を読んでフロントエンドとAPIがごっちゃになっている開発環境ヨクナイ!ってことでサービス単位でコンテナ化してvs codeのリモートコンテナ機能を使って開発環境を再構築をしていたらGitとGItHooksの扱いで躓

元記事を表示

Dockerコンテナ上で動くGinサーバーにアクセスできないエラーの解決法

## 概要
GolangのWebフレームワークである[Gin](https://github.com/gin-gonic/gin)を使ったAPIサーバーを、Dockerコンテナ上にデプロイして動かそうとしたところ、APIにアクセスできずかなり長い時間悩まされました。

結果的には、Ginサーバーのコードの書き方の問題だったことが分かったのですが、解決方法を念のためここにメモしておきます。

ちなみに、このエラーはWindows10及びAWS上のUbuntuサーバー(t2.small)で起こりました(尤も、実行環境はこのエラーの発生にあまり関係ないようでしたが)。
### 状況
Ginを用いたAPIサーバーを立てようとしていました。まだ環境構築の段階なので、コードは以下のようなモックのものになっています。

“`go
package main

import (
“log”
“os”
“github.com/gin-gonic/gin”
)

func main() {
logConfig()

r := gin.Default()
r.GET(“/accounting-a

元記事を表示

Go 言語でトランプのStructを作って、カードを強い順に並び替える ( #go lang sort card Struct )

“`go
package main

import (
“fmt”
“sort”
)

type Card struct {
Strong int
Name string
}

func main() {
cards := []Card{
Card{2, “2”},
Card{3, “3”},
Card{4, “4”},
Card{5, “5”},
Card{6, “6”},
Card{7, “7”},
Card{8, “8”},
Card{9, “9”},
Card{10, “10”},
Card{11, “J”},
Card{12, “Q”},
Card{13, “K”},
Card{14, “A”},
}

sort.SliceStable(cards, func(i, j int) bool {
return cards[i].Strong > cards[j].Strong
})

fmt.Println(cards)
}

// [{14 A} {13 K} {12 Q} {11 J} {10

元記事を表示

#Go 言語でシャッフルした52枚のトランプを1枚ずつ配るサンプル ( Go lang deal shuffle playing cards example )

“`golang
package main

import (
“fmt”
“math/rand”
“time”
)

func main() {
cards := generateCards()

shuffleCards(cards)

yourCards := []string{}

for _, card := range cards {
yourCards = append(yourCards, card)
fmt.Println(“Your cards are …”)
fmt.Println(yourCards)
}
}

func generateCards() []string {
cardSeeds := []string{“2”, “3”, “4”, “5”, “6”, “7”, “8”, “9”, “10”, “J”, “Q”, “K”, “A”}
cards := []string{}

for i := 0; i < 4; i++ { cards = append(cards, cardSeeds...) } r

元記事を表示

Go 言語で “declared but not used” のエラーを無効にするには 未使用変数をアンダースコアだけにすれば良いじゃない ( #go lang ignore ))

“`go
package main

import (
“fmt”
)

func main() {
cards := []string{“A”, “K”, “Q”, “J”}

for _, card := range cards {
fmt.Println(card)
}

// i declared but not used
// for i, card := range cards {
// fmt.Println(card)
// }

}

“`

`_i` とかじゃなくアンダースコアだけ `_` にすると良さげ

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/3029

元記事を表示

Go 言語で無限ループしながら コンソールのユーザー入力を待ち受ける ( #Go wait user input in console with infinite loop )

“`go

package main

import (
“bufio”
“fmt”
“os”
)

func main() {
for {
fmt.Println(“Enter some words!”)
input := bufio.NewScanner(os.Stdin)
input.Scan()
fmt.Println(“input is ” + input.Text())
}
}

// Enter some words!
// A
// input is A
// Enter some words!
// B
// input is B
// Enter some words!
// C
// input is C
// Enter some words!

“`

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/3028

元記事を表示

go.modってどこにおくのがいいのだろう

#go.modってどこにおくのがいいのか

先日一からgoでサービスを作っていたのですが、go.modの置き場で迷ってしまい少し時間を無駄遣いした時に、意外と日本語の情報がなかったので残そうと思います。

#結論:ルートディレクトリに置く

 結論からいうと、プロジェクトのルートディレクトリにおくのが正解でした。
go modはもともと業務でも使っていたのである程度知識はあると思っていたのですが、いざ自分で初めから作るとなるとどこで `go mod init` するんだ?ってなってしまいました。勉強不足です。色々とググってみたのですが、あまりgo.modをおく場所に関する情報はなくて、自分で色々いじってみてなんとか解決しました。
 解決した後に1次ソースには当たっていなかったので(まず当たれという話ですが、、)1次ソースをみてみるとそう行った記述がありました。

“`
A module is a collection of Go packages stored in a file tree with a go.mod file at its root.
“`

ざっくり訳すと

元記事を表示

OTHERカテゴリの最新記事