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

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

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

元記事を表示

Goを書く前に知っておくべき3つのこと

# Goを書く前に知っておくべき3つのこと

**言語について学習する以外**で知っておくとあとあと人生が楽になることがいくつかあるので個人的に必須だと思っていること3つをサクっとリストアップしてみました。

## 1. 環境の準備
Goの面倒な要素として `$GOPATH` という変数(未設定の場合は `$HOME/go`)が指すディレクトリの下に全てのGoのソースコードが(少なくともエクスポートしたいものに関しては)入っている必要があります。変なこと(たとえばiCloudやDropBoxでコードをクラウドで同期するみたいなこと)をしない場合は未設定あるいは `GOPATH=$HOME/go` と明示的に設定してしまっていいと思います。合わせて `PATH=$PATH:$GOPATH/bin` も設定してしまいましょう。

`$GOPATH` 以下の階層は大雑把に以下のように構造化されています。

– `$GOPATH/`
– `bin/` go get などでインストールされたバイナリ郡
– `pkg/` 標準ライブラリ
– `src/` その他のGoコード

ここ

元記事を表示

01. 「パタトクカシーー」

## 01. 「パタトクカシーー」
「パタトクカシーー」という文字列の1,3,5,7文字目を取り出して連結した文字列を得よ.

###Go
“`go
package main

import “fmt”

func main() {
var src string = “パタトクカシーー”;
var des string = “”;

// rune 型へ変換
msrc := []rune(src);

// 1.ループで処理
for i := 0; i <= 7; i++ { // 問題では 1,3,5,7 指定だが奇数判定で対応 if (i % 2) != 0 { des += string(msrc[i]); } } fmt.Println(des); } ``` ###python ```python # -*- coding: utf-8 -*- src = u"パタトクカシーー" des = "" # 1.ループで処理(range) reverse = "" for i in range(len(src)): # 問題では

元記事を表示

00. 文字列の逆順

## 00.文字列の逆順
文字列”stressed”の文字を逆に(末尾から先頭に向かって)並べた文字列を得よ.

###Go
“`go
package main

import_ “fmt”

func main() {
var data string = “stressed”
var reverse string

// 1.ループ
for i := len(data) – 1; i >= 0; i– {
reverse += string(data[i])
}

fmt.Println(reverse)
}
“`

###python
“`python

# -*- coding: utf-8 -*-
data = “stressed”
reverse = “”

# 1.逆カウントのループ
i = len(data) – 1
while i >= 0:
reverse += data[i]
i-=1
print(reverse)

# 2.range->reversed
reverse = “”
for i in reverse

元記事を表示

Golang – Incorrect CPU Numbers of GOMAXPROCS in Docker

The runtime.GOMAXPROCS(??) will read the host machine’s CPU numbers instead of container’s (–cpus=??). We can use UBER’s ***automaxprocs*** to solve it.

“`
go get -u go.uber.org/automaxprocs
“`

“`golang
import _ “go.uber.org/automaxprocs”

func main() {
// Your application logic here.
}
“`

https://github.com/uber-go/automaxprocs

https://mp.weixin.qq.com/s/Lk1EbiT7WprVOyX_dXYMyg

GOMAXPROCS你设置对了吗?

https://colobu.com/2017/10/11/interesting-things-about-GOMAXPROCS/

http:/

元記事を表示

[おすすめ]ターミナルでの作業効率が爆上げするTUIツール5選

こんにちわ、ゴリラです。

普段、筆者は主にターミナルで仕事をしています。そこで作業効率化のためいくつかTUIツールを使っています。
今日は、個人的におすすめのTUIツールを5つ紹介していきます。

これらを導入することで、ターミナルでの作業効率が上がると思いますので、ぜひ導入して試してみてください。
また、こんな便利なツールがあるよって方いましたら、ぜひコメントをくださいー

– 2019/11/28 追記
– ffのブックマーク機能

# Git
[lazygit](https://github.com/jesseduffield/lazygit)というTUIツールを使っています。

`lazygit`機能が豊富なので紹介しようとすると長くになってし

元記事を表示

AWSの利用料金をGoで積み上げ棒グラフ化した

## はじめに

– 最近いろんな所でDevOpsって言葉を聞きますね。
– DevOpsの影響を受けて[FinOps](https://www.finops.org/what-is-finops/)と呼ばれるテクノロジー、ビジネス、財務を融合させたクラウドの運用モデルも提唱されています。
– もしかしたら、数年後にはDevOpsと同じくらいメジャーな概念となっているかもしれません。
– FinOpsを始めるための第一歩としてクラウドの利用料金の可視化、通知が挙げられています。
– というわけで、今回はAWSの利用料金を手っ取り早くグラフ化してslackに通知するツールについて紹介します。

## TL;DR
– CostExplorer APIからサービスごとの利用料金を取得
– [gonum/plot](https://github.com/gonum/plot)でStackedBarChartを生成
– [nlopes/slack](https://github.com/nlopes/slack)でslackに通知

## AWS料金の可視化方法いろいろ
– [CostExp

元記事を表示

VScodeでGoをいい感じに設定する

## Golangのインストール

[【Go】MacにGoをインストールする](https://qiita.com/tktktktk/items/7f284132ab4b080526b8)

まずは上記から、golangをインストールします。

## VScodeの設定
VScodeをインストール
[MacOSでVisual Studio Codeをインストールする手順](https://qiita.com/watamura/items/51c70fbb848e5f956fd6)

VScodeを開きます。
左側のタブの一番下、プラグインタブの検索窓に「go」と打ち”Go”をインストール
スクリーンショット 2019-11-26 18.12.39.png

Command+Shift+Pでコマンドパレッ

元記事を表示

[Go言語] httpライブラリのHandler,Handlefuncとかをざっくり整理

# はじめに
Go言語のhttpの標準ライブラリを利用すると、http.Handleとかhttp.Handlefuncとか似た名前が多い。
httpサーバを作るときによく使われるものについて、概念だけわかるようにかなりざっくり整理。

##Handler
リクエスト受信時の処理を持つインターフェースと思っておけばいい
定義されているServeHTTPは結局のところリクエスト受信時処理

“`
type Handler interface {
ServeHTTP(ResponseWriter, *Request)
}
“`

“`
func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) {
f(w, r)
}
“`

##http.Handle
URLと対応するHandlerをひもづける

URLに対してHandlerに定義されているリクエスト受信時処理が登録される

“`
func Handle(pattern string, handler Handler)
“`

##http.Handlefun

元記事を表示

nuxtで作った静的ファイルをgolangのechoでホスティングする。

# 背景
機能の内容は言えませんが、外部APIを利用した既存の機能の簡易版のツールを作りたい。そういった依頼が舞い込んできました。
すでにその機能は提供されていますが、画面仕様のもと多くの項目の入力が必要で、客先でさくっと処理させるには不向きでした。
そのため、既存機能の登録機能のみを切り出してほしいとのことでした。
二つ返事で了承。
今後のことを考えフロントエンドは別プロジェクトにし、APIは既存のものを利用。
外部のAPIはフロントエンドでのスクリプト読み込み後のAjax送信とサーバーサイドでのポストの処理があり、特定のホスト名と特定のIPにしか対応してませんでした。
それは困った。
ということで、nuxtで静的サイトとしてgenerateしたものを既存のプロジェクトでホスティングさせてしまえば、ホスト名とIPの課題は解決するということでやり方を書いておきます。

※ソースは抜粋しか載せられないのでその点はご理解ください。

# 流れ
1. nuxtでプロジェクトを作成しgenerateすることで静的サイトへ
2. golangとechoでできた既存システムでgenerateした

元記事を表示

[go] エラーのラッピング

Go 1.13 で追加された、エラーラッピングについて。

– Package errors (golang.org)
– https://golang.org/pkg/errors/

# 概要

– エラーを他のエラーでラップすることが可能になる
– 元のエラーの型やフィールド値を保持しつつ新しいエラーを生成できる
– ラップされたエラーは、あとから取り出すことが可能
– 呼び出し先の深い場所で起きたエラーの種類を判別しやすくなる

# 使い方

## エラーをラップする

~~~go
innerErr := fmt.Errorf(“Inner Error”)
newErr := fmt.Errorf(“Wrapped: %w”, innerErr)
~~~

従来使用してきた `fmt.Errorf()` でできる。
通常は `fmt.Errorf()` は `errors.errorString` 側のエラーを返すが、以下の条件を満たす場合、`fmt.wrapError` 型のエラーを返す。

– フォーマット指定子に `%w` を使用する。文字列内での

元記事を表示

[Golang][競プロ]子ども達に大福を分け与える問題について解説してみた

# はじめに

今日は、競技プログラミングをしてみたので、回答のロジックについて共有致します。
なお、競技プログラミングサービス側の規約もありますので、**問題文は全く違うものを用意**しておりますが、もし万が一コンプライアンスに問題があれば、ご連絡頂けると嬉しいです。

# 問題

おばあさんは、大福を`N`個持っています。
2人の孫が遊びに来たので、大福を分けてやることにしました。
標準入力で大福の数`N`を与えられた場合、2人の孫はいくつずつもらえるでしょう?
ただし、大福の数が奇数だった場合、孫のどちらかが多くなってしまいケンカになりかねないので、その場合はおばあさんが1つ食べるとします。

# 回答

問題文の稚拙さは、ご容赦ください。笑
それでは、僕の回答について共有致します。

## コード

“`golang:回答したコード
package main
import “fmt”
func main(){
var i int
fmt.Scanf(“%d”, &i)
r := i / 2
fmt.Println(r)
}
“`

## 解説

元記事を表示

if文の書き方のまとめ(Scala、Java、Rust、C言語、C++、Go言語、PHP、Perl、Python、Ruby)

いろんな言語を触っていると、言語の重要な特徴はともかく、細かい文法や記号の使い方などがだんだんごっちゃになってきてしまいます。あれ、これってこの言語だとどう書くんだっけ?ってなることがよくあります。前はよく使っていた言語なのに、ちょっと離れただけでもう忘れてしまった、とショックに感じることもあります。なので、こういうメモを作っていこうと思います。

# Scala

“`scala
if (x >= 30) {

} else if (x >= 0) {

} else {

}

// 文ではなく式
val max = if (a > b) a else b
“`

– 条件式は論理値であることが必要
– C言語と同様に`{ }`の中の式が1つの場合は`{ }`を省略可能 ([dangling else問題](https://www.google.com/search?q=dangling+else)あり)
– 文ではなく式

※厳密には、上記例での`{ … }`の箇所は式を1つ置けるのであって、中かっこはif式の仕様ではなくブロック

元記事を表示

Goを学習するに当たって特徴をまとめてみた

# はじめに
1年半ほど前から友人の勧めでGoを触っています。仕事ではC/C++を使っているのですが、趣味でGoを始めたことでプログラムの楽しさを思い出した1年でした。
有難いことに、その友人からGoのレッスンをしてもらえることになったので、ここで学習したことをまとめようと思います。

友人曰く、新しい言語を学習する上で、その言語が作られた背景を知っている人と知らない人では成長スピードが変わってくるという話だったので、今回はGoの特徴を中心に、Goが開発された背景や勉強方法をまとめます。

# Goが開発された背景

**Google内の課題を解決するために開発された**

参考:https://talks.golang.org/2012/splash.article

– 開発速度の低下
– 開発規模が大きくなるに連れ、現行の言語(C++など)による開発に限界が見え始めた。
– Goで循環参照が禁止されているのは複雑な依存関係を生み出さない仕組みだろうか。
– マルチコア時代の開発
– プロセッサの進化によりプロセッサ数が増え、並行性とスケーラビリティが重要に

元記事を表示

Ginのミドルウェアを使ったエラーハンドリング

# はじめに

ginでAPIなんかを書いていると、エラーを返すとき、

“`go
if err != nil {
log.Print(err)
c.AbortWithJSON(http.StatusInternalServerError, gin.H{
“Error”: “Request failed”
})
}
“`

のようなコードが(気をつけないと)あちこちに散らばってしまいます。
このままだと、例えばログの表示方法や保存方法が変わることになったときなどに一つひとつ手直ししないといけません。
そこで、ミドルウェアを使ってエラー時の処理をまとめたいと思います。

## バージョン

Go : v1.12
[gin](https://github.com/gin-gonic/gin) : v1.5

# ミドルウェアについて

ginではミドルウェアを設定でき、通常のハンドラーの前後に任意の処理を入れることができます。

例えば、

“`go
func main() {
r := gin.Default()
r.Use(someMiddleware()) /

元記事を表示

Dependency Injection入門

## はじめに
以下では、Dependency Injectionとは何なのか、またその意義について記述する。コード例にはPythonとGoを用いる。

## まず、訳語について
Dependency Injectionという用語は、日本語の文脈では「依存性の注入」と訳されることが多い。たとえば、[このWikipediaの項目](https://ja.wikipedia.org/wiki/%E4%BE%9D%E5%AD%98%E6%80%A7%E3%81%AE%E6%B3%A8%E5%85%A5)も「依存性の注入」という名前になっている。

英語でDependency Injectionという言葉を考えると、明らかに日常的な状況では使用しない専門用語であるという印象を与えはするが、個別の単語に分解して考えれば、プログラマにとってはそれほど難解ではないだろう。

まず、プログラミングの文脈でDependencyといえば、あるソフトウェアが内部で使用している別のソフトウェアのことがすぐに頭に浮かぶはずだ。つまり、「あるプログラムが機能するために必要な別のプログラム」という意味で用いる、使用

元記事を表示

プライベートリポジトリをパスワードで限定公開するアプリを作った

GitHubのプライベートリポジトリを不特定多数に公開したい時ってありません? 私はあります、書類選考など。
不特定多数だから一人一人招待は無理だし、パスワード認証程度でいいんだけどなあと思いながら、
GitHubの設定でどうにかできないかと調べてみたんですが、ダメですね、なかったです。かなしいです。

クソみたいなリポジトリなんてどうせ誰も見ないんだからパブリックにしちゃえば?と思われるかもしれません。
パブリックはなんか嫌だし、私が作ったものはクソじゃないし、百歩譲ってクソだったとしても自分のクソを全世界に公開する趣味はないです

なので作りました。他になさそうだったので。

http://35.233.244.144/
(クリックしても飛べない場合URLをコピーしてみてください)

[GitHubのリポジトリはこちら](https://github.com/simoyama1333/git_limited_access)

![ss.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2

元記事を表示

golang functional option

# Optionalな引数、どうしてますか?

pythonやjavascriptであれば

“`py
def hoge(a, b=”bbb”, c=123):
pass
“`

こんな風にすれば、関数はoptionalな引数を持つことができますが、Golangではこういう文法はありません。
調べると「Functional Optionを使いましょう」という記述に沢山出会います。

実際にFunctional Optionってどうやればいいんだろう?ということでやってみました。

# 実装

## クラスのコンストラクタの場合

“`go
struct Sample {
a string
b string
c int
}
func (s *Sample) init(){
// init Sample
}
func NewSample(a string, b string, c int) *Sample {
s := &Sample{a,b,c}
s.init()
return s
}
“`

たとえばこんなコードがあるとします。

元記事を表示

【Go】日時を文字列に変換する時によく使うフォーマット指定

# はじめに

しょっちゅう「あれ?Golangで日付を文字列に変換する時のフォーマットってどんなんだっけ?」となって毎回調べているので、個人的によく使うやつを自分用のメモとして残しておきます。

フォーマットの詳しい指定方法については以下の記事がわかりやすくまとまっています。
本記事では細かい解説はしません。

– [Golangでの日付のフォーマット指定の方法について \- Qiita](https://qiita.com/unbabel/items/c8782420391c108e3cac)

# よく使うフォーマット

年月日時分秒の指定方法さえ覚えておけば大体なんとかなると思います。

|日時形式|フォーマット|
:-:|:-:
|yyyy-mm-dd|2006-01-02|
|yyyy-m-d|2006-1-2|
|HH:MM:SS|03:04:05|
|H:M:S|3:4:5|
|yyyy-mm-dd HH:MM:SS|2006-01-02 03:04:05|

# サンプルコード

“`go
package main

import (
“time”
)

func

元記事を表示

OTHERカテゴリの最新記事