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

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

【Go】fmt.Errorf(“%w %s”, err, `実行してる箇所`)でスタックトレースをログに出すという案

# はじめに

Go言語にて

__Before (Issue)__

“`go
if err != nil {
return err
}
“`
だけしてる場合は出力結果が例えば

“`
cause of error in repo
“`

このようにエラーメッセージだけ出力され、エラー箇所が分かりづらい問題があるあるだと思います。

__After (One of solutions)__

後述のWrap関数を使い、スタックトレースを取りたい各エラー箇所を`return Wrap(err)`にするだけで、下記のようなスタックトレースを付けて出力することができます。

“`
cause of error in repo /tmp/sandbox244131559/prog.go:27 main.repo
/tmp/sandbox244131559/prog.go:39 main.service
/tmp/sandbox244131559/prog.go:49 main.handler
“`

# 環境

* go version go1.14.2 darwi

元記事を表示

go修行6日目 for文とか

## for

“`golang

package main

import “fmt”

func main() {
for i := 0; i < 10; i++ { if i == 3 { fmt.Println("continue") // ループ内のcontinue以降は実行されず、次のループへ行く continue } if i > 5 {
fmt.Println(“break”)
// ループ終了
break
}
fmt.Println(i)
}

// 省略版
sum := 1
for sum < 10 { sum += sum fmt.Println(sum) } fmt.Println(sum) } ``` ``` 0 1 2 continue 4 5 break 2 4 8 16 ``` ## range - 要素数分ループ ```golang package main import "fmt" func main() { l := []string{"python"

元記事を表示

Go言語でキャメルケースをスネークケースに変換する

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

埃をかぶっていたMacBook Proに、VS Codeを入れました。
Go言語でキャメルケースをスネークケースに変換してみます。

“`Go
import “strings”

func CamelToSnake(s string) string {
if s == “” {
return s
}

delimiter := “_”
sLen := len(s)
var snake string
for i, current := range s {
if i > 0 && i+1 < sLen { if current >= ‘A’ && current <= 'Z' { next := s[i+1] prev := s[i-1] if (next >= ‘a’ && next <= 'z') || (prev >= ‘a’ && prev <= 'z') { snake += delimiter } } } snake += string(current) }

元記事を表示

【Golang】サードパーティ talib

#【Golang】サードパーティ talib
Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。 基礎〜応用まで。

“`
package main
/*
quoteで株価取得、
talibで株価分析をする

インストール 済
go get “github.com/markcheno/go-quote”
go get “github.com/markcheno/go-talib”
*/

import (
“fmt”
//株価取得
“github.com/markcheno/go-quote”
//株価分析
“github.com/markcheno/go-talib”
)

func main() {
//Quote
//yahooからSPY株価を取得
spy, _ := quote.NewQuoteFromYahoo(
“spy”, “2018-04-01”, “2020-01-01″, quote.Daily, true)
//”spy”, “2018-04-01”, “2020-01-01”, quo

元記事を表示

Ubuntu12.04 用の go build を行う

やむを得ない事情で古代の Ubuntu で使用するための Go 製アプリのビルドを行う方法。

1. `Ubuntu12.04` の Docker イメージを用意する

“`sh
$ docker run –rm -it -v $(pwd):/home/ubuntu ubuntu:12.04 bash
“`

**以降は Docker 内での操作**

2. 必要なツールのインストール

“`
# apt-get update
# apt-get install wget git
“`

3. Go のインストール

インストールするバージョン(今回は1.10)は状況に合わせて変更。

“`
# wget http://golang.org/dl/go1.10.linux-amd64.tar.gz
# tar -C /usr/local -xzf go1.10.linux-amd64.tar.gz
# export PATH=/usr/local/go/bin:$PATH
# go version
“`

4. 必要なツールのインストールとビルド

“`
# cd /

元記事を表示

go修行5日目 if文とか

## クロージャー

“`golang

package main

import “fmt”

// インクリメント
func incrementGenenrator() func() int {
x := 0
return func() int {
x++
return x
}
}

// 円の面積
func circleArea(pi float64) func(radius float64) float64 {
return func(radius float64) float64 {
return pi * radius * radius
}
}

func main() {
counter := incrementGenenrator()
fmt.Println(counter())
fmt.Println(counter())
fmt.Println(counter())

c1 := circleArea(3.14)
fmt.Println(c1(2))

c2 := circleArea(3)
fmt.Println(c2(2)

元記事を表示

Goのetcd clientを使っているときにundefined: balancer.PickOptionsエラーが発生する場合の解消方法

## エラー内容

`undefined: balancer.PickOptions`以外にも、`undefined: resolver.BuildOption`や、`undefined: ResolveNowOption`も同時に発生する場合がある。

“`bash
# github.com/coreos/etcd/clientv3/balancer/picker
/home/reoring/go/pkg/mod/github.com/coreos/etcd@v3.3.22+incompatible/clientv3/balancer/picker/err.go:37:44: undefined: balancer.PickOptions
/home/reoring/go/pkg/mod/github.com/coreos/etcd@v3.3.22+incompatible/clientv3/balancer/picker/roundrobin_balanced.go:55:54: undefined: balancer.PickOptions
# github.com/coreo

元記事を表示

パスワードとかモロ見えのヤバいスクリプトを引き継いだので暗号化してそっ閉じしますね!!

# SIreな習慣実話

「今回の踏み台サーバどーすんすか?」

「今回はWebアプリ開発もあるのでWindowsにすることにした」

「~~(あークライアントが今更IEだからか・・)~~
 へ??でも**今踏み台で動いてるデータ収集と整形スクリプトbashですよ**」

「作り直しが必要だな」

「ではcygwinダウンロードしておきますね」

「まて、**社内規定で許可リストにないツールはインストールできないぞ**」

「ま・・・まさか・・・」

### 「同じ処理をPowershellで書き直ししてくれ」

# チクショー転職だ!

### 待って!!それ以上いけない!
**GUIから10台のサーバで100アカウント手打ちで作らされたあの夏を思い出すんや**。
そう、こっそり途中からnet userコマンドで省力化して素知らぬ顔で納品したあの夏を・・
君には同じ工夫ができる!

[BUSYBOX](https://busybox.net/)

これ使おうず!ワンバイナリーなので環境構築要らないし、
bashのスクリプトも**内蔵コマンドはスクリプト内で自動で解釈して実行**して

元記事を表示

Goでエンティティを表現する

## はじめに
前回の記事で「Goで値オブジェクトを表現する」という内容を書きました。
今回は引き続き、エンティティについて書いてみたいと思います。

## 実装
“`go:main.go
package main

import (
“fmt”

“github.com/AwataKyosuke/qiita/domain/model/user”
)

func main() {

// 無効なユーザーの作成
_, err1 := user.New(0, “sample”)
if err1 != nil {
fmt.Println(err1)
}

// 無効なユーザーの作成
_, err2 := user.New(1, “”)
if err2 != nil {
fmt.Println(err2)
}

// 有効なユーザーの作成
user1, err := user.New(1, “sample1”)
if err != nil {
fmt.Println(err)
}

// 有効なユーザーの作成
user2, err := user.

元記事を表示

【Go言語・golang】自作パッケージのimport

ハマったので流し書きメモ。

# 0. 前提

## 0-1. mainパッケージ
Go言語のプログラムはパッケージ(package)で構成されており、プログラムは `main` パッケージから開始される。

プログラム実行時の処理開始位置の `main` パッケージあるいは `main` 関数を『エントリポイント』と呼ぶ。

## 0-2. import文

他のパッケージのメンバにアクセスするには、 `import` 文を使用します。 `import` 文によって読み込んだパッケージのメンバへのアクセスは、 `パッケージ名.メンバ名` という形で行う。

https://go-tour-jp.appspot.com/basics/1
http://cuto.unirita.co.jp/gostudy/post/go-package/

# 1. import時の注意点

`main` パッケージが大きくなってきた時、処理を複数の関数あるいはファイルに分割したい。

その時、import文では、 **新しく作った独自パッケージへのパスとして、 `$GOPATH/src` 直下のディ

元記事を表示

Quit chanでgoroutineリークを回避する

# Avoid goroutines leaks with quit chan
“`go
func broadcastMsg(msg string, addrs []string) error {
errc := make(chan error)
quit := make(chan struct{})

defer close(quit)

for _, addr := range addrs {
go func(addr string) {
select {
case errc <- sendMsg(msg, addr): fmt.Println("done") case <-quit: fmt.Println("quit") } }(addr) } for _ = range addrs { if err := <-errc;

元記事を表示

【Golang】サードパーティー semaphore

#【Golang】サードパーティー semaphore
Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。 基礎〜応用まで。

“`
package main
/*
Semaphore

並列処理

インストール 済
https://godoc.org/golang.org/x/sync/semaphore
go get “golang.org/x/sync/semaphore”
*/

import (
“context”
“fmt”
“time”

“golang.org/x/sync/semaphore”
)

//2
//ここがセマフォ
//semaphoreで同時に走らせる数指定 == 1 開始する数
var s *semaphore.Weighted = semaphore.NewWeighted(1)

//3
func longProcess(ctx context.Context) {
//3-2 キャンセル
//goroutinを検証
//1つならTrue
//2つならFalse
isAcqu

元記事を表示

Goで値オブジェクトを表現する

## はじめに
最近、ドメイン駆動開発設計入門を読み進めているんですが、サンプルコードがC#で書かれているんですね。
個人的にはC#を業務で書いているので、そのまま読み進めればコードは理解できるんですが、どうせなら違う言語で書いてみたいな〜と思い、最近興味をもっているGo言語で書いてみました!!!

## 実装

“`go:main.go
package main

import (
“fmt”

“github.com/AwataKyosuke/qiita/domain/model/user”
)

func main() {

// 無効なユーザーの作成
_, err1 := user.New(0, “sample”)
if err1 != nil {
fmt.Println(err1)
}

// 無効なユーザーの作成
_, err2 := user.New(1, “”)
if err2 != nil {
fmt.Println(err2)
}

// 有効なユーザーの作成
user1, err := user.New(1, “sample”)

元記事を表示

Go言語: http.Client のコネクション管理 (HTTP/1.x)

# この記事について

net/http パッケージの Client は内部で TCP コネクションプールを持ち、コネクションのキャッシュ・再利用を行う。この記事では、その仕組みについてまとめる。

なお、HTTP/1.x と HTTP/2 では TCP コネクションの使い方が全く異なるため、HTTP/1.x ついてのみ記載する。

– 対象の Go バージョン: 1.14.4

# 初めに Transport について

Client は Do()メソッドの呼び出しによりリクエストを送信するが、実際にTCPコネクションを張って(つまり Dial して)、リクエストの送受信を行うのは RoundTripper インターフェースを実装したオブジェクトである。

“`go
type Client struct {
// Transport specifies the mechanism by which individual
// HTTP requests are made.
// If nil, DefaultTransport is used.
Tr

元記事を表示

Lambdaでmiddleware実装 Go編

初めてのGoでなれないところも多く悪戦苦闘していますが、共通処理を外に出してメンテナンス性やコード可読性をあげたいと思い、middlewareを実装してみました。

## middleware用のコード

“`golang:middleware.go
package middleware

import (
“github.com/aws/aws-lambda-go/events”
)

type Handler func(events.APIGatewayProxyRequest) (interface{}, error)

func Middleware(next Handler) Handler {
return Handler(func(request events.APIGatewayProxyRequest) (interface{}, error) {
return next(request)
})
}
“`
handlerについての公式ドキュメントはこちら
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg

元記事を表示

HTML Works – テンプレートエンジンを利用できる静的HTML作成環境(ツール)を作ってみた

# 開発の背景
マニュアルページを作成しようとした際に、サイドメニュー部など同じ要素を毎ページ記述するのが無駄だなと。(最近はフレーム分割などせずに単一ページにメニュー部をもつデザインが多い)
プログラム込みのWebページ開発であれば、フレームワーク(例えばPythonのDjangoなど)にテンプレートエンジンが大抵用意されていますので、共通部の部品化など効率的な開発が可能です。
このテンプレートエンジンを利用した開発を純粋なHTMLの作成でもできないかなと思ったのが発端です。
ひとまず既存のツールを探してみたところ、[HUGO](https://gohugo.io/)というツールがヒットしたのですが、コンテンツ部分はMarkdownで記述するタイプらしくちょっと自分のニーズとは違いました。
というわけで自作しよう!と(笑)

# テンプレートエンジンを利用できる静的HTML作成環境(ツール)
そしてひとまず必要最低限の機能を実装し、まだまだ趣味の範囲ではありますが動くものになったので、下記GitHubで公開してみました。
[HTML Works](https://github.com

元記事を表示

go修行4日目 map型、関数

## map型

“`golang

package main

import “fmt”

func main() {
m := map[string]int{“apple”: 100, “banana”: 200}

// 要素全部表示
fmt.Println(m)
fmt.Println(m[“apple”])

// 要素追加
m[“banana”] = 300
fmt.Println(m)
m[“new”] = 500
fmt.Println(m)

// ないものを取り出そうとすると0になる
fmt.Println(m[“nothing”])

// boolean型も返す
v, ok := m[“apple”]
fmt.Println(v, ok)

// boolean型も返す
v2, ok2 := m[“nothing”]
fmt.Println(v2, ok2)
}
“`

出力

“`
API server listening at: 127.0.0.1:4056
map[apple:100 banana:200]
100

元記事を表示

AtCoder Beginner Contest 170 参戦記

# AtCoder Beginner Contest 170 参戦記

## [ABC170A – Five Variables](https://atcoder.jp/contests/abc170/tasks/abc170_a)

2分で突破. 書くだけ. 最初から xi が0の場合はどうすれば良いんだと思ったが、xi = i だった、あはは.

“`python
x = list(map(int, input().split()))

for i in range(5):
if x[i] == 0:
print(i + 1)
break
“`

## [ABC170B – Crane and Turtle](https://atcoder.jp/contests/abc170/tasks/abc170_b)

2分半で突破. 書くだけ. O(1) で書けない辺りが弱い.

“`python
X, Y = map(int, input().split())

for i in range(X

元記事を表示

【Golang】ポインタについて

Go勉強中です。PHPしかやったことのない私がポインタについて勉強しました。
実験的なことをしながらポインタを体感していきたいと思います。

## ポインタを説明する前に

ポインタを説明する前に、まず「変数」についてお話しします。

## 変数

変数は、よく`モノを入れておく箱`と例えられています。
その`モノを入れておく箱`を今回は`番号付きロッカー`だと考えてください。

– どうしてそう考える必要があるか?

 変数は、本来PCのメモリ上に保管されて処理されています。PC上の保管されるときは`16進数のアドレス`が割り振られて保管され、必要な時に呼び出されます。

変数とはつまり、**`16進数のアドレス`を、人間が判断しやすいように命名が可能な`箱のようなモノ`です。**変数の概念を、少しだけPC寄って理解するため`番号付きロッカー`とお考えください。

### 変数の宣言

ロッカー01番に数字を入れてみましょう。他の言語と同様、上書きすることも可能です。

“`golang
var Locker01 int // 変数 Locker01 をint型として宣言

L

元記事を表示

GO言語学習メモ ポインタについて

#はじめに
GO言語の学習を進めて行く過程で、学んだ事をアウトプットしています。

##GO言語のポインタとは

変数が存在するメモリ上の場所を『アドレス』といい、そのアドレスを格納可能な変数を『ポインタ』と呼びます。
例えば、「int」型変数のアドレスを格納できるポインタ型は、「*int」型というに、型の前に「*」(アスタリスク)を付けます。変数からアドレスを取得する時は、「&」(アドレス演算子)を使い、反対にアドレスが指示し示す変数アクセスするときは「*」(間接参照演算子)を使用します。

具体的な例を見て行きましょう!

## 参考例
“`
package main

import “fmt”

func main() {
//int型のポインタ変数を宣言

var ptr *int

//int型の変数を宣言
var i int = 12345

//アドレス演算子を使い、iのアドレスをptrに代入
ptr = &i

//出力
fmt.Println(“iのアドレス:”, &i)
//=> iのアドレス: 0xc000016058
fmt.Print

元記事を表示

OTHERカテゴリの最新記事