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

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

GoのBenchmarkに出てくる関数名の後ろの数字

Goのベンチマークをするときに出てくる
関数名の後ろの数値ってなんだっけとど忘れしたのでメモしておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54313/2f10a318-b5d7-2cf1-3116-f2ab5be38cd1.png)

関数名-4 <-この"-4"の事ですね。 これはベンチマークに使ったCPU数です。 なので ``` go test -bench . -cpu 2 ``` のようにCPU数を指定すると ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54313/61b32db7-e8ba-b004-31b0-4882c21f2fa2.png) ちゃんと変わります。 普段からGo使ってる人にとっては当たり前の事かもしれませんが 使ってないと知らなかったり忘れたりするので。

元記事を表示

Go言語のチュートリアル A Tour of Go のチートシート その1 – Basics

Go言語入門の定番、チュートリアル [A Tour of Go](https://go-tour-jp.appspot.com/list) をやったので、復習を兼ねて内容をまとめておきます。

また、チュートリアル中、何度も前のページに戻って確認しなければならなかったので、これからやろうという方にはチートシートとしてお使いいただけます。

チュートリアルをやる代わりに、さらっと眺める用途にもどうぞ。

# Packages, variables and functions

## パッケージとインポート・エクスポート

– プログラムはmainパッケージから実行される。
– importでパッケージを読み込む。
– 大文字で始まる名前はエクスポートされる。

“`go
// ファイルの冒頭にpackage名を宣言する
package main

// パッケージのインポートをグループ化できる
// factored import statementと呼ばれる
import (
“fmt”
“math”
)

func main() {
// Printf /

元記事を表示

[Go] Cobraをgo getでインストールしようとするとcommand not foundになる問題の解決

## 問題

cobraをインストールしてCLIを書いてみようと思って、cobra公式のインストールコマンドを実行した。

“`
go get -u github.com/spf13/cobra/cobra
“`

その後cobraがインストールされたか確認しようとしたら`command not found`と表示された。

“`
cobra –help
command not found
“`

ちゃんと`$GOROOT`や`$GOPATH`、`$GO111MODULE`などの環境変数の設定もしているので謎だった。

## 環境

* MacOS Catalina 10.15.6
* go version go1.15 darwin/amd64
* goenv 2.0.0beta11

## 解決策

よく見るとインストールコマンドを実行した時のメッセージは以下のようになっていた。

“`
go: github.com/spf13/cobra/cobra upgrade => v0.0.0-20200909172742-8a63648dd905
go get git

元記事を表示

Goでスライスを逆順にする

ドキュメントをみたら、`sort.Reverse()`という関数があった。お、これはPythonの順番を逆転する例のやつかな、と思って使ってみた。

“`go
a: l = []string{“a”, “b”, “c”} // lはLess, Len, Swapが定義されたインタフェース
sort.Reverse(a)
log.Println(a)
// “a”, “b”, “c”
// 変わってない!
“`

え、何も仕事してないじゃん、と思ってコードを見てみたら・・・

つまり、`sort.Interface`を実装してからソートしていたもうはるか思い出せないぐらい過去の時代のためのコードで、単に`Less()`メソッドのtrue/falseを逆転させた別のインタフェースを作っているだけで、ここからソートしてあげないとソートはされない

“`go
a: l = []string{“a”, “b”, “c”}
sort.Sort(sort.Reverse(a))
log.Println(a)
// “c”, “b”, “a”
// 変わった!
“`

まあ、今時なら`sor

元記事を表示

構造体のインスタンス作成時に&を付ける必要がある時

Goでhttp.Clientを使う際に

“`
transport := &http.Transport{}
“`

なんで&付けないとダメなのだろうと調べてみた。
付けないと

“`
client := http.Client{
Transport: transport, // ここでエラーが出る
}
“`

> cannot use transport (type http.Transport) as type http.RoundTripper in field > value:
> http.Transport does not implement http.RoundTripper (RoundTrip method
> has pointer receiver)

怒られる。

> RoundTrip method has pointer receiver

interfaceを実装する構造体で、メソッドにポインタレシーバを使うと
構造体を作成する際に、ポインタを取らないとダメらしい。

“`
type Hoge interface {
SetNam

元記事を表示

goreleaserをGithub Actionsで利用するまでのQuick Start

goreleaserは、Goプロジェクトをビルドして、各OS向けの実行可能バイナリやDocker Imageを作成し、GithubのReleaseやDocker Repositoryに配布してくれるツールです。この記事ではGithub Actionsを利用して、goreleaserによるビルドから配布までを自動化するまでの手順を示します。
# 1) goreleaserのインストール

次のURLを参考にgoreleaserをインストールし、`goreleaser`コマンドを利用できる環境にします: https://goreleaser.com/install/

個人的には公式のDockerイメージを使うのが一番楽かと思います。

# 2) .goreleaser.ymlの作成

プロジェクトディレクトリの直下に`goreleaser.yml`を作成します。作成には`goreleaser init`コマンドを利用します。

“`
cd project-directory
goreleaser init
“`

goreleaserのインストールにDockerを利用した場合は、次の

元記事を表示

Go言語で kintoneアプリのフィールド情報をCSV出力するコマンドラインツールを作った話し

Go言語の自習の仕上げに、[yaclik](https://github.com/sy250/yaclik) という小さなコマンドラインツールを作ったのでその紹介です。

kintoneアプリからレコードを取得・登録などを行う、Go言語で書かれたコマンドラインツールに、cli-kintoneがあります。

https://github.com/kintone/cli-kintone

今回試しに作ったのは、kintoneアプリの[フィールド情報](https://developer.cybozu.io/hc/ja/articles/204783170#anchor_getform_fields)をAPIで取得して、CSV形式でターミナルに表示するだけのツールです。
それ以上のことは何も出来ないのですが:sweat_smile:、kintoneアプリのフィールド一覧がドキュメントで必要になった時には使えるかと思います。

出力できる情報は下記の3つだけです。

1. フィールドコード
2. フィールド名称
3. フィールドタイプ

一応テーブル内のフィールドにも対応していますが、その際の

元記事を表示

毎回go.modとmain.goを作るのがめんどくさい

#コマンドで生成すればよかった

###gogen.go
“`
package main

import (
“io/ioutil”
“log”
)

func main() {
if err := ioutil.WriteFile(“go.mod”, []byte(“module sample”), 0755); err != nil {
log.Fatal(err)
}
if err := ioutil.WriteFile(“main.go”, []byte(“package main\r\n\r\nimport \”fmt\”\r\n\r\nfunc main() {\r\n fmt.Println(\”Hello World\”)\r\n}\r\n”), 0755); err != nil {
log.Fatal(err)
}
}

“`

##実現方法
* 適当なディレクトリを作成する
* そこにgogen.goを作る
* 上記のコードをgogen.goにはっつける
* go install gogen.go

##使い方
Go書き始めたい時に空

元記事を表示

【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”
“`

元記事を表示

OTHERカテゴリの最新記事