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

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

【Go】sqlxでBulk Insert

## 概要

以下のようなテーブルがあるとします。

“`
user
– id
– name
“`

userテーブルに対して、以下のように複数のValueを一度にinsertをしたい。

“`sql
INSERT INTO user (name)
VALUES (‘tom’),(‘james’),(‘piyo’),(‘alex’),(‘josh’);
“`

上記をsqlxで実現する方法

## 実装

NamedExecを使って、以下のように実装する

“`go

import (
“database/sql”
“fmt”

_ “github.com/lib/pq”
“github.com/jmoiron/sqlx”
)

type User struct {
ID int32 `db:”id”`
Name string `db:”name”`
}

func main() {
db, _ := sql.Open(“postgres”,”user=postgres password=pw dbname=postgres sslmode=d

元記事を表示

身に覚えのない”invalid character ‘ã’ looking for beginning of value”の原因

# TL;DR
`json.Unmarshal`で

“`
invalid character ‘ã’ looking for beginning of value
“`

というエラーが出た時は、JSON文字列に全角スペースが紛れている可能性大!!

“`json:スペースが全角になっている
{“name”: ”Taro”}
“`

# 背景
APIサーバ実装中に上記のエラー発生。「`a`がなんで不正やねん」と思いがっつりハマったので備忘録として書きました。
(※実際にはチルダのついた`ã`です)

## 環境

– Go 1.14

# サンプルコード

“`go:main.go
package main

import (
“encoding/json”
“fmt”
)

type Person struct {
Name string `json:”name”`
}

func main() {
// コロンの直後に全角が!
jsonStr := `{“name”: ”Taro”}`
person := Person{}
err := json.U

元記事を表示

Goでsliceをpoolするときの罠

# sync.Poolのすすめ

Goの高速化テクニックの一つに`sync.Pool`を使うというものがあります. bufferとして使う領域を毎回allocせずに使いまわすことで, allocとGCにかかる時間を省くのが狙いです.

poolが効果を発揮するのは可変長データをgo routineで並列処理する場合です.
予め適切なbuffer sizeがわからない場合でも, 足りなくなったら都度交換することで, 十分な時間が経てばpool内は大きなbufferだけが残る事になり, 償却的にzero allocにできます.

“`go
// pool初期化
pool := sync.Pool {
New: func() interface{} {
return &Buffer{}
},
}

//…

// 使うとき
buf := pool.Get().(*Buffer)
buf.Reset()
if !buf.EnoughSize() {
buf = NewLargerBuffer() //bufferが足りないので大きいbufferに取り替える
}

元記事を表示

【超簡単】GoのインストールとVSCode設定方法

# インストール
## インストール
### Mac
以下のコマンドを実行します。

“`
$ brew install go
“`

### Windows
以下のページより、Windows用のインストーラー(.msiファイル)をダウンロードして実行します。
[Download and install](https://golang.org/doc/install)

![go-download.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113263/c7085dc8-072f-7ef1-f84e-e4ab5e13c0ed.png)

インストーラーに表示される手順に従って進めます。
インストール先フォルダは、特段の理由がなければデフォルトのまま変更しない方がいいです。

## インストール後確認
インストール後、コマンドラインで以下を実行して動作すればOK。

“`
$ go version
go version go1.15.1 windows/amd64
“`

## 環境変数の設定

元記事を表示

ヒヨコとはじめる、やさしいGo言語の並行処理

こんばんは、ねじねじおです。

Goの並行処理をヒヨコと一緒に学んでいきます。

今回のポイントは3つだけです。
1. goroutine で並行処理を実行する
2. WaitGroup で処理の終了を待つ
3. channel でキューをつくる

ここに10匹の泣いているヒヨコを慰めるプログラムを用意しました。このプログラムでは一人のヒヨコシッターが一匹ずつ順番にヒヨコを慰めます。一匹のヒヨコが泣き止むには1秒かかります。

“`go
// 泣いているヒヨコを1秒で慰める関数
func comfort(piyo string) string {
time.Sleep(1 * time.Second)
return strings.Replace(piyo, “(> e <)", "(・e・)ワーイ", 1) } func main() { start := time.Now() for i := 1; i <= 10; i++ { // 泣いてるヒヨコ piyo := fmt.Sprintf("[%v](> e <)", i) fmt.Println(piy

元記事を表示

GORMでの主要メソッドによるゼロ値の取り扱いについて

## 前提

gorm v2.0 で確認しています。

“`go
“gorm.io/gorm”
“`

User 構造体は以下のものを使用しています。

“`go
type User struct {
ID int `gorm:”column:id;primary_key:yes”`
Email string `gorm:”column:email”`
Age int `gorm:”column:age”`
IsAdmin bool `gorm:”column:is_admin”`
CreatedAt time.Time `gorm:”column:created_at”`
UpdatedAt time.Time `gorm:”column:updated_at”`
}
“`

## Where

構造体を利用した書き方ですとフィールドがポインタ型でない場合ゼロ値(””, 0, false)は検索できないため、事故を防ぐならベタで書くのが一番安全かと思います。

ただ、DB の構造体のフィ

元記事を表示

goでクロスコンパイル

環境変数に指定すると良いようだ。

## 対応OS

“`shell:sample
$ go tool dist list
aix/ppc64
android/386
android/amd64
android/arm
android/arm64
darwin/amd64
darwin/arm64
dragonfly/amd64
freebsd/386
freebsd/amd64
freebsd/arm
freebsd/arm64
illumos/amd64
js/wasm
linux/386
linux/amd64
linux/arm
linux/arm64
linux/mips
linux/mips64
linux/mips64le
linux/mipsle
linux/ppc64
linux/ppc64le
linux/riscv64
linux/s390x
netbsd/386
netbsd/amd64
netbsd/arm
netbsd/arm64
openbsd/386
openbsd/amd64
openbsd/arm
openbsd/arm64
plan9/386
p

元記事を表示

CentOS8にGolang/MariaDBをインストールし、DB接続してSQLを実行する

##概要
Golang学習用備忘録です。
今回以下URLを参考にさせていただきました。

[Go 言語から MariaDB Server を使ってみる](https://www.s-style.co.jp/blog/2019/06/4130/)
[GoでMySQLに接続する](https://qiita.com/taizo/items/54f5f49c6102f86194b8)

##Golangインストール/動作確認

よろしければ、以下を参考にしてください。
[CentOS8にGolangをインストールする](https://qiita.com/tomotomo3/items/38e7fed248278a3295b9)

##MariaDBインストール/GoからMariadbへの接続準備

“`bash:ターミナル
#Mariadbインストール
dnf install -y mariadb mariadb-server

#MariaDBを起動・自動起動設定
systemctl start mariadb
systemctl enable mariadb

#MariaDBのro

元記事を表示

AtCoder Library Practice Contest 参戦記 (Go)

# AtCoder Library Practice Contest 参戦記 (Go)

ACL Contest は 1200 から rated なので rated で出場できるかどうしようと考えつつ、AtCoder Library Practice Contest を解いてみるテスト.

## [PRACTICE2A – Disjoint Set Union](https://atcoder.jp/contests/practice2/tasks/practice2_a)

ACL に Union Find 入ってないような、見落としてる??? あ、DSU = Disjoint Set Union = Union Find か.

“`go
package main

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

func find(parent []int, i int) int {
if parent[i] < 0 { return i } parent[i] = find(parent, parent[i]) retur

元記事を表示

Go言語で kintone REST API から データを取得する

Go言語からkintone REST API を叩いて、kintoneアプリのフィールド情報を取得するサンプルです。

APIは下記参照
https://developer.cybozu.io/hc/ja/articles/204783170#anchor_getform_fields

# 環境

* go version go1.14.2 darwin/amd64
* Mac

# 設定ファイル

GoDotEnvライブラリを利用。
.envファイルにkintone接続情報を設定します。
https://github.com/joho/godotenv

# サンプルコード

“`go
package main

import (
“bytes”
“encoding/json”
“fmt”
“io”
“io/ioutil”
“log”
“net/http”
“os”

“github.com/joho/godotenv”
)

func main() {
err := godotenv.Load()
if err != nil {
log.Fatal(“

元記事を表示

Golang チュートリアル その1

##概要
「処理が速い」「並行処理」が得意ということから、
今後大規模webサービスなどで重宝されると思いましたので、
学習していきたいと思います。

##参考サイト
以下を実施してみました。

[Welcome to a tour of Go](https://go-tour-jp.appspot.com/list)

##環境
GoogleChrome
※ブラウザ操作だけで学習できるため、エディタを用意する必要がありません。
※CentOS8へのGoインストール手順です。よろしければ、ご活用ください。
[CentOS8へのGo言語インストール手順](https://qiita.com/tomotomo3/items/38e7fed248278a3295b9)

##基本操作

[Welcome!](https://go-tour-jp.appspot.com/welcome/1)

Hello Worldの実行手順です。

##基本的な書き方

[Packages, variables, and functions.](https://go-tour-jp.appspot.com/

元記事を表示

vim-goimportsが効かない時の対処法。

# はじめに

Vimに [vim-goimports](https://github.com/mattn/vim-goimports) を追加してみたものの効かなかったので対処法を記しておきます。

# 対処法
なぜ効かなかったかといいますと、~/.zshrc に$GOBINを通していなかったからです。
ということで、~/.zshrcに以下を書くだけです。

“`zsh:.zshrc
export GOBIN=”$GOPATH/bin”
“`

元記事を表示

GoでVercel Serverless Functions

[githubリポジトリ](https://github.com/mugi111/go-vercel-functions)

ホスティングサービスをNetlifyからVercelに乗り換えたついでにServerless Functionsが気になったので試してみました。

## Vercel
Next.jsの運営元であるVercel(元Zeit)のWebアプリケーションホスティングサービスです。ちょうどNetlifyとかと同じポジションですね。

## 前準備
### アカウント作成
Vercelのトップページの右上にあるSignUpボタンからGithub, GitLab, BitBucketのアカウントを使用してアカウント作成をします。
![vercelsignup.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256522/d76931ef-f9f9-9455-f5f9-390b04ce8602.png)

### Vercel CLI
npmパッケージとして提供されているVercel CLIをイン

元記事を表示

CentOS8にGolangをインストールする

##概要
Golang学習用備忘録です。
今回以下URLを参考にさせていただきました。

##VMwareにCentOS8を構築
以下に記載しておりますので、
よろしければ、ご覧ください。

[Windows10にVMwareで仮想サーバを構築し、Dockerを使ってみる](https://qiita.com/tomotomo3/items/78de27556ed3ac0b27a3)

##Golangインストール/動作確認

– Goインストール

“`bash:ターミナル

#Golangインストール
dnf install -y epel-release
dnf install -y golang

#Golangバージョン確認
go version

→「go version go1.13.4」と表示される
“`

– 動作確認(Goファイル作成)

“`bash:ターミナル

#動作確認用Goファイル作成
vim hello.go

#以下を追記
package main

import “fmt”

func main(){
fmt.Println

元記事を表示

【GCP】Cloud BuildでCI/CDパイプラインを構築する。

## はじめに

[Cloud Build](https://cloud.google.com/cloud-build/docs?hl=ja)はGCP上でCI/CDを行うためのサービスです。
特にコンテナを扱ったソリューションと相性がよく、
テストやビルドはGCP上にプロビジョニングされたコンテナ内で行われ、
Cloud FunctionsやCloud Runといった様々なコンピューティングサービス上にデプロイすることができます。

本記事では、

– ソースコードの管理:[Cloud Source Repositories](https://cloud.google.com/source-repositories/docs?hl=ja)
– テスト及びビルド:[Cloud Build](https://cloud.google.com/cloud-build/docs?hl=ja)
– コンテナレジストリ:[Container Registry](https://cloud.google.com/container-registry/docs?hl=ja)
– デプロイ:[Cloud

元記事を表示

[自分用メモ] はじめてのGoogle Cloud Functions(Go言語編)

# 注意
ここに書かれていることは、すべて下記の公式ドキュメントに書かれているものです。このブログは、あくまで自分用メモになります。

公式ドキュメント → https://cloud.google.com/functions/docs

# Google Cloud FunctionsとGo
Goが使えるようになったのは2019年1月([参考記事](https://cloud.google.com/blog/products/application-development/cloud-functions-go-1-11-is-now-a-supported-language))。

2020年9月現在、使えるGoのバージョンは1.11と1.13のみ([参考記事](https://cloud.google.com/functions/docs/concepts/go-runtime))。

# 関数を作る
ローカルの開発環境に、適当に次のような関数を作る。

“`go:hello.go
package hello

import (
“fmt”
“net/http”
)

fun

元記事を表示

Goプロジェクトのはじめかたとおすすめライブラリ8.5選。ひな形にも使えるサンプルもあるよ。

(記事を読んで参考になったなとかストックしとこ、って思って頂けたらぜひLGTMもして頂けると喜びます?)

# はじめに
最近イケイケなGo!
でもベターなGoプロジェクトのはじめかたっていまいち調べてもわからないですよね。
自分は最初色々迷いました。。

まずパッケージ管理ツール。
godepだったりGo Modulesだったり、少し情報がとっちらかっている印象です。

後はどのディレクトリにプロジェクトを配置した方がいいのかもわかりづらい。
importの仕方も相対と絶対のどちらがいいのか迷う。

というわけで以下の4点に絞って解説していきたいと思います!

– パッケージ管理ツール
– プロジェクトの配置場所
– 自作パッケージのimportの仕方
– おすすめライブラリ

この記事を読めば正しくGoプロジェクトが作成できます!(たぶん)

【追記】
インストール方法とVSCodeの設定に関しても簡潔にまとめたので、良かったら参考にしてください。
[【超簡単】GoのインストールとVSCode設定方法](https://qiita.com/yagi_eng/items/69cb75

元記事を表示

Goでテストカバレッジを測定する

# はじめに
Goは標準の機能としてテストカバレッジをだすことができます。
単純にテストのカバー率を算出するものから具体的にどこの部分のテストが足りないかを示してくれる機能もあるので今回はそれらを簡単にまとめたいと思います。

# シンプルにテストカバレッジを測定する

“`shell
$ go test -cover ./…
? app_name/api [no test files]
? app_name/api/config [no test files]
ok app_name/api/handlers 0.421s coverage: 100.0% of statements
? app_name/api/responses [no test files]
“`

シンプルにテストカバレッジを測定するときは`go test -cover`とすることでこのようにテストカバー率を出してくれます

# 具体的にどこがテストできてないかを表示する

“`shell
# cover.outというファイルテス

元記事を表示

goのテストの書き方【備忘録】

# テスト実行
“`
go test ./… -v
“`

## テストの流れ
各レイヤーのテストは基本的に下記の流れです。

– `mock`を作成して
– テスト対象のレシーバにセットして
– テスト対象のメソッドを呼び出して
– 結果を検証する

#### 例
“`
t.Run(“error”, func(t *testing.T) {
ctrl := gomock.NewController(t)
GroupUsecase := mocks.NewMockIGroup(ctrl) -> mockを作る
GroupUsecase.EXPECT().GetTopList().Return(nil, fmt.Errorf(“test”)) -> mockの挙動を決定
h := &Group{
GroupUsecase: GroupUsecase, -> セットして
}
e := echo.New()
req := httptest.NewRequest(http.MethodPost, “/”, nil)
rec := httpte

元記事を表示

AWS Fargate, Github Actionsを利用したアプリケーションの開発から配布まで

# 入る前に
本記事で話そうとしてる主な内容は「こんなことを利用したら、こんなに簡単アプリの開発からDeployまでの環境が作れるんだ!」みたいの感じを紹介する記事であります。AWS、Dockerなどの技術の細かい設定や使い方、Goのアプリについて深い話は書いてないのでこの点認識してください。
各細かい内容については今後順次に書いて行く予定であります。

# 登場人物
– AWS IAM
– AWS ECR
– AWS ECS
– AWS ALB, EC2
– AWS Parameter Store
– Github Actions
– Docker
– Go

本記事では上記の内容似ていての設定方法などを細かくは案内しません。
躯体的な使い方についてはDocumentや、Hands Onなどを参考してください。
もし、Github Actionsについてお気になる方は自分が書いた[この記事](https://qiita.com/KIMSeongJoo/items/286097f5a8c9cf1520e5)を参考してください。

本日作業結果の予想図
![image.png](http

元記事を表示

OTHERカテゴリの最新記事