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

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

go修行3日目 no-struct

## no-struct

“`golang

package main

import “fmt”

type MyInt int

func (i MyInt) Double() int{
// integerにキャストする
return int(i * 2)
}

func main() {
myInt := MyInt(10)
fmt.Println(myInt.Double())
}
“`

“`
20
“`

## インターフェース

“`golang

package main

import “fmt”

type Human interface {
Say() string
}

type Person struct{
Name string
}

func (p *Person) Say() string{
p.Name = “Mr.” + p.Name
fmt.Println(p.Name)
return p.Name
}

// Humanインターフェースを受け付ける
func DriveCar(human Human){
if

元記事を表示

Next.jsとGo言語(gqlgen)でGraphQLを使ったアプリケーションを構築する方法

この記事では、フロントエンドにNext.js、バックエンドにGo言語(gqlgen)を用いて、フロントエンドとバックエンド間のAPIにGraphQLを使ったアプリケーションを構築する方法をまとめます。

作成したのは以下のような簡易ブクマアプリです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60996/b9e6976e-f134-673e-38d1-7a63d00bb4d1.png)
フロントエンドはほぼNext.jsのexamplesのままで、本記事ではバックエンドの実装をメインに解説します。

## 背景

個人的に、「フロントエンドフレームワークとGo言語の組み合わせで何か開発をしてみたい」と以前から思っていました。
そんな中、ReactのフレームワークであるNext.jsの使い勝手が良さそうという噂を耳にしました。

加えて、Next.jsのexamplesが充実していて、Apolloを使ったアプリケーションのひな形が簡単に作れることを知ったので、今回Go言語のバックエンド

元記事を表示

goでデザインパターン

使い道がありそうだなあと思ったパターンのメモ。

# builder
– 自身を返してメソッドチェイン

“`go
package main

type email struct {
from, to, subject, body string
}
type EmailBuilder struct {
email email
}
func (b *EmailBuilder) From(from string) *EmailBuilder {
b.email.from = from
return b
}
func (b *EmailBuilder) To(to string) *EmailBuilder {
b.email.to = to
return b
}
func (b *EmailBuilder) Subject(subject string) *EmailBuilder {
b.email.subject = subject
return b
}
func (b *EmailBuilder) Body(body string) *EmailBuilder {

元記事を表示

【Go】簡易 fuzzylauncher

以前の記事: [【PowerShell】 peco を使った簡易ランチャ](https://qiita.com/AWtnb/items/d2842d86c5482832daa5)

最初はうまく動作してはしゃいでていたものの、なんとなくモッサリした動作が気になってきた今日この頃。[もってこいのライブラリ](https://github.com/ktr0731/go-fuzzyfinder) も見つけられたので勉強も兼ねて go で書き直してみました。

### コード

“`fuzzylauncher.go
package main

import (
“bufio”
“fmt”
“os”
“os/exec”
“path/filepath”
“sort”
“strings”

“github.com/karrick/godirwalk”
“github.com/ktr0731/go-fuzzyfinder”
)

const (
dataPath = `C:\Personal\launch.txt`
)

func main() {
if !isVaridPat

元記事を表示

Hyperledger Fabric [asset]ソースコードとダミーデータをgitへ上げました

# 共有する
Goソースコード、Shellスクリプト、ダミーデータ(1万レコード)、PostgreSQLのyamlファイルをgitへアップロードしました。
https://github.com/settembre21/asset

以下の投稿に関連するものです。
[Hyperledger FabricのKeyゾンビ化を防ぐ(ソースコード掲載)](https://qiita.com/settembre21/items/b8f2a0df79750efd0db6)
[Hyperledger Fabricで個人情報をクエリする(RDB連携)](https://qiita.com/settembre21/items/af5c4e2e142f21201866)
[Hyperledger FabricのGetHistoryForKeyを利用した資産のトレース](https://qiita.com/settembre21/items/dffef94af71b7e880691)
[Hyperledger FabricのState DBをPostgreSQLを使って初期化する](https://qiita

元記事を表示

Goで数値型配列の中身を高い順にsort(並び替え)する方法

## はじめに
Goで数値型配列の中身を高い順にsortしてみました。

## コード

“`go:main.go
package main

import (
“fmt”
“sort”
)

func main() {

slice := []int{1,4,3,5,6,19,21,7,8,10,49}

sort.Sort(sort.Reverse(sort.IntSlice(slice)))←これがPoint
fmt.Println(slice)

}
“`

“`
// 出力結果
[49 21 19 10 8 7 6 5 4 3 1]
“`
AtCoderなんかの問題を解くときに使ったときは

“`go:main.go
package main

import (
“fmt”
“sort”
)

func main() {
var A int
slice := []int{}

for i := 0; i < 10; i++ { fmt.Scan(&

元記事を表示

goroutineでシェルっぽくバッチ処理を書いてみた

# 小さく分割してきれいにつくりたい、けど効率も重視したい
シェルや関数型プログラミングのように、部品の組み合わせでプログラムを書きたい。しかし、パイプラインや遅延評価みたいな仕組みがないと、ループ回数だけ増えてしまって効率が悪い。仕方がないから、1つの処理の中に全機能まとめてしまおう。そんな経験はないでしょうか。

# それgo言語でできる!
go言語のgoroutineとchannelを勉強してみてまさにこれだと思い、go言語の勉強を兼ねて作ってみました。

# 前提環境
– goバージョン:1.14

# 完成イメージ
シェルっぽく使いたいということで、シェルを意識した設計にしています。メソッドは基本的にchannelに関連付けたメソッドとして定義し、戻り値にはchannelを返すようにしました。そうすることで、メソッドチェーンをシェルのパイプに見立てて使えます。ただし、起点となる処理はchannelにすると逆に使いにくいので、普通に値を引数をとるようにします。

“`go:
slip.Cat(“data/slip.csv”).Filter().Sort()
“`

また、2

元記事を表示

Goでint型のスライスを昇順と降順でソートする方法

##はじめに
intのスライスをソートする方法が分からなかったので調べてみました。
今回使用するスライスは、こちら

“`
s := []int{4, -1, 12, -26, 5}
“`

###昇順(小さいから大きい)でソート
“`
sort.Ints(s)
fmt.Println(s)
// [-26 -1 4 5 12]
“`
###降順(大きいから小さい)でソート

“`
sort.Sort(sort.Reverse(sort.IntSlice(s)))
fmt.Println(s)
//[12 5 4 -1 -26]
“`
##おまけ
スライスの中から一番大きい数字や小さい数字を見つけるコードも書いてみます。
###一番大きい数字を出力

“`
sort.Ints(s)
//合計の要素数から-1(5-1=4番目の数字)
fmt.Println(s[len(s)-1])
//12
“`
###一番小さい数字を出力

“`
sort.Ints(s)
//スライスの0番目
fmt.Println(s[0])
//-26
“`

##さいごに
調べてみると、比

元記事を表示

カスタムイメージを使ってCodebuildでbuildするまで。

マニュアル見ろよ、という話しではあるんだが。
私はなんか突っかかるまでマニュアル読まないタイプの人なので。

# やりたかったこと

– マネージドイメージ内でカスタムイメージをビルド。ビルドしたイメージをECRにPush
– カスタムイメージ内で、golangのpackeageをビルド。ビルドした生成物をS3にアップロード

# カスタムイメージの作成まで

## DOWNLOAD_SOURCEでi/o timeout for primary source
GitHubへのoAuth設定をCodeBuildから行うと、こんなエラーが出る。GitHub側で問題おきていることは考えにくいので、CodeBuild側の問題。

“`
CLIENT_ERROR: Get https://github.com/XXXXXXXXXXX/sample.git/info/refs?service=git-upload-pack:
dial tcp 13.114.40.48:443: i/o timeout for primary source
“`

CodeBuildはVPC内に設定してあり、

元記事を表示

Hyperledger FabricのKeyゾンビ化を防ぐ(ソースコード掲載)

# Hyperledger FabricでState DBのKeyを再利用させない(実はできない)

Hyperledger Fabric(以下HF)で一度削除(`DelState`)したKeyで再登録(`PutState`)したらどうなるんだろう?という疑問から、次のようなシナリオを考えました。またミラ・キータ(Mira Qiita)に登場してもらいます。

1. Mira QiitaをKey=”JMYMIRAGINO200302″で登録(`PutState`)
2. 1のKeyでクエリ(`GetState`)
3. 1のKeyで削除(`DelState`)
4. 1のKeyでクエリ(`GetState`)
4. 1のKeyで登録(`PutState`)
5. 1のKeyで履歴を参照(`GetHistoryForKey`)

どうなるんだろう?

あと、この投稿にてGoで書いたソースコードやシェルスクリプトを掲載します。

# 環境について
動作環境については次の通りです。

– Ubuntu 18.04.4 LTS
– docker-compose 1.26.0
– docker

元記事を表示

Go のオレオレ linter を golang.org/x/tools/go/analysis 使って作成する

## ゴール

* `x/tools/go/analysis` package を使って、linter を実装できるようになる

## 背景

Go は言語本体の簡潔さ、強力さはもちろんのことですが、周辺のツール/環境が充実していることでも知られています。
linter についても、標準で `go vet` や、標準の linter の runnner として、`golangci-lint` というサードパーティのツールも利用されています。

さらに、Go ではそのような linter 、及び静的解析を実装するためのライブラリが準標準 (`golang.org./x` 以下)で公開されています。
今回は、そのライブラリを使ってユーザ独自の linter を作る方法を紹介します。

## 環境

* go1.14.4
* skeleton v1.2.1

## gostaticanalysis/skeleton で linter のひな形を作る

`go/analysis` package を使った linter の作成は、以下のツールでスケルトンを作成することができます。

元記事を表示

CORS(preflight request)にハマったけど解決した話

CORS(preflight request)にハマったので、解決方法を備忘録として残しておきます。

# エラーが起きた場面
異なるドメインからHttpリクエストを送る場合は、CORSに注意だよなぁ。
サーバー側のレスポンスで、ヘッダーをつけてあげれば良いんだろう。
簡単じゃん。

## クライアント側
何かしらのデータをjasonでPOSTする。

“`js
var xmlhttp = new XMLHttpRequest();
xmlhttp.open(“POST”, API_ENDPOINT);
xmlhttp.setRequestHeader(“Content-Type”, “application/json;charset=UTF-8”);
xmlhttp.send(JSON.stringify(data));
“`

## APIサーバー側
サーバー側では、レスポンスのヘッダーを付けてあげる。

“`go
func (a *API) HandleFunc(w http.ResponseWriter, r *http.Request) {
//略…

w.He

元記事を表示

go修行10日目 embeded

## embeded

– Go言語には継承がなくてその代わり
– VertexをVertex3Dがembededしている

“`golang

package main

import “fmt”

type Vertex struct{
x, y int
}

func (v Vertex) Area() int{
return v.x * v.y
}

func (v *Vertex) Scale(i int){
v.x = v.x * i
v.y = v.y * i
}

type Vertex3D struct{
Vertex
z int
}

func (v Vertex3D) Area3D() int{
return v.x * v.y * v.z
}

func (v *Vertex3D) Scale3D(i int){
v.x = v.x * i
v.y = v.y * i
v.z = v.z * i
}

func New(x, y, z int) *Vertex3D{
return &Vertex3D{Vertex{x, y}, z}
}

元記事を表示

fish shell + anyenvでのGo開発環境構築

fish shell + anyenvというパターンでのGoの環境構築の記事がなかったので、備忘録としてまとめます。

実行バージョン
– `fish 3.0.2`
– `anyenv 1.1.1`

# anyenvでのgoenvのインストールと設定

まずanyenvでGoのバージョン管理システムのgoenvをインストールします。

“`bash
$ anyenv instal goenv
“`

そして、goenv用の環境変数やaliasの設定をfish shellの設定ファイル`~/.config/fish/config.fish`に追記します。この部分がzshやbashとは違うので注意です。

“`bash
set -x GOENV_ROOT “$HOME/.anyenv/envs/goenv”
set -x PATH $PATH “$GOENV_ROOT/bin”

set -gx PATH “$GOENV_ROOT/shims” $PATH
set -gx GOENV_SHELL fish
source “$GOENV_ROOT/libexec/../complet

元記事を表示

【Go】並行処理の「拘束」で安全に並行処理を扱う

オライリーの[「Go言語による並行処理」](https://www.amazon.co.jp/dp/4873118468)を参考に、
実務で使ってみてなるほどと思った内容です。
今日初めて並行処理を書いたのでまだまだ浅い理解ですがメモとしてまとめてみます。

# 拘束とは
拘束は、チャネルの読み書きを制限することにより、安全にチャネルを扱えるようにするという考え方です。
チャネルの扱いには注意が必要で、例えばチャネルに対する不適切な書き込みや、
チャネルを閉じる作業の漏れや重複により、デッドロックやpanicが起きてしまう可能性があります。
そうしたことを防ぐために、並行処理を関数にまとめてチャネルに対する権限を制限し、
関数の呼び出し側が安全に並行処理を扱えるようにするという考え方です。

# コード
## 「拘束」を使わない場合
“`go
package main

import (
“fmt”
“time”
)

type processAResult struct {
Message string
Error error
}

type processBResul

元記事を表示

gRPC: メソッドの呼び出しと HTTP/2 フレームの関係

# この記事について
この記事では gRPC の Go言語実装である grpc-go を元に、 gRPC のメソッド呼び出しが HTTP/2 を使ってどう実現されているかをまとめる。

– 環境情報
– Go 言語のバージョン : 1.14.4
– grpc-go のバージョン : 1.29.1

# はじめに

この記事では、以下のようなシンプルな protobuf の定義(*.protoファイル)を用いて確認をしている。

“`protobuf
syntax = “proto3”;
package helloworld;

service Greeter {
// Unary RPC
rpc SayHello (HelloRequest) returns (HelloResponse) {}
// Server streaming RPC
rpc SayHello_SS (HelloRequest) returns (stream HelloResponse) {}
// Client streaming RPC
rpc SayHello_CS (

元記事を表示

GraphQLについてまとめてみた

# GraphQLとは
Facebookにより開発された、APIのためのクエリ言語であり、既存のデータを使用しクエリを実行するためのランタイム
GraphQLは、API内のデータの完全で理解可能な説明を提供し、クライアントに必要なものだけを正確に要求する力を与え、APIの長期的な発展を容易にし、強力な開発者ツールを有効にする (翻訳)
[GraphQL](https://graphql.org/)

### クエリ言語とスキーマ言語
GraphQLは、一般的にクエリ言語とスキーマ言語から構成される
クエリ言語(フロント側)は、GraphQL APIのリクエストのための言語であり、データ取得に関連するquery、データ更新に関連するmutation、サーバサイドからのイベント通知を行うsubscriptionの3種類がある
一般的にはqueryとmutationを利用する

スキーマ言語(サーバー側)は、GraphQL API の仕様を記述するための言語であり、記述したスキーマに従ってレスポンスを生成する

| | REST | GraphQL |
| ——– | —–

元記事を表示

sqlxのNamedQueryをIN句に適用する方法(名前付きクエリ)

# 1. はじめに
Goの[sqlx](https://github.com/jmoiron/sqlx)でSQLを書く際に、IN句にNamedQueryを使おうとしてハマったので簡単な例文を書きます。
例はPostgreSQLで書いてます。

# 2. 例文
コネクション生成

“`Go
db, err := sqlx(“postgres”,”接続情報”)
if err != nil {
log.Fatal(err)
}
“`

NamedQuery→PreparedStatementまでの変換

“`Go
baseQuery := `SELECT * FROM users WHERE id IN (:userID) AND name = :userName`

bindParams := make(map[string]interface{})
bindParams[“userID”] = []int{1, 2}
bindParam[“userName”] = “Taro”
users := &User{}

query, params, err := sqlx.Na

元記事を表示

【Go言語 GitHubActions】linterで特定のファイルを無視する方法

調べてもあまりでてこなかったのでメモ用に残す

“`yaml

on:
pull_request:
paths:
– ‘**.go’

jobs:
lint:
name: runner / lint
runs-on: ubuntu-latest
steps:
– uses: actions/checkout@v2
– uses: reviewdog/action-golangci-lint@v1
with:
github_token: ${{ secrets.github_token }}
tool_name: golint
# ここに–skipをつけて指定する
golangci_lint_flags: “–disable-all -E golint –skip pkg/”
level: warning
filter_mode: nofilter
fail_on_error: true

元記事を表示

Hyperledger Fabricで個人情報をクエリする(RDB連携)

# Hyperledger Fabricのchaincodeで個人情報を検索します
Hyperledger Fabric(以下HF。HLFが正式な略称なのだろうか?)の`query`メソッドで個人情報を問い合わせます。前に投稿しましたが、HFの`State DB`に個人情報を持つのはよろしくないので、個人情報はRDB(PostgreSQL)から引き当てることにします。
// 最近はHFでも`chaincode`を`Smart contract`と呼ぶようになっている気がします。

# 環境について
動作環境については次の通りです。前回の投稿と(ry

Ubuntu 18.04.4 LTS
docker-compose 1.26.0
docker 19.03.11
HF 2.1.1
go 1.14.4
PostgreSQL(Dockerイメージ) 12.3(latest)

# 下準備
下準備をします。

### RDBのテーブル定義
新しく個人情報用のテーブルを定義しました。DB`asset`内に`owner`テーブルを定義しました。

“`sql
asset=# \d owner

元記事を表示

OTHERカテゴリの最新記事