Go関連のことを調べてみた2021年08月24日

Go関連のことを調べてみた2021年08月24日

【Golang】改行などをエスケープして表示したい。【代入済み変数の文字列をエスケープ出力】

> 改行やタブ入りの文字列の変数をプリントする際に、改行させずにエスケープして表示させたい。

## TL; DR (今北産業)

1. `fmt.Printf()` で `%#v` フォーマットを使う。
1. `fmt.Printf(“%#v\n”, varWithLFandTab)`

“`go:3)実際の動くサンプル
package main

import (
“fmt”
)

func main() {
mySampleVar := “my\tsample\ndata”

fmt.Println(“1)”,mySampleVar)
fmt.Printf(“2)%v\n”, mySampleVar)
fmt.Printf(“3)%#v\n”, mySampleVar)
}
// Output:
// 1) my sample
// data
// 2)my sample
// data
// 3)”my\tsample\ndata”
“`

– [オンラインで動作をみる](h

元記事を表示

16進数、バイナリ、base64の相互変換をCLIとGo(Golang)でやる

要はこれをやるのだ(相互変換)

“`plaintext
hexadecimal
↓ ↑
binary
↓ ↑
base64
“`

# CLIでやる

まず 16進数 to base64

“`bash
echo “0123456789abcdef” | xxd -r -p | base64 # ASNFZ4mrze8=
“`

base64 to 16進数

“`bash
echo “ASNFZ4mrze8=” | base64 -d | hexdump # 0000000 01 23 45 67 89 ab cd ef
“`

# Golangでやる

“`Go
package main

import (
“encoding/base64”
“encoding/hex”
“fmt”
)

func main() {
hexStr := “0123456789abcdef”

// hexadecimal string -> byte -> base64 string
b64Str, _ := hexToBase6

元記事を表示

AWS SNS/SQSによるメッセージ送受信のサンプル(Go言語)

## 前準備

1. SNSのトピックを作る
– 名前は適当
– タイプは標準
– 他はすべてデフォルト値でOK。
1. SQSのキューを作る。名前は適当、他は
– 名前は適当
– タイプは標準
– 他はすべてデフォルト値でOK。
1. SQSを作ったら、そのSNSサブスクリプションに最初に作ったSNSを追加する

## SNSでメッセージを送信

“`go
package main

import (
“flag”
“fmt”
“github.com/aws/aws-sdk-go/aws/session”
“github.com/aws/aws-sdk-go/service/sns”
“os”
)

func main() {
profile := flag.String(“p”, “”, “AWSの認証に使うProfile。未指定ならdefault”)
msgPtr := flag.String(“m”, “”, “The message to send to the subscribed users of the topic”)
topi

元記事を表示

Go初見が1週間でWebアプリ開発できるか ー1日目ー

今までAPIサーバーとしてNode.jsを用いていましたが、最近話題のGoを使ってみたいと思い、Go初見の状態から1週間でWebアプリを開発できるのかをチャレンジします。
他の使用言語は今まで開発経験があります。

1日ごとにやったことを日記のように書き連ねていきます。

# アプリ仕様書作成

## アプリで解決したい課題
– 就活のとき自己分析が面倒
– 自分のことがよくわからない

## アプリ名
My Google

## コンセプト
ほぼGoogleだけで作る自分だけのGoogle

## アプリ概要
My Googleは自分について検索できる

自分の趣味、好きな食べ物、好きなもの、嫌いなこと、将来やりたいことなど**自分について**を蓄積し、My Googleを賢くする

自分について知りたいことがあればMy Googleで検索しよう

## 開発環境&言語

### フロントエンド
React, TypeScript(node v12.14.1)
### バックエンド
APIサーバー:Go(go version go1.17 windows/amd64)
DB:Fire

元記事を表示

ISUCON11予選参加でubuntu、nginx、mysqlの知識がほぼ0の人がインフラ担当をやろうとした話

## ISUCON11に参加してきました
会社の同僚2人とISUCON11に参加したので雑記
普段全くインフラを触らず、ubuntu、nginx、mysqlの知識もないけどインフラやるぞ、となった人がどういう所でつまづくのかが書いてあるかも

## 当日まで
* ISUCON9予選をまっさらなubuntuでbench叩ける状態にした
* appとdbのサーバーを分けられるようにした
* 計測に必要そうなツールを調べておいた
* nginx.confとmysql.confの辺りは少し見ておいた

## 当日の自分の動き方
* みんなで[予選当日マニュアル](https://gist.github.com/ockie1729/53589a0e8c979198b6231d8599153c70)と[アプリケーションマニュアル](https://gist.github.com/ockie1729/fcb41ade9cb9d2166dd3f53e5179e8a9)の読み合わせをしつつAWSにインスタンスを立てる
* trelloにあらかじめ作っておいたTODOリストを確認し誰がどれをやるを

元記事を表示

Goでゲーム用マップを自動生成してみる

# はじめに
## 概要
Go言語を用いて、ゲーム用のマップの自動生成のプログラムを書いてみます。
本記事では、マップ生成のロジックに当たる部分をメインに記述するため、使用するライブラリ固有の機能やインターフェース等に関する記述は省くこともあります。
そのため全体的なコードは、[GitHubのリポジトリ](https://github.com/KMimura/ColonyGame)を参照してください。
## 使用するライブラリ
[Engo](https://engoengine.github.io/)というGo言語のゲーム作成用ライブラリを用います。
このライブラリは、自分は以前[別の記事](https://qiita.com/KMim/items/aebb9d7a9116bf6294b3)でも用いたものです。
また、記事中のコードで使用している素材画像は、[こちら](https://github.com/KMimura/ColonyGame/blob/master/assets/pics/overworld_tileset_grass.png)です。
# コード
## 単純な地面の生

元記事を表示

Lambda関数(Go)でSlack通知

## はじめに
CICDの一環でGoのLambdaからSlack通知をする仕組みを構築したのでその備忘録を残す。
(CICDという事でリリース作業を想定したSlack通知を作ってみた。また、[AWS ChatbotでSlackからLambda関数(Go)を呼び出す](https://qiita.com/yuta-katayama-23/items/da16e8760bec47d7fd26)の続きで構築した。)

https://github.com/yuta-katayama-23/Go/commit/bcdea5c74a439b1d64e1defe4cec1d30497baba6

## Lambdaの実装
今回はhttp POSTを自分でやるのではなく、[slack-go(Slack API)](https://github.com/slack-go/slack)を利用する

### Slack Appの作成・Tokenの発行
`slack-go`を使うにあたってはSlack Appと認証のためのTokenが必要になるので、それらを作成・発行する
そのやり方は[こちら](https

元記事を表示

【AWS SAM CLI】GoからRubyへの移行

# はじめに

AWS SAM CLIでランタイムにGoを使っているプロジェクトがありましたが、プロジェクトを作った人は退職してしまいました。
私含め、他のメンバーはRubyでの開発が主であり、Goの知識が薄い状態です。
そこで、GoからRubyに書き直してメンテナンスしやすくした時にやった事をまとめました。

# 環境

* SAM CLI, version 1.27.2
* ランタイム, go1.x => Ruby2.7

# 1. Rubyプロジェクトの初期化

`sam init`コマンドを使って新規のRubyプロジェクトを立ち上げました。
ディレクトリ構成は下記のようにしました。

“`text
sam_cli
|
|– sam-app-go # Goで書かれたプロジェクト(既存)
|
|– sam-app-ruby # Rubyで書かれたプロジェクト(新規)
“`

以下は対話型でruby2.7のランタイムを指定して作成している例です。

“`bash
Which template source would you like to use?
1 – A

元記事を表示

【Go】Echoで特定のpathへのリクエストだけログを出力しないようにする

# 概要
例えば、ヘルスチェックのログを出力しているとログが見にくくなるし容量を圧迫するしみたいな状況に陥るので、アプリケーション側ではヘルスチェックのログを出力させないようにする。

# 解決法

以下のようにSkipper optionを使用する。

“`golang
e := echo.New()
e.Use(middleware.LoggerWithConfig(middleware.LoggerConfig{
Skipper: func(c echo.Context) bool {
return c.Path() == “/path/to/health_check”
},
}))
“`

もちろんpath以外、例えばリクエストヘッダーなんかで出力するかどうか決めることもできる。
詳細は以下。

https://github.com/labstack/echo/blob/master/context.go

# 参考

https://echo.labstack.com/middleware/#skipping-middleware

元記事を表示

Go言語のpackage利用で初手躓いた点

昔うっかり買ったので、せっかくだからとGoの勉強してたら、packageを使用してコードを別ディレクトリに分けるあたりでいきなり出鼻をくじかれたので、備忘録的にメモしておく

#TL; DR

プロジェクトについては初手

“`
go mod init プロジェクト名
“`

で `go.mod` ファイル作っとかないとダメ

#起こったこと

Goのファイルにて、下位ディレクトリに作った別のGoファイルから `import` しようとしたところ

“`
package importしようとしたディレクトリ名 is not in GOROOT
“`

とか言われてエラー吐かれた

基本的には講座の通り書いてたはずなのに、講座で特に触れられてないエラー出てきて初学者大混乱

# 取った対応

仕方ないので “is not in GOROOT” あたりの文言でぐぐって何が原因なのか探ってみると、出てくるのはPATHや環境変数あたりの話になる

個人的には「PATHを通す」自体はわかるものではあるんだけれど、学習してると参考書内の記述や講座で喋ってる内容に「PATHを通しておいてくれ

元記事を表示

[ AWS EKS編 ] AWS Fargate & ECR で Golang の Webアプリをデプロイする

# はじめに
コンテナ基盤でwebサービスを運用する際には、kubernetesというコンテナオーケストレーションサービスを用いることが多いそうなので、kubernetesの基本的な部分に関して学習をしたのち、
AWS EKSにてwebアプリをデプロイしてみた。

# kubernetesについて
kubernetesの基本的な概念について把握をするために、まずはじめに公式のチュートリアルをざっとこなしてみた。

https://kubernetes.io/ja/docs/tutorials/

公式チュートリアルを一通りこなした後は、EKSにてデプロイすることに挑戦した。
以前、AWS ECSにてコンテナ基盤でwebアプリをデプロイしたことがあったため、
デプロイするための大まかな流れについてはイメージがしやすかった。

# EKSにデプロイ
AWS EKSへのデプロイについては基本的にAWSの公式ドキュメントを参考にして試行錯誤しながら行なった。

## 事前準備
EKSのリソースを操作するためには、ローカル上で実行する、 `kubectl` , `eksctl` コマンドをインス

元記事を表示

go func(){ ••• }()の最初と最後の丸括弧の使い方(メモ)

Go言語の勉強をしていて、時折出現するgoroutineを使用した無名関数。
例えば、以下のようなmainからAddメソッドに値を渡している処理です。

“`go
func main() {
for i := 0; i < 50; i++ { go func(t int) { dc.Add(t) }(i % 2) } } func (dc *DoubleCounter) Add(t int) { dc.commandCh <- t // commandChはチャンネル } ``` 初めにこれを目にした時、go func( ){ 処理 }( )の初めの丸括弧に記載されている(t int)、最後の丸括弧に記載されている(i % 2)がどういった挙動をしているかわかりませんでした。 しかし、デバックして追っかけてみると、Addメソッドには0と1しか値として渡っていませんでした。 ということは、先程の無名関数は変数iの値をまずは2で割って、そのあまりを今度は無名関数の初めの括弧に渡してあげて、そこで変数tに値が入ってその値がAddメソッドに流れていくということになり

元記事を表示

Goを使ってみた

Goを使ってみた

最近はやりのGoを触ってみるべくチャレンジ

まずはGoをWindowsマシンにインストール

https://golang.org/dl/ のMicrosoft WindowsからGoをダウンロード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653035/4a39a67e-3b30-8c49-4877-1f517ae7e3a0.png)

普通にインストール実施

適当なファイルを作成

“`main.go
package main

import “fmt”

func main() {
fmt.Printf(“hellohogefuga\n”)
}
“`

go run コマンド実行

“`cmd
>go run main.go
hellohogefuga
“`

vscodeで実施

するとこんなエラーが。
“`
go: go.mod file not found in current directory or any parent direc

元記事を表示

【Go言語】外部パッケージをインポートする方法

Go言語初心者なんですが、どうしても外部パッケージをインポートするとき失敗でした。
パッケージが見つからないっていうエラーが出ました。

やっとこの問題が解決しましたので、ここでメモします。

何でもいいですが、サンプルとして、
この記事はBinance APIパッケージをインポートする。

####1. パッケージをインストールする

ターミナルで`go get`実行する

“`
go get github.com/adshao/go-binance/v2
“`

####2. インストールしたパッケージをインポートする

“`go:test.go
import (
“github.com/adshao/go-binance/v2”
)
“`

####3. パッケージが見つからなくて、エラー出ます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342464/ebb1c252-ebc0-1f13-f04b-c73536a19ee9.png)

####4. 原因

ター

元記事を表示

hashicorp/logutilsを使ってログレベル指定のないログを非表示にするtips

Go言語のロガー実装の1つに[hashicorp/logutils](https://github.com/hashicorp/logutils)というシンプルなライブラリがあります。Goの標準パッケージ `log` を拡張するようなもので、覚えることも少ないですし、他のライブラリと組み合わせやすい点もメリットです。

利用例は次のようになります。

“`go
package main

import (
“log”
“os”

“github.com/hashicorp/logutils”
)

func main() {
filter := &logutils.LevelFilter{
Levels: []logutils.LogLevel{“DEBUG”, “WARN”, “ERROR”},
MinLevel: logutils.LogLevel(“WARN”),
Writer: os.Stderr,
}
log.SetOutput(filter)

log.Print(“[DEBUG] Debugging”) // 表示されない
log.Print

元記事を表示

【Golang】ファイル作成→書き込み→読み込み、の一連の流れ

# はじめに

Golangでテスト用に一時ファイルを生成し、中身を書き込み、最後に中身を読み込みたい、となった際にはまったので備忘録として残す

結論からいうと、ファイル読み込み時には、ファイルの先頭から読み込まれるようにすると確実っぽい

# 環境
– go v1.13

# 一時ファイルの作成

“os.Create“でファイル名指定してファイルを作成
一時ファイルなので、“defer os.Remove(f.Name())“で処理完了後にファイル削除するようにする

※Goバージョン1.16以降だと“os.CreateTemp“という一時ファイル生成用メソッドが用意されているっぽい
が、こちらの場合でも明示的に削除する処理は記載必要とのこと(何のためのTempメソッドなのだろうか…)

参考:https://pkg.go.dev/os#CreateTemp

“`golang
f, err := os.Create(“example.csv”)
if err != nil {
panic(err)
}
defer os.Remove(f.Name())
“`

元記事を表示

Goの構造体に連想配列を入れる。(可変長)

以下のような構造のJsonを生成したかったのだけど、
自分にはあまりいい記事がなかったので書くことに。
Responseキーの中のリストは、可変します。

“`bash
{
“header”: {
“error_message”: “”,
“status”: “222”
},
“Response”: [
{
“code”: “111”,
“name”: “1”
},
{
“code”: “111”,
“name”: “2”
},
{
“code”: “111”,
“name”: “3”
}
]
}
“`

“`bash
{
“header”: {
“error_message”: “”,
“status”: “222”
},
“Response”: null
}
“`

### とりあえずコードです
※一部修正しました。

“`struct.go
package main

import (

元記事を表示

grpcurlで快適gRPC通信テスト

# 経緯

goで作っているサービスのgRPC通信の動作確認用に`grpcurl`というクライアントツールを使ってみました。

別クライアントの`grpc_cli`はMacローカルにbrewでインストールしてもうまくパスが通らず諦めました。

### 環境
“`bash
$ sw_vers
ProductName: macOS
ProductVersion: 11.5.1
BuildVersion: 20G80
$ go version
go version go1.16.6 darwin/arm64
$grpcurl –version
grpcurl 1.8.2
“`

インストールはおもむろに `brew install grpcurl` で行いました。

#手順

### 1. サーバーを立ち上げる

“`bash
$ cd $GOPATH/src/github.com/hoge-monorepo
$ go run cmd/xxxx/main.go
{“level”:”INFO”,”ts”:”2021-08-16T16:33:21.649229+09:00″,”calle

元記事を表示

GolangでgRPCに入門

golangでgRPCを使ったプロトタイプを作る手順です。

https://qiita.com/marnie_ms4/items/4582a1a0db363fe246f3#grpc%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB

を記事を多いに参考にしてます。
この記事のコードは上記の記事と同一です。どこにコードを書くかと、`protoc`コマンドについて多少明確になっています。

Goのバージョン管理には`gvm`を使っています。
Goのバージョンは `go version go1.16.5 darwin/amd64` です。

`protoc`コマンドを使うので以下でinstallしてください。

http://google.github.io/proto-lens/installing-protoc.html

gRPCの何がいいかについては

# プロジェクトの用意

元記事を表示

Go言語でOS環境変数を取得する

Goではユーザ名とかパスワードなどの設定は環境変数に持たせるのが一般的らしい。

じゃあどうやって取得すれば良いのか?
`os.Getenv(”キー名”)`で取得できます

以下サンプル

### 環境変数の作成
サンプルとして`.env`ファイルをつくります。

“`bash
export Test=test_dayo
export TEST=oomoji_dayo
“`

### 環境変数の登録
sourceコマンドで読み込みます(環境変数へ登録)

“`bash
$ source .env
$ env | grep TEST
TEST=oomoji_dayo
$ env | grep Test
Test=test_dayo
“`
ちゃんと入ってますね。

### Goを書く。

main.goを書きます。

“`go
package main

import (
“fmt”
“os”
)

func main() {
fmt.Println(“test”)

Test := os.Getenv(“Test”)
TEST := os.Getenv(“TEST”)

元記事を表示

OTHERカテゴリの最新記事