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

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

【Go】GOPATH変更できないときにやったこと

#### 1. はじめに
[anyenv](https://github.com/anyenv/anyenv)経由でインストールした[goenv](https://github.com/syndbg/goenv/goenv)ですが
どうにもGOPATHやGOROOTの設定が動いてくれませんでした。
(結果としてGOPATH設定変更しなくて良かったようですが)
GoのWebフレームワーク [echo](https://echo.labstack.com/)を導入するときに、インストール先がGOPATHが設定されているディレクトリだったので「なんかそこじゃ嫌だな〜」と思って、GOPATH設定変更を試みました。
そのときに行ったことを備忘録として書きます。

*Homebrew、anyenv、goenvのインストール手順は書いていません。
お気付きのことがあれば、コメントいただけると幸いです。*

#### 2. 環境

“`
macOS Mojave ver. 10.14.6
Homebrew インストール済
go version go1.13.5 darwin/amd64
shell

元記事を表示

Golang入門記事の没ネタサンプルコード

Golang入門中です。

以前、以下の記事を書きました。
[Golang入門:AtCoderなどの競技プログラミング問題を解き始めるための基本構文+その他おまけTips](https://qiita.com/shiro01/items/4e12a48816ecd47c0c0e)

記事に載せようかと思い書いてみたけれど、
趣旨から外れるため除外したサンプルコードをせっかくなのでまとめて公開したいと思います。

入門者によるざっくり試してみたコードの羅列ですが、参考になれば幸いです。

#型宣言

基本の型から独自の型を宣言できます。

“`golang:newType01.go
package main

import (
“fmt”
)

// intから新しい型を宣言
type aInt int
type bInt int

func main() {
var a aInt = 5
var b bInt = 55
hoge(a, b)

// 数値はaInt型,bInt型に代入できるので実行可能
hoge(5, 55)

// intだとエラーになる
// エラ

元記事を表示

AWS CodePipelineでgoアプリのDockerイメージをECRに格納する

## 実現したいこと
1. CodeCommitのリポジトリ(hoge-repo)のmasterブランチの更新をトリガーに
masterブランチのリソースからDockerイメージを作成しECRの対象リポジトリに格納したい
1. hoge-repoはgolangのアプリを持っているので,イメージ作成時にアプリのビルドも行う

## 環境
– Golang 1.13.5
– Docker 18
– AWS 東京リージョン

## やったこと
### CodeBuild構築
– プロジェクト名は任意の名前

– 送信元
送信元はCodeCommitの対象リポジトリを選択

スクリーンショット 2020-01-10 15.53.22.png

今回はmasterマージをトリガーにするのでリファレンスタイプは

元記事を表示

GoでデバッグのためにgRPCのリクエストをトレースする

Go で gRPC が使われているライブラリを使っている時に、ライブラリが投げている実際の gRPC のリクエストをトレースしたい場合には Go の gRPC ライブラリが `golang.org/x/net/trace` に対応している為、お手軽に確認する事ができる。

“`golang
grpc.EnableTracing = true

go func() {
http.ListenAndServe(“:8080”, nil)
}()
“`

そのあと、 `localhost:8080/debug/requests` を開けば以下のような出力が得られる。

![スクリーンショット 0002-01-10 17.35.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/974/9453223b-d16b-1b79-48e3-34bae47c05ab.png)

詳細は [golang.org/x/net/trace](https://godoc.org/golang.org/x/net/t

元記事を表示

眺めて覚えるGo言語 その11 無名関数(Anonymous function)

#では、眺め用サンプルコード

“`f11.go
package main
import (
“fmt”
)
func main() {
h1:=func(a string)(string){ return “

“+a+”

“}
fmt.Println(h1(“Topics”))
}
実行結果
>go run f11.go

Anonymous

“`

##名無しの関数
“`f12.go
package main

import (
“fmt”
)

func main() {
func(){
for i:=0;i<10;i++{ fmt.Println("i=",i) } }() } 実行結果 >go run f12.go
i= 0
i= 1
i= 2
i= 3
i= 4
i= 5
i= 6
i= 7
i= 8
i= 9
“`

元記事を表示

workaround for panic when defining the same flag in multiple packages and go test -coverpkg.

# Issue

– go version: 1.13.5

複数のパッケージが同じ名前のフラグを定義している時、 `go test -coverpkg=all ./…` のように `-coverpkg` をつけて `go test`すると、 `flag redefined` でpanicする問題。

– [cmd/go: test coverpkg panics when defining the same flag in multiple packages · Issue \#27336 · golang/go](https://github.com/golang/go/issues/27336)
– [Go 1\.13 にアップデートするとテスト時に “flag provided but not defined” エラーが発生するケース \- blog\.syfm](https://syfm.hatenablog.com/entry/2019/10/01/063436)

“`
$ go test -v -cover -coverpkg=all ./…
?

元記事を表示

眺めて覚えるGo言語 その10 panic

#Go言語のpanicを知ってパニクッタのである。
なんかエラーがあって継続するのに難しいときに使うのが**panic**です。

“`f9.go
package main

import (
“fmt”
)

func main() {
defer fmt.Println(“パニクリました。”)
fmt.Println(“Start”)
panic(“パニックになりました”)
}
実行結果
>go run f9.go
Start
パニクリました。
panic: パニックになりました

goroutine 1 [running]:
main.main()
C:/Users/hirat/go-work/function/f9.go:10 +0x12b
exit status 2
“`
上記のようにdeferと共に使うとプログラムの中断がうまく行く。

“`f10.go
package main

import (
“fmt”
)

func helloworld() {
defer fmt.Println(“End”)
fmt.Pri

元記事を表示

Goのmapのkeyを連結して平らにする

### Code

“`go
package main

import (
“fmt”
)

type m map[string]interface{}

var data = m{
“version”: “1”,
“meta”: m{
“id”: “2”,
“user”: m{
“id”: “3”,
},
},
}

func main() {
FlattenMapKeyWithPeriod(data, “”)
}

func FlattenMapKeyWithPeriod(data map[string]interface{}, prefix string) {
for k, v := range data {
d, ok := v.(m)
if ok {
FlattenMapKeyWithPeriod(d, prefix+k+”.”)
} else {
fmt.Printf(“%s: %s\n”, prefix+k, v.(string))
}
}
}
“`

#### In

“`json
{
“versi

元記事を表示

GoのDatetime忘れがちなので、まとめてみた

普段良く使うtimeメソッドをまとめてみた。

## Formatについて

他の言語みたいな`YYYY-MM-DD hh:mm:ss`timeフォーマット、Goでは↓このように書く
`2006-01-02 15:04:05`

## String -> Time

`time.Parse(layout,string)`を使って、文字列をTimeオブジェクトにする

例:

“`go
str := “2020-01-09T19:00:00Z”
t, _ := time.Parse(“2006-01-02T15:04:05Z”, str) // 出力結果: 2020-01-09 19:00:00 +0000 UTC
“`

## 時間の比較

`After()`メソッドを使う
t1 > t2なら、t1.After(t2) => true
t1 < t2なら、t1.After(t2) => false

“`go
str1 := “2020/01/10 00:00:00”
str2 := “2020/01/08 00:00:00”

t1, _

元記事を表示

眺めて覚えるGo言語 その9 deferの書き方

#deferは、遅延という意味だが分かりにくい。
###眺めるための例題

“`f7.go
package main
import (
“fmt”
“time”
)
func main() {
defer fmt.Println(“全部終了しました。”)
for i:=0;i<10;i++{ time.Sleep(1) fmt.Println("i=",i) } } //実行結果 >go run f7.go
i= 0
i= 1
i= 2
i= 3
i= 4
i= 5
i= 6
i= 7
i= 8
i= 9
全部終了しました。
“`
最初に書いた **defer fmt.Println(“全部終了しました。”)**は、
for以降のステートメント以降に遅延されたことがわかる。

実際の場面

“`f8.go
package main

import (
“bufio”
“fmt”
“io”
“os”
)
func main() {
fp, err := os.Open(“d:\\00data\\test_utf20.csv”)
if err !=

元記事を表示

ソースコードからdebパッケージを作成する(goの参考ビルド例付き)

# TL;DR

* ソースコードからコンパイルするソフトウェアツールを,ubuntu 18.04などのdebパッケージにまとめる手順を説明します
* いわゆる野良ビルドなので,利用には注意が必要です
* “`go“`のインストールを例に説明します

# 手順

* “`check-install“`コマンドを使用してdebパッケージを作ります.
* ツールをソースからインストールする際に行う,いつもの手順“`./configure && make && sudo make install“`の3番めの“`make install“`の代わりに,“`checkinstall“`コマンドを使用するだけで,debパッケージを生成できます.
* golangのソースコードにはMakefileが無いので,自分でMakefileを作ってしまいます
* Makefileには,“`all“`,“`install“`,“`uninstall“`の3つのディレクティブの記載が必要です

# check-installのインストール

“`bash

元記事を表示

golangをソースコードからインストールする(CentOS/Ubuntu)

# TL;DR

* Go言語のプログラムのコンパイラ+実況環境(“`go“`コマンド)をソースコードからインストールする方法を紹介します

# Go言語のビルド手順

[Installing Go from source](https://golang.org/doc/install/source)の説明をもとにインストールします.

直近のバージョンのgoは,goでビルドします.そのため,(以前のバージョン)“`go1.4“`をいったんビルドしてから,最近のバージョンのgoをビルドする手順を取ります
(もとの説明は「[Bootstrap toolchain from source](https://golang.org/doc/install/source#bootstrapFromSource)」にあります).

手順は以下のとおりです.使用したいgoを1.13.5(2019年12月27日時点)とします.

1. go1.4をダウンロード,ビルドする
1. go1.13.5をダウンロード,go1.4のディレクトリを指定してビルドする

# go1.4のビルド

* まず最

元記事を表示

眺めて覚えるGo言語 その8 関数の書き方

# 一般的な関数の書き方

“` f1.go
package main
func add(a,b int)int{
return a+b
}
func main(){
print(add(10,20))
}

実行
>go run f1.go
30
“`

 - a,b intは、引数です。intは、引数の型を表します。
 - その後ろに書いてあるintは、戻り値の型を示します。

#慣れてきたらnamed return value(naked return)を使ってみよう
“`f2.go
package main
func fun(a ,b int)(x,y,z int){
x=a*10
y=b*20
z=a+b
return
}
func main(){
a,b,c:=fun(10,20)
println(a,b,c)
}

実行
>go run f2.go
100 400 30

“`

– あらかじめ戻り値を定義することによりreturn一発で戻ることができる。(x,y,z int)

“`f3.go
package main
func fun(a ,

元記事を表示

Serverless Framework for AWS Lambda Development

## 0 .Intro

[Serverless Framework]([https://serverless.com/](https://serverless.com/))

> The complete solution for building & operating serverless applications.

就自己這陣子的使用經驗上來看,我覺得這樣的敘述還算名符其實。

目前最主要會用場景為開發在自己的MBPR 上利用Golang 開發AWS Lambda,利用Serverless Framework CLI所提供的功能來開發,部署以及在本機做測試,整體的流暢度滿高的。 雖然Serverless還有提供其他Monorting, integration或policy目前還沒有使用到,但是整理的使用經驗大勝[SAM CLI]([https://github.com/awslabs/aws-sam-cli](https://github.com/awslabs/aws-sam-cli)),特別是早期被SAM對於Golang的支援踩到太多的坑了。

除了AWS之外,其他ser

元記事を表示

DB接続付きGraphQLサーバ(by Golang)をローカルマシン上でDockerコンテナ起動

# お題
表題の通り。[前回](https://qiita.com/sky0621/items/f03631f0309f5c375b1d)までGraphQLを題材にフロント・バックエンドそれぞれで実装を進めてきた。
まだまだ実装することは山ほどあるけど、今のところローカルマシン内でほそぼそと立ち上げているこのアプリを[GKE](https://cloud.google.com/kubernetes-engine/?hl=ja)にでも載せてみようと思っているので、まず手始めにアプリのDocker化を試みる。
今回は、バックエンド(Golang)だけ。接続するDBはローカルのDockerコンテナのまま。

# 関連記事索引
– 第5回「[DB接続付きGraphQLサーバ(by Golang)をローカルマシン上でDockerコンテナ起動](https://qiita.com/sky0621/items/58fa2bcfc0935f6186cb)」
– 第4回「[graphql-codegenでフロントエンドをGraphQLスキーマファースト](https://qiita.com/sky062

元記事を表示

io.CopyにはなるべくWriteTo関数を渡してあげた方が良さそう

[io.Readerのファイルタイプを判定する](https://qiita.com/knqyf263/items/6dfc891c6d3c6b94f895) を拝見してちょっと気になったので調べました。

`io.MultiReader`では[Write関数](https://golang.org/src/io/multi.go?s=1440:1500#L58)しか実装されておらず、 [WriteTo(w Writer) (n int64, err error)関数](https://golang.org/pkg/io/#WriterTo)が存在しません。
そのため、みんな大好き[io.Copy](https://golang.org/pkg/io/#Copy)で[積極利用](https://golang.org/src/io/io.go?s=13615:13679#L379)される`WriteTo(w Writer) (n int64, err error)`関数が働かず少し残念な気持ちがありました。

もしかすると気持ちだけの問題かもしれないのでBenchmarkしてみました。

元記事を表示

【Go】string型からint64型・uint64型へ変換する方法

# string型からint64型へ変化する方法

“`go
// int64
var strInt64 string = “9223372036854775807”

// strconv.ParseInt(文字列, 基数(10進数),ビット長)
convertedStrInt64, _ := strconv.ParseInt(strInt64, 10, 64)
“`

`9223372036854775807`は`int64`の最大数です

https://golang.org/pkg/builtin/#int64

> int64 is the set of all signed 64-bit integers. Range: -9223372036854775808 through 9223372036854775807.

# string型からuint64型へ変化する方法

“`go
// uint64
var strUint64 string = “18446744073709551615”

// strconv.ParseUint(文字列, 基数(10進数)

元記事を表示

GoでSSO

## やりたいこと

やりたいこととしては、GSuiteのアカウントで認証を一元管理したいなと。

そこでGsuiteのSSOを試してみたところ、色々と苦戦したので共有がてらに。

golangでSSOを試したかったのでその時のメモとして。

## 試しメモ

使ったライブラリはこれ

https://github.com/russellhaering/gosaml2

Gsuiteの設定はqiita teamのSSOから参考に

G Suite を使ったシングルサインオンの設定

https://github.com/galigalikun/saml-go/blob/master/main.go

試したコードはこれ

Gsuiteの「ACS の URL * 」を、「AssertionConsumerServiceURL」にして
「エンティティ ID *」を「AudienceURI」にする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.a

元記事を表示

testify の assert.NoError() で fail した場合に処理続行して panic しないために

# 忙しい人のための結論
`assert.NoError()` で failした際には `t.FailNow()` すべし

# Why
goのテストコード書く場合いちいち `if err != nil` でチェックするのが面倒なのでtestifyの `assert.NoError()` を使ってチェックすることがあると思います。

“`Go
t.Run(“hoge func1”, func(t *testing.T) {
hoge := NewHoge()
result, err := hoge.func1() // return (interface{}, error)
assert.NoError(t, err)

actual := result.(*Hoge)
expected := &Hoge{Hoge: “hoge”}
assert.Equal(t, expected, actual)
})
“`

上記のテストコードはassertが通っている場合は問題なく動作しますが
assertがfailした場合 `assert.NoError` で処

元記事を表示

しばらく使わなかった言語はすぐ忘れる

昨年の2019年の6月頃触っていたgolangで素晴らしいモックの作成方法を学んだのに、
半年たってモックを作成しようとしたらテストの書き方含め「どうやるんだっけ…?」と忘れてしまいました。

[エビングハウスの忘却曲線](https://trinity.jp/118843/)によると学んだことは1ヶ月後も経てばほぼ忘れてると同義らしいので、
忘れた事を悲観するのではなく、アウトプットを含めた復習をすることで記憶を強化したいと思います。

[github.com](https://github.com/masa-mu/golang-public/tree/master/test-benchMark/exMock)のソースはこちら

## サンプルプログラム

例えばこんなプログラムがあったとします。

layer1.go

“`
package exPackage

type exStruct1 struct {
Layer2 Layer2Interface
}

type Layer1Interface interface {
Receiver() bool
}

func

元記事を表示

OTHERカテゴリの最新記事