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

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

[Golang] Cloud Runで構造化ログを出力できるように実装してみた

## やったこと

* goの標準log出力をGCPの構造化ログのフォーマットで出力するようにしてみた。
* Cloud Runにデプロイして確認してみたところ無事ログが各ログレベルで出力されるようになった。
* 標準logライブラリのファイル名表示などされなくなったが、ログの出力をgrepすれば調査はできるので一旦よしとします。

## 課題

* サービス運用では同時に複数のアクセスが考えられるため、traceId等でログを追跡できるようにする必要があります。アクセスがたまにしかないようなフェーズではいいかもしれないけど、`X-Cloud-Trace-Context`を使用してリクエストとログを一意にできるようにすることは必須だと思うので今後やる。
* Cloud loggingなどの仕組みをつかってERRORのログをSlackに通知する仕組みとか作ってみようと思います。

## 内容ははてなブログに掲載してます

https://moritomo7315.hatenablog.com/entry/golang-gcp-log-output

元記事を表示

GolangにORM導入(go-pg migration編)

#はじめに
GolangのORMであるgo-pgの導入です。本記事ではgo-pgのチュートリアルに沿ってマイグレーションを実行します。
※go-pgは現在メンテナンスモードのため、bunへの移行が推奨されています。今から学ばれている方はbunを利用することをお勧めいたします。私は諸事情があり、あえてgo-pgで開発をしています。

#環境情報
PC:Mac(CPUはintel製)
Go:1.17.6 ←Goのver大事。versionは1.16以降をインストールしてください。
開発エディタ:Visual Studio Code

#ディレクトリ構成
“`shell:ディレクトリ構成
~/go/src/go-pg-migrate $ tree
.
├── docker-compose.yml
├── examples
│ ├── 1_initial.go
│ ├── 2_add_id.go
│ ├── 3_seed_data.go
│ └── main.go
├── go.mod
└── go.sum

1 directory, 7 files
“`

#Hands-

元記事を表示

【Go言語】time.Timeをjsonでunixtimeを返しつつ、time.Timeの型でGCP/DataStoreに保存する

# 概要

掲題の通りです。
ニッチな内容なので需要ないと思いますが、自分の備忘用としてのpostになります。

# 課題

普段、Webサーバー側の開発はGAE/Goを利用しており、特に指定がない限りDBはDatastoreを利用しています。
ただ JSONの取り扱いでよく困るのが `time.Time` の挙動です。
この子、何も指定がない場合は `RFC3339` 形式の文字列としてJSONに格納されます。

“`go
import (
“time”
“encoding/json”
)

type Hoge struct {
ID int64 `json:”id” datastore:”-“`
Name string `json:”name” datastore:”name”`
CreatedAt time.Time `json:”createdAt” datastore:”createdAt”`
}

var hoge := Hoge {
ID : 1,
Name : “te

元記事を表示

Goの環境変数読み出しについて

環境変数をセットする際に、いくつかパターンがあるなと思ったのでまとめます。

# 基本

“`:basicEnv.go
package main

import (
“os”
“fmt”
)

func main() {
os.Setenv(“ENV”, “debug”)
env := os.Getenv(“ENV”)
fmt.Println(env)
}
“`

# `joho/godotenv`
“`:.env
ENV=debug
“`

“`:dotEnv.go
package main

import (
“os”
“fmt”
“log”
dotenv “github.com/joho/godotenv”
)

func main() {
if err := dotenv.Load(); err != nil {
log.Fatalln(err)
}
env := os.Getenv(“ENV”)
fmt.Println(env)
}
“`

#

元記事を表示

# 【Go】無名関数について理解したこと

無名関数ワカランの状態だったので理解を整理してみました。

## 用語の理解しよう

| 無名関数 | func 予約語の後に名前がない関数リテラルが表す関数値 |
| — | — |
| 関数リテラル | 関数値を表す式 |

さらに理解を深めるため無名関数を利用した簡単なコードを書いてみました。

“`go
package main

import “fmt”

func main() {
fmt.Println(“Hello, 世界”)
f := func() string { return “Hello, 世界” }
fmt.Println(f())
}
“`

[https://go.dev/play/p/y-kmWRvL719](https://go.dev/play/p/y-kmWRvL719)

無名関数を代入した変数 `f` を用いて関数 `f()` の戻り値である文字列を `fmt.Println()` の引数に渡しています。これだけでは無名関数のメリットは感じられず、ややこしいコードを書いてる感覚になります。なので以下から書籍『プログラミング言語

元記事を表示

0埋めの文字列にする

## やったこと
go言語で0埋めの関数なかったのでつくっった。
テストコードとか書いてないので確実に動くかはわかんないけど多分大丈夫(適当)

“`golang
package main

import (
“errors”
“fmt”
“strconv”

“github.com/labstack/gommon/log”
)

func main() {
n := 1000
width := 3
var s string
s, err := padNumberWithZeros(n, width)
if err != nil {
log.Error(“err : “, err)
return
}

fmt.Println(s)
}

// padNumberWithZeros : 数理をセロで埋めます
// n : 埋めたい数値
// width : 桁数
func padNumberWithZeros(n int, width int) (s string, err error) {
l := len(strconv.Itoa(n))

元記事を表示

Go言語・SendGrid・REST APIでお問い合わせメール送信API

##概要
Go言語を使って、Jsonファイル形式で送られてきたデータをメールで送信する。
モバイル開発において、お問い合わせフォームの内容をWebを使って送信する必要があったので、モバイル側から送られてきたデータをWebを通してメール送信をするプログラムを作成した。
OSはWindows

###参照した記事

Goでメール送信!SendGridを使って簡単に実装する方法

https://qiita.com/katekichi/items/d94e078b376151858ca4

##事前準備
まずメール送信を肩代わりしてくれるサービスSendGridを登録する必要がある。
申請をして、早くて数時間、遅くても1営業日で審査は終わる。SendGridは月12,000通までのメール送信なら無料で使える。

https://app.sendgrid.com/

審査が通ればログインしてAPIキーを所得。
Settings → API Keys → Create API Key(青いボタン)を押す。Permission はとりあえず Full Access で大丈夫。
AP

元記事を表示

Go言語を0から習得してWeb開発をする

##基本このサイトだけで大丈夫
https://leben.mobi/go/

このサイトで学習を進めれば入門レベルからWeb開発まで習得できます。
ただ一部古い部分があって、現在ではエラーが起きてしまう可能性のあるプログラムやコマンドがありました。本記事ではそういったような、私がこのサイトで学習していた際に必要になったその他の情報や備忘録を書いていきます。

##Web開発編で出てくるデータベースの構築と操作
https://prog-8.com/docs/mysql-env-win

こちらはprogateのサイトになっております。Windows環境と書いてありますが、Mac用のリンクもこのページにあります。このサイトを見るのはWeb開発編に入った後で大丈夫です。

##実行でエラーが起きたので備忘録

###Web開発編「JSON形式で外部設定ファイルを作成・利用する方法」で起きたエラー その1

~~~
\Go\goWeb> go run main.go
build command-line-arguments: cannot find module for path _/C_

元記事を表示

【個人開発】Githubのプロフィールに、Qiita・Zennの記事などを一覧表示させる、Github Actionsのアクション作ったよ!

# 宣伝

GithubのプロフィールはREADMEによって管理できることはご存知かと思います。
[プロフィールの README を管理する – GitHub Docs](https://docs.github.com/ja/account-and-profile/setting-up-and-managing-your-github-profile/customizing-your-profile/managing-your-profile-readme)

そのREADMEにて、Qiita・Zennで書いた記事や、connpassの参加イベントを取得することで、最新のアクティビティを表示したいという要望を叶えるのが本アクションです。
以下のようなプロフィールを作ることが出来ます。

![Screen Shot 2022-02-16 at 11.21.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496036/91c6cfa5-ef26-0c5a-a8f8-e9fdab6ef354.png)

元記事を表示

# 【Go】一人コードリーディング会を始めます。(4回目)

## はじめに

元ネタはtenntennさんの伝説カンファレンスの一部になります。
[https://www.youtube.com/watch?v=X0tzCL5gqr8](https://www.youtube.com/watch?v=X0tzCL5gqr8)

コードリーディング会とは何人かで同じコードを各々で読んで、発見を共有して理解を深めましょう!というのが趣旨と理解しています。しかし知人で一緒にGoを学んでくれる人も見つけられず、悲しくも一人でコードリーディング会を開催することになりました。
やってみたら読めない箇所が多すぎました。1文ずつ嚙み砕いてGo言語の理解を深めていく作業になりました。その過程の不明点と解釈を記事にして公表していこうと思います。僕と同じ程度の理解度(初学者)の方が、不明点を理解するきっかけになればうれしいです。
※1日の学びを1記事にするので情報量は少なめです。徐々に情報量を増やして有益な記事を書けるよう頑張ります。
※個人の解釈を投稿する記事なので誤った情報が多々あると思います。申し訳ありませんがご了承ください。誤りについてはご指摘いただけるとう

元記事を表示

【Go】組み込み関数makeとnewの違いについて

Goには、組み込み関数(元々言語に用意されている関数のことです。)としてmakeというものと、newがあります。
それぞれ、スライスや構造体など何かを『生成』するのに使用します。使い方は多岐に渡りますが、何より慣れないうちは、
>「あれ、この場合はmakeか?それともnewの方か?どっちだ。。。」

と混同される方も多いかと思います。
今回はそれらの違いについて、ざっくりと解説いたします。

# 最初に結論から
組み込み関数makeは、**「スライス(slice)」**、**「マップ(map)」**、**「チャネル(channel)」** のデータ構造体を生成するために使用します。
そして組み込み関数newは、**指定した型のポインタ型**を生成するために使用します。

# 一つずつ解説
## make
まず、上記でも「述べたように、組み込み関数makeは、**「参照型」** と呼ばれる、「スライス(slice)」、「マップ(map)」、「チャネル(channel)」の3つデータ構造を生成することができます。
makeによる参照型生成のパターンは以下の通りです。

| 呼び出し形式 |

元記事を表示

区間選択アルゴリズム

#何を書いているか
区間選択アルゴリズムの備忘録。
C++とGoで記述。
プログラミングスキルチェックの問題で選択アルゴリズムを使って解く問題に出会ったので。

#コード
ここでは終わりと次の始まりがつながらない区間を選択するパターン。
つながった場合も選択可能とする場合はコードの示した箇所を等比較にすればよい。

C++版

“`C++
#include
using namespace std;
int main() {
// cin.tie(0);
// ios::sync_with_stdio(false);

int N;
cin >> N;
vector X(N), L(N);
for (int i = 0; i < N; i++) { cin >> X.at(i) >> L.at(i);
}

vector> p(N);
for (int i = 0; i < N; i++) { p[i].firs

元記事を表示

Go言語の環境設定

# Go言語の環境設定(mac)

### 1. インストール
“`
$ brew install go
$ go version
“`
`go version`で`go version ~~`とバージョンが出てきたらインストールできている証拠.

### 2. PATHを通す
zshの方は`.zshrc`, bashの方は`.bashrc`に以下を追記.

“`
export GOPATH=$(go env GOPATH)
export PATH=$PATH:$GOPATH:bin
“`
(ちなみに、`.zshrc`や`.bashrc`は`/Users/(ユーザー名)/`にあります.
vimだのopenだのfinderから探すだのしてみてください.)
また, これらのファイルは隠しファイルなので, finderで見つけたい方はfinder上で`control`+`command`+`.`を押下してください. 隠しファイルが列挙されます.(もう一度押下すれば元に戻せます)

なんとこれだけ. 意外と難しいようで簡単なようで, こういった文献を探すのが下手だとそれ

元記事を表示

DDDを意識したgolangでの実装

本記事はDDDについて超わかりやすく記述されている以下書籍を読み、golangではどうなるかを記載したものです。

[ドメイン駆動設計 モデリング/実装ガイド](https://little-hands.booth.pm/items/1835632)


## ユースケース
例として、タスク管理アプリケーションを考える。

・タスクを登録する
・タスクを延期する
・タスクを完了する


## オブジェクトの生成や更新時に守らなければいけないルール(ドメイン知識)

・タスクステータスは未完了/完了の2種類でタスク作成時は未完了ステータス
・タスク完了すると完了ステータスとなり、ステータスは戻せない
・タスクの期日は1日ずつ、3回まで延期できる

DDDで重要なのは、ドメイン層にドメイン知識を寄せて、ドメイン知識がわからない途中参入した他のエンジニアにもドメイン知識の遵守を強制できる状態にすることである

駄目なケース(ドメイン知識がドメイン層にない)を見てみる。

ドメイン層

“`go
type Task struct {
ID str

元記事を表示

マイクロサービスのヘルスチェック実装において依存先への負荷を軽減したい

## 概要
この記事は、ヘルスチェック実装で依存先の負荷を減らすためにキャッシュを検討してみた話と、Goで実装する場合は https://github.com/alexliesenfeld/health が便利そうなので実装してみた、という記事です。

## はじめに

マイクロサービスにおいてヘルスチェック機能を実装する際は、DB等の正常性確認に加えて依存先のサービスの正常性も含めて確認したくなります。
そのような実装を加えた際に問題になるものの一つとして、**依存先のサービスへのリクエスト量が増える**点があります。原因としては次のようなものがあると思います。

– KubernetesのReadiness Probeによって高頻度に実行される
– 自分自身も多くのサービスの依存先となっており、ヘルスチェックのリクエストを多く受ける

そのような理由により依存先へのリクエストが増えた際に問題になるのが次のような点です。

– ヘルスチェック起因のリクエストが負荷になる
– 依存先サービス側のログにヘルスチェック起因のものが増え調査しづらくなる

マイクロサービスにおいて負荷への対

元記事を表示

RaspberryPi4BにGoを入れる。

#概要
ちょっとしたツールを使おうと思ったらGoで書かれてたからGoを入れようとしてハマった話。

#手順
好きなところに“`wget https://golang.org/dl/go1.17.7.linux-armv6l.tar.gz“`でダウンロード。
“`sudo tar -C /usr/local -xzf go1.10.1.linux-armv6l.tar.gz“`で展開。今回は“`/usr/local“`を指定。
“`~/.bashrc“`に“`export PATH=$PATH:/usr/local/go/bin“`を追記してパスを通す。
“`source ~/.bashrc“`で適用。

#ところが…
“`go version“`が通らず“`no such file or directory“`が返る…。
あちこち調べるもののピンとこない。
なんとなく“`uname -m“`を打ってみると“`aarch64“`と返ってきた。ここで気がついた…参考ページが結構古くてターゲットも**RaspberryPi**としか書いていないことに。

元記事を表示

【Go】テンプレートエンジンを使ってコンテンツを表示してみた

# はじめに
Goの標準で用意されているテンプレートエンジンを使って,HTMLページを表示させてみた.
# 環境
– macOS BigSur
– Go 1.17.5 darwin/arm64

# テンプレートエンジンとは
本題に入る前にテンプレートエンジンについて説明する.
テンプレートエンジンとは「テンプレート」と呼ばれる雛形に「データ」を組み込んで最終的なHTMLを生成するもの.Web用のテンプレートエンジンは多くの本格的なフレームワークに含まれている.Goも例外ではなく,数種のテンプレートエンジンが組み込まれている.通常,ハンドラがテンプレートエンジンを呼び出してデータをテンプレートに組み込み,出来上がったHTMLをクライアントに返す.簡単なイメージ図はこんな感じ.

template-engine.png

元記事を表示

# 【Go】一人コードリーディング会を始めます。(3回目)

## はじめに

元ネタはtenntennさんの伝説カンファレンスの一部になります。
[https://www.youtube.com/watch?v=X0tzCL5gqr8](https://www.youtube.com/watch?v=X0tzCL5gqr8)

コードリーディング会とは何人かで同じコードを各々で読んで、発見を共有して理解を深めましょう!というのが趣旨と理解しています。しかし知人で一緒にGoを学んでくれる人も見つけられず、悲しくも一人でコードリーディング会を開催することになりました。
やってみたら読めない箇所が多すぎました。1文ずつ嚙み砕いてGo言語の理解を深めていく作業になりました。その過程の不明点と解釈を記事にして公表していこうと思います。僕と同じ程度の理解度(初学者)の方が、不明点を理解するきっかけになればうれしいです。
※1日の学びを1記事にするので情報量は少なめです。徐々に情報量を増やして有益な記事を書けるよう頑張ります。
※個人の解釈を投稿する記事なので誤った情報が多々あると思います。申し訳ありませんがご了承ください。誤りについてはご指摘いただけるとう

元記事を表示

Go言語_Slice

# Go言語 Slice

## The Go Blog 『[Arrays, slices (and strings): The mechanics of ‘append’](https://go.dev/blog/slices)』から

>Arrays have their place—they are a good representation of a transformation matrix for instance—but their most common purpose in Go is to hold storage for a slice.

Go言語における配列の最も共通する目的はスライスのストレージを保持するため

>A slice is a data structure describing a contiguous section of an array stored separately from the slice variable itself. A slice is not an array. A slice describes a piece of

元記事を表示

順列計算

プログラミングスキルチェックの問題を解く際に順列計算を行う場面が多くなった。
以下の記事を参考にさせていただきgolangで実装してみました。
[順列の全探索をするプログラム(競技プログラミング向け)](https://qiita.com/suzuki-navi/items/a80677a0747232843957)
@suzuki-navi 様ありがとうございます。
備忘録目的です。

“`go
type Cat struct {
id int
eat_time int
fuman int
}
(中略)

//呼び出し側
cat_len:=len(cats)
pat:=1
for {
sb:=””
i:=0
for i=0;i

元記事を表示

OTHERカテゴリの最新記事