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

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

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

元記事を表示

go修行3日目 wslへのセットアップと配列とか

# wslにセットアップ
## インストール

“`bash

sudo apt-get -y install golang-go
“`

## 環境変数

“`bash

vim ~/.bashrc
“`

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

## goenvインストール

“`bash

git clone https://github.com/syndbg/goenv.git ~/.goenv
“`

“`
exec $SHELL
source ~/.bashrc
goenv install -l
goenv install 1.14.4
goenv global 1.14.4
“`

バージョン確認

“`
yuta@DESKTOP-V36210S:/mnt/c/Users/yuta$ goenv versions
system
* 1.14.4 (set by /home/yuta/

元記事を表示

[超便利]Go ORMライブラリのSQL Boilerを使った感想

# はじめに

Go ORM ライブラリ [SQL Boiler](https://github.com/volatiletech/sqlboiler)を見つけて、コードを自動生成してくれたり、`gorm` `xorm` よりもパフォーマンスが優れているということを聞いたので使ってみました。

具体的な使い方は、サンプルアプリケーションを作ったので、そのソースコードを見てください。

https://github.com/kskumgk63/sqlboiler-example

もしくは、**こちらのブログが非常に参考になりましたので参照ください**。

https://note.crohaco.net/2020/golang-sqlboiler/

# SQL Boiler の説明

[SQL Boiler](https://github.com/volatiletech/sqlboiler) とは、データベーススキーマに合わせたGo ORMを生成してくれるライブラリです。
「データベーススキーマに合わせた」とある通り「データベース優先」のORMなので、まず初めにデータベーススキーマ

元記事を表示

Handy Admission Webhook Library

Kubernetes の Admission Webhook を開発する際に、[kubernetes/api](https://pkg.go.dev/k8s.io/api/admission/v1beta1) をラップした軽量なライブラリやフレームワークを使うことがあると思います。

– [kubernetes-sigs/controller-runtime](https://pkg.go.dev/sigs.k8s.io/controller-runtime/pkg/webhook)
– [slok/kubewebhook](https://github.com/slok/kubewebhook)

Admission Webhook の処理自体はシンプルなので、どのライブラリやフレームワークを使っても開発中に不満を感じることはないはずです。ただ、開発した Admission Webhook をデプロイする時に面倒に感じる部分があります。

# Motivation

Kubernetes の Admission Webhook の処理を少し振り返ります。Admission Webho

元記事を表示

GoでWebスクレイピング

# 事前準備
以下のコマンドで、ライブラリをインストールしてください

“`bash:
go get -u github.com/PuerkitoBio/goquery
“`
# 使い方
やり方の手順として以下の手順でやります。
1. URL情報の抽出
2. プログラムを書く
3. 実行

## URL情報の抽出
まず、スクレイピングしたいURLを決める必要があります。
今回は、Amazonの本検索でISBMの検索をしたときに一番最初に来たデータからタイトルを抽出するようにします。
日経Linux 2020 7月のISBMは4910071930709のため**4910071930709**で検索します。

[検索URL](https://www.amazon.co.jp/s?k=4910071930709&i=stripbooks)

ブラウザのF12などをおして、デベロッパツールでタイトル部分のHTML情報を調べましょう

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

元記事を表示

【Golang】サードパーティー config(go-ini)

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

“`
package main

/*
iniでConfigの設定ファイルを読み込む。
設定ファイルを作成する。

インストール 済
コンフィグのファイルを読み込む為のパッケージ
https://godoc.org/gopkg.in/go-ini/ini.v1
go get “gopkg.in/go-ini/ini.v1”

congig.iniを作成する
下記、よくある設定
[web]
port = 8080

[db]
name = test.sql
driver = sqlite3

これをGoで読み込む。osopenなんかも使えるが、iniの方が便利
*/

import (
“fmt”
//config
“gopkg.in/go-ini/ini.v1″
//”gopkg.in/ini.v1”
)

type ConfigList struct {
Port int

元記事を表示

OTHERカテゴリの最新記事