Go関連のことを調べてみた2022年05月22日

Go関連のことを調べてみた2022年05月22日

【備忘録】Golangでenum風に利用する

### Golangでenum風に利用する。
Golangではenum型が提供されていないため、実装を工夫する事でenum風に利用する事ができます。

“`golang:main.go
package main

import “fmt”

type Animal int

const (
Unknown Animal = iota
Dog
Cat
Horse
Lion
Tiger
Rabbit
)

func (e Animal) Names() []string {
return []string{
“unknown”,
“犬”,
“猫”,
“馬”,
“ライオン”,
“トラ”,
“兎”,
}
}

func (e Animal) String() string {
return e.Names()[e]
}

func main() {
fmt.Printf(“動物の名前は? %+v\n”, Dog)
fmt.Printf(“動物の名前は? %+v\n”, Cat)
fmt.Printf(“動物の名前は? %+v\n”, Ti

元記事を表示

WebTransportでもWarp(超低遅延配信)がしたい!

# 1秒未満の超低遅延配信が見れます
[デモサイト](https://demo-webtrans.tokishirazu.llc/warp-demo/index.html)、最新のChromeでのみ動きます。[Big Buck Burmy](https://peach.blender.org/)をストリームで繰り返し配信しています。
[ソースコード](https://github.com/alivelime/sample_webtransport/tree/master/warp-demo) : サーバー側のソースはGoのみです。(aioquicがやっぱり不安定?) 環境構築周りのファイルはないです

既知の問題
– ビットレートは500kです (GPU付きインスタンスは高いから仕方ないよね)
– 同一のブラウザで複数開くと挙動がおかしくなるかもしれません

gRPCのstream方式でCSV出力処理を実装する

# はじめに
マイクロサービス方式の開発で選定されることが多いgRPCを用いてCSV出力処理を実装してみました。

# gRPCの通信方式

* Unary RPCs
シンプルな通信方式。1つのrequestに対して1つのresponseが返ってくる方式になります。gRPCの通信方式の中で一番REST方式に近いものになると思います。
* Server streaming RPCs
クライアントからの1つのrequestに対して、サーバーから複数のresponseを返すことができる通信方式になります。サーバーからクライアントに向けてサイズの大きいファイルなどを送信したい場合に使うことが多いと思います。
* Client streaming RPCs
クライアントからの複数のrequestに対して、サーバーから1つのresponseを返す通信方式になります。クライアントからサーバーに向けてサイズの大きいファイルなどをアップロードする際に使うことが多いと思います。
* Bidirectional streaming RPCs
クライアントからの複数のrequestに対して、サーバーから複数

元記事を表示

[go入門]Pythonと比べてgoに親しむ[スクレイピング]

# goでスクレイピング

、初見の`go`でスクレイピングプログラムを書いてみます。

## 環境
– MacBook Pro 2021 14inc
– macOS Montrey 12.0
– go version 1.182

## インストール
今回はバージョン管理のことは考えず、`homebrew`でインストールします。

“`bash
$ brew install go
“`

インストール確認

“`bash
$ go version
go version go1.18.2 darwin/arm64
“`

作業ディレクトリを用意したら

“`bash
go mod init ディレクトリ名
“`

を実行しておきましょう。モジュールを使用する際に必要になります。

## 通信部分
スクレイピングの最初の工程はurlからhtmlを獲得することです。
goでは組み込みモジュールの`net/http`が用意されています。

“`go
res, err := http.Get(url)
“`

Pythonなら
“`python
requests.get(

元記事を表示

Lambdaでgoを取り扱う

## Functionを作る

“`handler.go
package main

import (
“context”
“fmt”

“github.com/aws/aws-lambda-go/lambda”
)

type MyEvent struct {
Name string `json:”name”`
}

func tes(ctx context.Context, name MyEvent) (string, error) {
return fmt.Sprintf(“Hello %s!”, name.Name), nil
}
func main() {
lambda.Start(tes)
}
“`

## Zipを作る
– LambdaでGoを扱う場合、go buildしたバイナリファイルをzipにしてLambdaFunctionへアップロードする必要がある

“`
go mod init go-lambda
go get github.com/aws/aws-lambda-go/lambda
go mod tidy
GOOS=linux go bui

元記事を表示

Twitter Oauth1.0認証方法メモ [golang]

## Twitter開発者登録
1. プロジェクト作成
1. アプリ作成
1. API KeyとAPI Secretを控えておく(ドキュメントではConsumer KeyとConsumer Secretと記載されている)
1. Setting画面からOAuth1.0aを有効化する
1. App permissionsを変更する(投稿処理はRead and write)
1. Callback URI/Redirect URLを設定する
1. 認証画面でユーザーが認証実行した後に遷移するURL

## Go言語での実装

**認証画面URLの生成**
“`go
import (
“net/url”

“github.com/dghubble/oauth1”
“github.com/dghubble/oauth1/twitter”
)

// oauth1のconfig作成
conf := &oauth1.Config{
ConsumerKey: [ConsumerKey],
ConsumerSecret: [Consume

元記事を表示

google-cloud-go の使ってみた操作まとめ

前から Google Cloud Storage には興味があったのでラーメンの写真を記録するサービスを作るのに使ってみました。機能ごとにもリンクを貼りますが、ひとまず公式ドキュメントとリポジトリは以下になります。

**実行環境**
“`
go: v1.18
cloud.google.com/go/storage: v1.22.0
“`
https://pkg.go.dev/cloud.google.com/go/storage

https://github.com/googleapis/google-cloud-go

※ 全体を通してエラーハンドリングは省略しています。
## 事前準備:クライアントの作成
クライアントの作成に使用するため、事前に GCP のアカウント作成と鍵ファイルをダウンロードしておきます。

今回はダウンロードした鍵ファイルを引数にとり [WithCredentialsFile] を使用します。(https://pkg.go.dev/google.golang.org/api/option#WithCredentialsFile)

“`
// これ

元記事を表示

LeetCodeのRoman to Integer を解いてみた

## LeetCodeを解いた動機
最近転職活動をしているのですが、面接のコーディング試験の出来が良くなくLeetCodeを解くように勧められました。
また個人の課題として開発進捗が遅いことがあって、LeetCodeの答えには擬似プログラミングがあるので合わせて練習したいなと思いました。
## 問題内容
こちら参照
https://leetcode.com/problems/roman-to-integer
## 自分で書いた擬似プログラミング
今回メモを消してしまったため、次回以降記載

## 自分で書いたコード

“`golang.go
func romanToInt(s string) int {
symbolArray := map[string]int{
“I”: 1,
“V”: 5,
“X”: 10,
“L”: 50,
“C”: 100,
“D”: 500,
“M”: 1000,
}
var splitS = strings.Split(s, “,”)
returnInt := 0

isSkip := false
for i, _

元記事を表示

【備忘録】Golangで日付の操作を実施する。

## 日付の操作
“`golang:main.go
package main

import (
“fmt”
“time”
)

func main() {
n := time.Now()

// fmt.Println(n.Format(“2006-01-02 15:04:05”))
year := n.Format(“2006”)
month := n.Format(“2006-01”)
day := n.Format(“2006-01-02”)
hour := n.Format(“2006-01-02 15”)
min := n.Format(“2006-01-02 15:04”)
sec := n.Format(“2006-01-02 15:04:05”)
fmt.Println(“year: “, year)
fmt.Println(“month: “, month)
fmt.Println(“day: “, day)
fmt.Println(“hour: “, hour)
fmt.Println(“min: “, min)
fmt.Prin

元記事を表示

GoでCRUD処理のREST APIを作ろう〜Reactを添えて〜

# はじめに
– 参考文献にも掲載しています以下記事を自分の勉強用にアレンジしてまとめ直したものになります。こちらの記事の方がハイレベルな実装になっていますが、もう少し簡素化してGoでAPIを作る大枠を理解したいと思ったのが執筆の動機です。そのためフロント側は簡単な説明のみです。ご了承ください。

https://dev.classmethod.jp/articles/go-sample-rest-api/

– バックエンド側はDockerを使用していますが、環境構築方法について本稿では触れません。こちらは以下記事をちょろっとカスタムして作っています。

https://zenn.dev/ajapa/articles/443c396a2c5dd1

– 網羅的な説明はしていないので、まずリポジトリをざっと見て処理の流れを追ってもらった上で読み進めていただいた方が読みやすいと思います。README.mdにも起動方法を記載しております。**“`masterブランチ“`は記事よりも手を加えてしまっているので、“`for_qiitaブランチ“`を参照ください。**

https://

元記事を表示

自分の得意なプログラミング言語でSymbolブロックチェーンを動かす方法

Symbolブロックチェーンはプログラミング言語を問わずスマートコントラクトが実装できるように設計されています。ところが、現在リリースされているsdkアルファ版はJavascriptとPythonのみサポートです。では、他の言語ではまだアプリ開発できないのでしょうか?と言われればそうでもありません。

**組み込みされたデジタル装置で署名**したかったり、**マルチシグ化した連署者アカウントの署名をサーバ側で機械的に実施**したり、**IoTなどほぼ単一のトランザクションを定期的に実施**したり、複雑なことは必要ないユースケースが実はたくさん眠っているかもしれません。

ここでは、そういった「あとはSymbolブロックチェーンにトランザクション投げるだけなんだが」といった方を対象にトランザクションの作り方を解説します。
なお、トランザクションの送信以外(例えばモザイクの生成やマルチシグの組成など)はウォレットなどを利用して準備する前提で進めます。

後記:
Symbol/NEMのコアチームからのSDKについての考え方を転載しておきます。
> 私たちは、コミュニティが(SDKではなく)直

元記事を表示

Golangでform dataから受け取った画像をS3にアップロード

# はじめに
GolangでAPIサーバーを構築しており、APIで受け取った画像データをS3にアップロードする処理を実装したので、方法を共有しようと思います。初心者Golangerなので受け取った画像をリサイズなどせずにそのままアップロードする方法しかわからなかったので、その点は悪しからず。むしろ方法をご教示いただきたい所存。。。S3以外の処理は省略します。

# 完成コード
“`golang:s3Handler.go
func (app *Application) imageUpload(w http.ResponseWriter, r *http.Request) {
err := godotenv.Load(fmt.Sprintf(“./%s.env”, os.Getenv(“GO_ENV”)))
if err != nil {
log.Fatalln(err)
}
ak := os.Getenv(“AWS_ACCESS_KEY”) // .envのAWS_ACCESS_KEY
ask := os.Getenv(“AWS_SECRET_ACCESS

元記事を表示

Go製のORM である Facebook / ent を使ってみたらなかなかイケてた話

# はじめに
Facebookが開発しているGo製のORMであるentを業務で使い始めたので、基本的な構文などをまとめます。

# 導入
– CRUD操作についての確認
https://entgo.io/docs/crud

– validatorの定義方法の確認
https://entgo.io/docs/schema-fields/#validators

– migrationの実行方法及びversioned migrationの調査
https://entgo.io/docs/migrate#auto-migration
https://entgo.io/docs/versioned-migrations#generating-versioned-migration-files
https://entgo.io/docs/versioned-migrations#apply-migrations

– association(entだとedge)の定義方法の確認
https://entgo.io/docs/schema-edges/

# datetimeを更新しようとした

元記事を表示

Github ActionsでGolang & gRPCのテストを実行する

# はじめに
golangとgRPCを用いたapiの自動テストを実行するための設定手順です。

# protoc のセットアップについて

CIコンテナ内で `protoc` コマンドを利用できるようにするためのセットアップをおこなった際に、少しハマりどころがあったので説明をしておきます。

以下の様に自前でprotocの環境構築を行うと、protocコマンド実行環境整備完了後に、なぜかMySQLの`connection refused`エラーが発生した。

* MySQLのエラー

“`sh
curl: (7) Failed to connect to 127.0.0.1 port 3307: Connection refused
“`

* protoc実行環境を自前で整備しようとしているjob

“`yml
– name: Set up protoc
run: |
sudo apt-get update && sudo apt-get upgrade -y
sudo apt-get install -y c

元記事を表示

【Go】VSCodeでGo言語の開発環境を整えてみよう【Golang】【主にWindows・初心者向け】

#### Visual Studio Code(VSCode)でGoによる開発しよう

 クラウドやコンテナ界隈でもよく聞くGo言語。最近入門したので備忘録を兼ねて、このエントリではVSCodeを使ったGo開発環境構築の手順を記してみます。
 以下、主にWindowsを想定していますが他のOSでもそれほど変わりませんので、適宜読み替えてください。

余談ですがGo公式のブログには[Go’s New Brand](https://go.dev/blog/go-brand)記載のカラーや[Go fonts](https://go.dev/blog/go-fonts)記載の公式Goフォントなどもあり、スライド資料作成や画像作成などに使えます。ロゴやマスコットのゴーファー君も透過PNGの画像が用意されていてありがたいです。

#### Go言語のインストール手順

 ネット上でも各所に載っていますが、この記事でもまとめてみます。

https://go.dev/

– 公式サイトの[Downloads](https://go.dev/dl/)ページから、Windws/Mac/Li

元記事を表示

【備忘録】Golangで文字列型(YYYY-MM)から月を取得する

“`go:main.go
package main

import (
“fmt”
“strconv”
)
func main() {
// YYYY-MM形式から月を保存する。
str := “2021-04”
str2 := str[5:]
month, _ := strconv.Atoi(str2)
fmt.Println(“month: “,month)

str = “2021-12”
str2 = str[5:]
month, _ = strconv.Atoi(str2)
fmt.Println(“month: “,month)
}
“`

“`shell:実行結果
~/go/src/array_slice $ go run main.go
month: 4
month: 12
“`

元記事を表示

【備忘録】GolangでMapを利用する。

## GolangでMapを利用する。

“`go:main.go
package main

import “fmt”

func main() {
// ユーザIDと名前のMapを作成する。
userIDToNameMap := map[int]string{123: “tanaka”, 234:”takeru”, 345: “kkfactory”}
fmt.Println(“userIDToNameMap: “,userIDToNameMap)

// Keyに対するValueを取得する。
fmt.Println(“userIDが123の値は”, userIDToNameMap[123])

// 要素を追加する。
userIDToNameMap[456]=”takeshi”
fmt.Println(“userIDToNameMap: “,userIDToNameMap)

// Valueの値を更新する
userIDToNameMap[123]=”kouji”
fmt.Println(“userIDが123の値は”, userIDToNameMap[12

元記事を表示

【備忘録】Golangでスライスを利用する。

## Golangで1次元スライスを利用する

“`golang:main.go
package main

import “fmt”

func main(){
// 1次元スライス
s1 := []int{1, 2, 3}
s2 := []int{5, 6, 7}

// 1次元スライスに要素を追加する。
s1 = append(s1, 4)

fmt.Println(“s1: “,s1)

// 1次元スライスに1次元スライスを追加する。
s1 = append(s1, s2…)

fmt.Println(“s1: “, s1)
}
“`

“`shell:実行結果
~/go/src/array_slice $ go run main.go
s1: [1 2 3 4]
s1: [1 2 3 4 5 6 7]
“`

## Golangで2次元スライスを利用する
“`golang:main.go
package main

import (
“fmt”
)

func main() {
s1 := [][]int{{1

元記事を表示

インターフェースとローカルな構造体

ginのsessionsを見ていた際にこんなのがあったのでメモとして。
外部にはインターフェイスとして公開し内部ではローカルな構造体として定義しそれで処理を行なっている。

“`golang
type Session interface {
MethodA()
MethodB()
}

type session struct {
}

func (s *session) MethodA() {
}

func (s *session) MethodB() {
}
“`

元記事を表示

GOの構造化ロガーlogrusが非推奨になったため代替ロガーZerologを使ってみる

# はじめに

昨今ログ集計用に構造化ログは必要不可欠となっており、logrusとはGO用の構造化ロガーで多くのプロジェクトで使われていました。

しかし現状はメンテナンスモードとなっており、今後新機能は追加される予定はないようです。(※以下原文)

README原文から抜粋
>Logrus is in maintenance-mode. We will not be introducing new features.
This does not mean Logrus is dead. Logrus will continue to be maintained for security, (backwards compatible) bug fixes, and performance (where we are limited by the interface).

https://github.com/sirupsen/logrus

REAEME原文から抜粋
>Logrus would look like those, had it been re-designed with

元記事を表示

OTHERカテゴリの最新記事