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

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

Goのstruct(構造体)はフィールドなしでも定義できる

# 概要

タイトルのままです。

フィールドなしでメソッドだけ定義したかったのですが、パッと調べてもわからなかったので、実際に試して知りました。

『そんなもん知ってるわ!!』という方はブラウザバックどうぞ

# 検証結果

“` go:main.go
package main

import (
“log”
)

func main() {
n := Network{}
log.Print(n.CreateURL())
}

type Network struct {
}

func (n *Network) CreateURL() string {
// TODO: 引数を受け取ってURLを返す
return “https://github.com/”
}
“`

“`bash:実行結果
# go run main.go
2009/11/10 23:00:00 https://github.com/
“`

# 実際に動かせる

こちら =>

https://play.golang.org/p/cuQNOBeEdK_R

元記事を表示

Go Modules 依存パッケージを一括アップデートする

## はじめに

Goのパッケージ管理はGo Modulesを使っていますが、何もわからない・・・
最新版に追従するため`npm update`みたいなことをしたいけどわからない・・・

## アップデート方法

@propellaさんの[記事](https://qiita.com/propella/items/e49bccc88f3cc2407745)を参考に`go get -u`を実行してみました。

“`
$ go get -u
go get .: path /Users/naoki/go/src/github.com/oke-py/usn-api is not a package in module rooted at /Users/naoki/go/src/github.com/oke-py/usn-api
“`

どうやらうまくいっていません。検索して見つけた[Issueコメント](https://github.com/golang/go/issues/34058#issuecomment-527951591)を参考にします。

“`
$ go get -u all

元記事を表示

[Go]context.WithTimeoutとcontext.WithDeadlineの違い

## context.WithDeadline

コメントを引用すると、以下のように書いてある
> WithDeadline returns a copy of the parent context with the deadline adjusted to be no later than d. If the parent’s deadline is already earlier than d, WithDeadline(parent, d) is semantically equivalent to parent. The returned context’s Done channel is closed when the deadline expires, when the returned cancel function is called, or when the parent context’s Done channel is closed, whichever happens first.
>Canceling this context releases resour

元記事を表示

ニフクラ用の Terraformカスタムプロバイダを書いてみた(未完)

## 概要

先日[記事](https://qiita.com/shztki/items/d3fa879457f420c4c65a)に書いたニフクラ用Terraform Provider について、中途半端なところではありますが開発を終了しました。
ニフクラを利用する職場を離れたため、今後は動作検証もできないので、ここまでとなりました。

[ニフクラ用Terraform Provider](https://github.com/shztki/terraform-provider-nifcloud)

予定通りロードバランサー、付替IPアドレスまでは追加できたので、作成可能なリソースは最終的に以下のようになりました。

| リソース | ステータス | 備考 |
|—|—|—|
| サーバー | ok | インポートやコピーは作っていません |
| ディスク | ok | |
| ネットワーク・セキュリティ | ok | SSHキーインポートのみ |
| OSイメージ | ok | |
| ロードバランサー | ok | SSL関連は未検証 |
| マルチロードバランサー |

元記事を表示

ASTでドキュメントコメント(Docフィールド)を取得する際にハマった

`”go/parser”` でパースしたASTから、Docフィールドを取ろうとしてちょっとはまったのでメモ

GitHub のIssueによると [^1]
type の前につけたドキュメントコメントは、`ast.TypeSpec` ではなく、`ast.GenDecl` の `Doc`フィールドにつくよという話。

[^1]: GitHub Issue [go/ast: TypeSpec.Doc is nil? Have to grab documentation at GenDecl #27477](https://github.com/golang/go/issues/27477)

“`go
// doc comment
type Foo struct {
}
“`

“`go
// このコメントは GenDecl.Doc につく
type A struct {
}

// このコメントは GenDecl.Doc につく
type (
// このコメントが TypeSpec.Doc につく
B struct {
}
)
“`

動作確認のソース [G

元記事を表示

Github actionsでgo mod download, test, lint

# Github Actions
https://github.co.jp/features/actions
GithubのCI/CDサービス

# モチベーション
現職ではほとんどcircleciで回しているが、Github actionsが便利ということを聞いたので試した。
go.modのキャッシュの問題などあり、実際にやってみて記事としてこれ持って来ればOKみたいのが見当たらず、
githubでpublic repoを徘徊したので、最低限自分にあったやり方をまとめておきたい

# workflow
stepなどはほぼ他のciサービスと同じだと思うので割愛
実際のyamlは以下

“`github/workflows/ci.yaml
// 好きな名前
name: golang_ci
// フック
on: [push]

jobs:
build:
name: all
runs-on: ubuntu-latest
steps:
# GOPATHなどのセットアップ
– name: set up
uses: action

元記事を表示

04. 元素記号

## 04. 元素記号
“Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can.”という文を単語に分解し,1, 5, 6, 7, 8, 9, 15, 16, 19番目の単語は先頭の1文字,それ以外の単語は先頭に2文字を取り出し,取り出した文字列から単語の位置(先頭から何番目の単語か)への連想配列(辞書型もしくはマップ型)を作成せよ.

###Go
“`go
package main

import (
“fmt”
“strings”
)

func main() {
var src = “Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can.”;
var dw = map[int]bool{1: true, 5

元記事を表示

DockerでGoのRestAPIを作ってみた(ホットリロード対応)

dockerでGolangのAPIを作りたいと思いましてやってみました。
ちなみに、dockerはホットリロードさせたかったので、docker-composeを使っています。

#環境
それぞれのバージョンはこちら。
Dockerについての説明とかは省きます。

“`console
$ docker-compose –version
docker-compose version 1.24.1, build 4667896b

$ go version
go version go1.13.4 darwin/amd64
“`
■ echo 4.1.11 (ルーティングが便利になるかな、と)
  公式はこちら https://echo.labstack.com/guide
  以下によると、RestAPIに最適化されているらしー。
   https://rightcode.co.jp/blog/become-engineer/go-flamework

■ oxequa/realize
  ホットリロードを行うために入れてみた。

#ファイルの準備
適当なフォルダに以下の3ファイルを用

元記事を表示

構造体へのインターフェースの埋め込み

構造体へのインターフェースの埋め込みについての知識に漏れがあったので、調べたことをまとめました。

Goでは、インターフェースの明示的宣言はなく、インターフェースの持つメソッドを実装することでそのインターフェースを満たしていることになります(ダックタイピング)。

しかし、実はインターフェースを構造体に埋め込むことでも、例えその構造体はインターフェースの持つメソッドを持っていなくても、そのインターフェースを満たしていることになります。

下記のコードでは、user構造体はUserInterfaceを持っているのでUserInterfaceのもつFullName()を持っていなくてもUserInterfaceを満たしていることになります。よって、下記のコードはビルドが通ります。

“`Go
func main() {
taro := testUser{
firstName: “Taro”,
lastName: “Yamada”,
}
outputUser(taro) //testUserがUserInterfaceを満たしているため、taroをoputputUserに渡

元記事を表示

MySQL/PostgreSQLに対応したdump/recreate/validateツールを作りました

## 概要
– MySQL/PostgreSQLに対応したdump/recreate/validateツールを作りました。
– Dump機能はデータベース単位でDDLを生成し、テーブル毎にDDL+Insert文を出力します。
– Recreate機能はデータベースをDrop and Restoreすることでdumpファイルが正常に復元できることをチェックします。
– Validate機能はテーブル単位でCheckSumまたはMD5値を取得して保存し、リストア前後でデータの欠損や変更がないことをチェックします。
– [github.com/m22r/chronicle](https://github.com/m22r/chronicle)にてコードを公開してます。

## インストール方法
“`sh
$ git clone git@github.com:m22r/chronicle.git
$ make build
“`

## 使い方
### dump
“`
Store dump files of all databases and tables

Usage:
chroni

元記事を表示

SSMパラメータストアに対するアクセス検知ツール

## 概要
– SSMパラメータストアに対するアクセス検知ツールを作りました。
– 任意の期間中のアクセスをCloudTrail APIから取得し、ユーザ名、UserAgent, 対象のパラメータ, 期間中のアクセス件数, ソースIPアドレスなどをSlackに通知します。
– [github.com/m22r/doberman](https://github.com/m22r/doberman)にてコードを公開しています。

## slackへの通知サンプル

### terraformでSSMパラメータ内の値を閲覧したときの通知内容
doberman.png

### 対象期間中にアクセスがなかった時の通知内容
doberman2.pngGolangでRDSをPITR(ポイントインタイムリカバリ)するCLI

## 概要

– RDSのポイントインリカバリを簡単に実行するツールをGoで作りました。
– 復元元のDBインスタンス/クラスターの設定を復元先にも引き継ぐようにしています。
– [github.com/m22r/phoenix](https://github.com/m22r/phoenix)にてコードを公開してます。

## インストール方法
“`sh

$ git clone git@github.com:m22r/phoenix.git
$ make build
“`

## 使い方
“`sh

$ ./phoenix -h
Point In Time Recovery Tool for Amazon RDS, Aurora

Usage:
phoenix [flags]
phoenix [command]

Available Commands:
help Help about any command
version Print version

Flags:
–cluster If y

元記事を表示

GOMODULE–Goのパッケージ管理

# Goのパッケージ管理
![go-lenguaje-programacion-google-blog-hostalia-hosting.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320164/709728cb-f955-9459-d0e5-8242e5911a8c.jpeg)

GOMODULEが誕生される前に `GOPATH` と `GOVENDOR`を使用してパッケージの管理をするのが一般的でした。

`GOPATH` : Go言語一度でも使用したことがあれば、お馴染みがあると思います、`GOROOT`と一緒に、Go言語の環境構築時にセットしてると思います。また、配下に `src`フォルダが存在することが必須とされています

`GOVENDOR`: パッケージ管理を専門フォルダー`vendor`に一任する、 `glide, dep,go dep…`などの管理ツールもあります

でも、どっちを使用しても、便利とは言えない

– GOPATH
– 全てのプロジェクトは`src`に置かな

元記事を表示

03. 円周率

## 03. 円周率
“Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics.”という文を単語に分解し,各単語の(アルファベットの)文字数を先頭から出現順に並べたリストを作成せよ.

###Go
“`go
package main

import (
“fmt”
“regexp”
“strings”
)

func main() {
var src string = “Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics.”
var wlen []int
rex := regexp.MustCompile(“([a-zA-Z]+)”)

// 単語に分割
words := strings.Split(src, ” “)
for _, word := range words {
// アルファベットの

元記事を表示

02. 「パトカー」+「タクシー」=「パタトクカシーー」

## 02. 「パトカー」+「タクシー」=「パタトクカシーー」
「パトカー」+「タクシー」の文字を先頭から交互に連結して文字列「パタトクカシーー」を得よ.

###Go
“`go
package main

import (
“fmt”
“strings”
)

func main() {
var p1 string = “パトカー”;
var p2 string = “タクシー”;
var result string;

// 文字を配列にする
p1s := strings.Split(p1,””);
p2s := strings.Split(p2,””);

// 配列数ループ(「パトカー」に合わせる。同じ文字数だから・・・)
for i := range(p1s) {
// 各文字を1文字づつ連結
result += p1s[i] + p2s[i];
}

// 結果を表示
fmt.Println(result);
}
“`

###python
“`python
# -*- coding: utf-8 -*-
p1 = u”パトカー”

元記事を表示

Golang Mac環境構築メモ

Goのバージョンを混在させるためgoenvからGoを入れる

“`
brew install –HEAD goenv
“`

更新時

“`
brew upgrade –fetch-HEAD goenv
“`

bash_profileにgoenv関連のパスを通しておく

“`
vim ~/.bash_profile
“`

以下を記載して`:qw`

“`
#goenv
export PATH=”$HOME/.goenv/bin:$PATH”
export GOPATH=$HOME/go
eval “$(goenv init -)”
“`

bash_profileの変更を反映

“`
source ~/.bash_profile
“`

goenvコマンドが叩けることの確認

“`
goenv -v 
“`

ここからGoの構築
goenvでインストールできるGoのバージョンを確認

“`
goenv install -l
“`

バージョン指定で入れる

“`
goenv install 1.11.4
“`

有効なバージョンに今回入れたバー

元記事を表示

mockeryのOn()にはTimes()を指定しよう

## TL;DR
https://github.com/vektra/mockery のmock指定時の注意点。

1. 同じ引数
2. 返り値が場合によって異なる

の条件を満たすmockを使いまわす場合は `On()` のメソッドチェーンで `Times()` をつける。
それが難しければ `t.Run` のなかで `new` すること。

回数を指定しない場合 `On()` の上書きが効かないので、最初にセットされた `Return()` を返し続けることになる。

## 例

“`Go
func TestHoge(t *testing.T) {
mockFoo := new(mocks.Foo)
mockBar := new(mocks.Bar)

t.Run(“test – first”, func(t *testing.T) {
mockFoo.On(“FuncA”, mock.Anything).Return(1)
mockBar.On(“FuncB”, 1).Return(1)

// テストコード
})
t.Run(“test –

元記事を表示

Slackで誰かの承認をもらえたらRDSにクエリ実行して結果を返す仕組み

## 概要
– SlashコマンドでAWSのアカウントがなくてもRDSにクエリ実行する仕組みを作りました。
– 同じチャンネルで実行者以外の誰かの承認をもらえないと実行できません。
– 実行結果をslackにそのままPostするのではなく、s3にcsv形式で保存し、署名付きURL(有効期限15分)をslackにPostします。
– 特定のチャンネルからのslashコマンドしか受け付けないので、悪意のある第3者がこっそりクエリ実行して結果を閲覧することはできません。

コードは以下に公開しています。
https://github.com/m22r/sequelcat

## コマンド実行時の流れ

### コマンド実行時
slash_command.png
クエリを流したい人が特定のチャンネルでslashコマンドを入

元記事を表示

Goの実装例で理解するダックタイピング

ダックタイピングという単語を聞いたことがあるものの、アヒル以外何も頭に思い浮かばないという方向けの記事です。ダックタイピングについてGoでの実装例と共に初心者の方でも分かるようにやさしく書いていきます。

以前書いたポリモーフィズムの記事の焼き直し感が否めませんが、まあ前回の記事と今回の記事を読めばダックタイピングとポリモーフィズム両方理解できるってことで気にせず書いていきます。

##Wikipediaで理解するダックタイピング
まずはWikipediaのダックタイピングの説明を引用します。この説明を読んでよく分からなくても、記事を読み終わった後に再び読んでみると腑に落ちるはずですので、まずはさらっと読んでみてください。

>ダック・タイピング(duck typing)とは、Smalltalk、Perl、Python、Rubyなどのいくつかの動的型付けオブジェクト指向プログラミング言語に特徴的な型付けの作法のことである。それらの言語ではオブジェクト(変数の値)に何ができるかはオブジェクトそのものが決定する。これによりポリモーフィズム(多態性)を実現することができる。つまり、静的型付け

元記事を表示

Go で DIP に従って依存関係を逆転させたいときは ifacemaker と moq の組み合わせが強い

# はじめに

* Go で DIP(依存関係逆転の法則)に従って依存関係を逆転させたくなったとき ifacemaker を使って構造体からインターフェイスを生成して moq を使ってインターフェイスからモックを作るのが便利

# 例

* 構造体 User の値をメモリに登録・参照するリポジトリ UserMemoryRepository がある
* UserMemoryRepository をサービスなどから利用したくなったとして、直接参照するのではなく UserMemoryRepository を抽象化したインターフェイスを参照するようにしたいとする

“`go:Userの定義
type User struct {
ID int
Name string
}
“`

“`go:UserMemoryRepositoryの定義
type UserMemoryRepository struct {
}

var userMemoryRepositoryMap = map[int]*User{}

func (r *UserMemoryRepository) Get(id in

元記事を表示

OTHERカテゴリの最新記事