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

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

A Tour of Go メモ ~Flow control statements: for, if, else, switch and defer~

## はじめに

Go の勉強のため、[A Tour of Go](https://go-tour-jp.appspot.com/flowcontrol/1)に取り組んでいる
今回は`Flow control statements: for, if, else, switch and defer`章について、学んだことを記していく

## 使えそうなスニペット

※筆者は VSCode を使用

### `for`

初期値、条件式、後処理、スコープ内部の順にカーソルが移動する

“`go
for i := 0; i < count; i++ { } ``` ### `if` 条件式、スコープ内部にカーソルが移動する `el` -> `else { }` で else ブロックを追加できる

“`go
if condition {

}
“`

### `ei`

一発でも作れる

“`go
if condition {

} else {

}
“`

### `switch`

条件式、case、スコープ内部にカーソルが移動する
`cs` -> `case cond

元記事を表示

SQLでみるgormのAssociation

この記事は[東京学芸大学 櫨山研究室 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/hazelab)の7日目の記事になります.

初めての記事投稿で分かりづらいかもしれませんが, 暖かい目で見てほしいです.
変なところはコメントください!

#はじめに

Goには素晴らしきORM(おーあーるまっぱー, SQLを知らなくてもDBとのやりとりができる!ってやつ)であるGORMが存在していて, 大変お世話になっています.

Association周りが全然わかっていないので, Debug()モードで発行されるSQLを確認していきます.

#概要
[gorm公式のAssociation](https://gorm.io/ja_JP/docs/associations.html)に記述されているメソッドたちに, Debug()メソッドを用いて発行されるSQL文を確認していく.
今回は1対多のケースのみでやっています.

##用意したモデル, テーブル

####モデル

“`go
package mod

元記事を表示

Dockerを使ってPostgreSQL+Goの開発環境を作ってみた

# はじめに
GoからPostgreSQLに接続する部分がよくわかってなかったので、自分でDocker環境作って試してみた。

# 参考
ここを大いに参考にさせてもらった。
[Go PostgreSQLにつないでみる – Qiita](https://qiita.com/hiro9/items/e6e41ec822a7077c3568)
[Docker で作る postgres 環境 | Crudzoo](https://crudzoo.com/blog/docker-postgres)

# Docker
ポイントはnetworks部分を同じにしてるところ。

## ネットワークの準備

“`
# docker network create postgres-test-network
# docker network ls
NETWORK ID NAME DRIVER SCOPE
xxxxxxxxxxxx postgres-test-network bridge

元記事を表示

【Go】Channelを使ってSingle Flightなキャッシュを実装する

[昨年のAdvent Calendar](https://qiita.com/hogedigo/items/15af273176599307a2b2)に引き続きChannelネタです。

# 前置き

データベースアクセスを削減する為に取得したデータをローカルにキャッシュする、みたいなことをよくやります。

シンプルに書くと↓みたいなカンジでしょうか。

“`Go
var cache sync.Map

func get(key string) (v interface{}, err error) {
v, ok := cache.Load(key)
if !ok {
v, err = getFromDB(key)
if err != nil {
return nil, err
}
cache.Store(key, v)
}
return v, nil
}
“`

キャッシュが存在しなければDBに取得しに行きます。

さて、上記コード、一つ問題があります。
キャッシュされていない状態で同じkeyでcache.Load→cache.Storeの間にアクセ

元記事を表示

GolangでのORM使ったDBアクセスロジックのtestcode事例(Functional Option Patternを使ったテストデータ準備関数を用意)

# お題
表題の通り。※使用するORMは[SQL Boiler](https://github.com/volatiletech/sqlboiler)だけど、他のORM(例えば[Gorm](https://github.com/go-gorm/gorm))でも適用方法は同じだと思う。

指定のテーブルから複数レコードを取得するような関数があったとして、そのtestcodeの事例。
例えば以下のようなコードでレコードを登録しておく。

“`go
func TestCustomers(t *testing.T) {
〜〜省略〜〜
c := repository.Customer{
ID: 1,
FirstName: “Satoru”,
LastName: “Sato”,
Age: 30,
Nickname: null.StringFrom(“toru”),
Memo: null.StringFrom(“メモ”),
}
if err := c.Insert(ctx, db, boil.Infer()); err !=

元記事を表示

Go/EchoでProtocolBuffersを使ったE2Eテストを書く

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

業務でGo * ProtocolBuffersなプロダクトのE2Eテストを書くことがあっため、簡単に書かせていただきます。

## はじめに

テストで利用した構成は以下の通りです。

“`
・プログラミング言語:Golang 1.13.5
・Webフレームワーク:echo 
・DB:MySQL:
“`

サンプルコード全体は[こちら](https://github.com/DAdDY0055/go_protocol_buffers_e2e_test)にご用意しましたのでをこちらをご参照ください。

今回、Webフレームワークとして、`echo`を利用していますが、
おそらく他のWebフレームワークを利用した場合でも同様にできるかと思います。

## テスト対象コード
今回はごく簡単な構成としまして、`echo`でサーバーを起動して、アクセスするとレスポンスを返すようにしました。

“`go:main.go

元記事を表示

Goで標準入力がターミナルかどうかを判定する(Goで標準入力がファイルかどうかを判定する)

## 概要
Vim を起動する際に以下のように標準入力をファイルにすると警告が出ます。

“`shell
$ vim < test.txt Vim: Warning: Input is not from a terminal ... ... ``` テキストエディタやコマンドラインツールを作っていると標準入力がファイルかターミナルか知りたい場合があります。 今回はGoにおいてそれをどうやって実現するか書きます。 ## 実践 まずは完成形から。 コードの仕様は以下の通りです。 1. 標準入力がターミナルの場合、固定文と引数を出力する。 2. 標準入力がファイルの場合、固定文とファイルの中身を出力する。 ``` 例) $ go run main.go hoge fuga from terminal [hoge fuga] $ go run main.go < test.txt from not terminal 111 222 333 ``` ```golang package main import ( "fmt" "io/ioutil" "os" "syscall"

元記事を表示

Go言語についてと開発環境

# はじめに
Go言語は、Googleが開発したオープンソースのプログラミング言語であり、シンプルで信頼性の高い効率的なソフトウェアを簡単に構築できます。Go言語は、コンパイル言語の中でも特にエラーを検出しやすく、多人数での開発で起こるような重大なミスが起きにくくなっています。その為、現在では多くのサービスや企業で取り入れられています。

その為、技術レベルで遅れないように今からGo言語を始めると良いと思います。
Go言語についてと開発環境の方法を学んだので、備忘録としてまとめます。

## Go言語とは
![go.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229633/9d061ef5-198e-f660-727d-8d9a1d6e56fd.jpeg)

Go言語は、静的型付け、コンパイル言語、メモリ安全性、ガベージコレクション、構造的型付け、CSPスタイルの並行性などの特徴を持ちます。Go言語のコンパイラ、ツール、およびソースコードは、すべてフリーかつオープンソースです。

**Github**

元記事を表示

VScodeのGo: Generate Interface Stubsでエラーが出る場合の対処法メモ

## 事象

同一ファイルでstructとinterfaceを定義して、structに対してinterfaceのメソッドを実装するために、`Go Generete Interface Stubs`したところエラーになる。

コマンドパレットから`Go Generate Interface Stubs`を実行。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203061/458c2f8d-c693-0811-8d31-a1f4b90f7aa8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203061/895212d4-d1b3-95b0-ee3b-6345178c88c9.png)

この時、VSCodeでエラーが出てしまう

“`
Cannot stub interface: unrecognized interface go generate interface
`

元記事を表示

【Go】構造体について

##構造体の定義
さまざまな型をデータ構造のひとつの型として扱うことができます。Goはオブジェクト指向とは違う、メソッドの機能によって型を便利に扱えるような仕組みに設計されています。

一般的に構造体は予約語**type**で型名を与え、任意のフィールドを定義します。

“`
type 型名 struct { フィールド定義 }
“`

##エイリアスの定義
先であげた予約語typeは、すでに定義されている型をもとに新しい型を定義するための機能です。そのため、下記のようにエイリアスを定義することができます。

“`main.go
type (
Ints [2]int
Strings []string
)

func main() {
i := Ints{5, 10}
s := Strings{“test1”, “test2”}

fmt.Println(i) //[5 10]
fmt.Println(s) //[test1 test2]
}
“`

エイリアスの定義では、同じ型の二つのエイリアスには互換性がないので注意が必要です。

元記事を表示

A Tour of Go メモ ~Packages, variables, and functions~

## はじめに

Go の勉強のため、[A Tour of Go](https://go-tour-jp.appspot.com/basics/1)に取り組んでいる
今回は`Packages, variables, and functions`章について、学んだことを記していく

## 使えそうなスニペット

※筆者は VSCode を使用

– スニペットは最初の一文字を入力するだけで予測変換に出てくるので、全部を入力する必要はない
– また、文字を飛ばしても良い
– 以下の例でいうと、`pm`と入力しても`pkgm`が予測変換に出る

`pkgm` -> `package main`
`fm` -> `func main(){ }`
`func` -> `func (){ }`
`fp` -> `fmt.Println(“”)`
`ff` -> `fmt.Printf(“”, var)`
`iferr` -> `if err != nil { return nil, err}`

## ページごとの補足

`A Tour of Go`を進めていく中で、疑問に思ったことをまとめた

元記事を表示

VSCode, DockerでHelloWorldを10言語やってみる

# はじめに
– VSCodeのremote-containersが開発環境構築時にすごく便利だと感じたので、10のプログラミング言語でHelloWorldやってみます
– Rust, Go, Python, C++, C#, Ruby, TypeScript, Java, Dart, プロデル!
– なるべくシンプルに、汎用的に
– まだ全てにおいてはデバッグ実行できるところまで記述していません(手抜き。。)

# 準備
– 前提:VSCode 1.51.1
– 前提:Windows10 home(Insider Previewバージョン)の環境で試していますが、Macでもほぼ変わらないと思います
– VSCodeをインストールする(方法は割愛)
– Extension:Remote-Containerをインストールする
– Docker環境を用意する
– Windowsなら、Docker Desktop for Windowsを使えるようにします。
– 最近ではWindows10 homeでもDocker for Windowsが使えます、I

元記事を表示

LeetCodeに毎日挑戦してみた 69. Sqrt(x)(Python、Go)

## はじめに

無料英単語サイト[E-tan](https://your-e-tan.com/)を運営中の@ishishowです。

プログラマとしての能力を上げるために毎日leetcodeに取り組み、自分なりの解き方を挙げていきたいと思います。

#### Leetcodeとは

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

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

#### 17問目(問題69)

#### 69. Sqrt(x)

#### 問題内容

> Given a non-negative integer `x`, compute and return *the square root of* `x`.
>
> Since the return type is an

元記事を表示

AWS Lambdaをローカル環境に用意する(AWS-SAMのインストール)

# 前書き
lambdaを実装する必要があり、ローカルでプログラムのテストができないか調べてたところ、AWS SAMを用いて検証するようなので設定方法を書いていきます。

###前提条件
Dockerがインストールが必要です。
+今回lamdaでgo言語を試すのでgoのインストール必要です。

###検証環境
>OS:Windows 10 Pro 64bit ver 1909
>言語環境:go version go1.14.1

#SAMで構築する検証環境について
AWS-SAMをインストールすることで下記のような環境をローカルに作成できます。

![SAM.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436464/7759e3a7-7ba9-a623-6c4b-39d852144687.jpeg)

ローカルに仮想のAPI GaweWayを作りそこからLambda関数を実行する形です。
実行時にjsonを渡すことでevent発火時の動作も検証できます。

lambda関数の実行時にdockerコ

元記事を表示

golangci-lintを使いこなしたい。

## 初めに
この記事はWanoグループ Advent Calendar 2020 の6日目の記事になります。

## golangci-lintって?

https://github.com/golangci/golangci-lint

Go言語には非常に多くのコード解析ツールがあります。例えば gofmt や goimports, govet などはgolangを書いている人なら知ってる人も多いと思います。
golangci-lintはGo言語のコード解析ツールを一つに集約したようなすごいやつです。

コードレビューをする時にまずこれを実行すると、機械的にまず直しておいたほうが良さそうな部分がわかって治安がよくなるかもしれないということですね。
そして解析結果はXMLだったりで出力することが出来るのでそこからさらにプログラムで使うのも簡単です。

インストールの方法などは上記リンクに記述してあるのでカットさせていただきます。

## configファイルを晒してみる
golangci-lintではconfigファイルを用いて
* どの解析ツールを使うか
* 解析ツールの条件(変

元記事を表示

golangでテーブル駆動テスト(テーブルドリブンテスト)を並列実行で書く際の注意点

なぜかテストが正しく動作しないことがあり、調べたら以下が原因でした

https://gist.github.com/posener/92a55c4cd441fc5e5e85f27bca008721

なぜ上記のようなことが起こるかというと、
https://play.golang.org/p/QIjYezj9RzR
を見たら分かる通り、for loopでloop毎に新しく変数を作っているのではなく、同じ変数を使いまわしているからですね

元記事を表示

[初めてのGoアプリ]簡単なタイピングゲームアプリ作ってみた!

## 概要
Goの基礎練習に、初めてアプリ作ってみました!
なお、今までRails中心のアプリしか作ったことない、完全Go初心者です。
Go言語書いたことないけど興味ある駆け出しエンジニアさんに見ていただきたいです!

※内容はProgateのGoコースを参考にしています。

## 成果物(コンソールにて)

“`go
% go run typing.go
[質問1] 次の単語を入力してください: html
html
正解!
[質問2] 次の単語を入力してください: css
ccs
不正解!
[質問3] 次の単語を入力してください: ruby
ruby
不正解!
5.291065秒かかりました
スコア 20

“`
ほんと、このレベルですのでご了承ください…

なお、以下はGoがインストールされている前提です。
インストールされていない方は、私の以前の記事をご覧ください!
10分もあればインストールできますよ!
↓↓
▼Railsしか使ったことない駆け出しエンジニアが、Goの環境構築してみた!▼
[https://qiita.com/matsufuji_tech/items/5

元記事を表示

goでデータの循環参照をチェックする(gonumパッケージ グラフ入門)

「[Applibot Advent Calendar 2020](https://qiita.com/advent-calendar/2020/applibot)」 6日目の記事になります。
前日は @ref3000 さんの[Cloud Firestore でさくっとオンライン対戦ゲームを作ろう](https://qiita.com/ref3000/items/866cb2fab2c6e3605455) という記事でした!

#目次
[1.はじめに](#1-はじめに)
[2.基礎知識](#2-基礎知識)
[3.要件定義](#3-要件定義)
[4.実装](#4-実装)
[5.まとめと感想](#5-まとめと感想)
[6.おわりに](#6-おわりに)

#1. はじめに
管理者が入力するマスターデータに入れ子構造のデータが必要になり、循環参照が発生するデータを入力されるとロジック側が無限ループになってしまうため、それを回避するために検証機能を追加した話になります。
[gonum](https://github.com/gonum/gonum)パッケージのグラフとライブラリを利用することで簡単

元記事を表示

GKEでのDBマイグレーション自動化手法

[QualiArts Advent Calendar 2020](https://qiita.com/advent-calendar/2020/qualiarts)、6日目担当の8kkaです。
今回はGKE環境でのDBマイグレーション自動化手法について書こうと思います。

# 1. 前提の設計など
今回は以下の構成で組まれているシステムに対して、自動化手法を組み込んでいきます。

* アプリケーションはGoで記述されている
* GKE上で稼働させている
* CDはArgoCDを利用している
* DBはCloudSQLを利用している

紹介しているコードやアーキテクチャは、実際に構築してみたものを記事用に編集して掲載しています。

ライブラリやツールの紹介をしつつ記述していますが、アーキテクチャの全体像だけ知りたい方は`4. アーキテクチャと処理フロー`の画像だけ参照すると何となくイメージは掴めると思います。

# 2. マイグレーション実行用のコンテナイメージ作成
マイグレーションの処理には、[golang-migrate](https://github.com/golang-migr

元記事を表示

AtCoder Regular Contest 110のメモ

# 前置き

Atcoderをやってみたので、自分用のメモです。
あとから加筆・修正する予定です。

# 問題

https://atcoder.jp/contests/arc110

# A

“`Q_A.go
package main

import (
“fmt”
)

func gcd(a, b int64) int64 {
if b == 0 {
return a
}
return gcd(b, a % b)
}

func lcm(a int64, b int64) int64{
return a * b / gcd(a,b)
}

func main() {
var N int64
fmt.Scanf(“%d”, &N)

var ans int64 = 1
var i int64
for i=2; i<=N; i++{ ans = lcm(ans, i) } fmt.Printf("%d\n", ans+1) } ``` # B ```Q_B.go packa

元記事を表示

OTHERカテゴリの最新記事