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

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

【Go】”空構造体”の表し方

# 初めに結論
**空の構造体(struct)は、「struct{}」と表します。**
interface{}みたいなものですね。

空構造体は、
– 空の構造体は**メモリサイズが 0である**
– 空の構造体は**属性**を持たない
– 空の構造体は**同じアドレス**を示す

といった特性を持ちます。

# 構造体(struct)とは?
**「type [定義する名前] struct」** のように使用します。
“`go
// 「Person」という名前の構造体(struct)
// この場合、NameとAgeという「フィールド」を持っています。
type Person strcut {
Name string
Age int
}
“`
「フィールド」はpytonなどで使われるclassでいうところの、コンストラクタのようなものです。

そして、このフィールドを何も持たない、つまり”空”であるため、
“`go
struct{}
“`

この書き方で表せるのですね〜。

##### ちなみに使い方の実例はこんな感じです。
“`go
type (
Per

元記事を表示

Btreeの実装例(golang)

#何が書いてあるか
BtreeのGoでの実装例。備忘録。

##

“`go
// 節・葉に持たせる機能のインターフェース
type Item interface {
Eq(Item) bool
Less(Item) bool
}
// インターフェースの実装
type Int int
func (n Int) Eq(m Item) bool {
return n == m.(Int)
}
func (n Int) Less(m Item) bool {
return n < m.(Int) } // 節・葉の構造 type Node struct { item Item left, right *Node } // 節・葉の作成 func newNode(x Item) *Node { p := new(Node) p.item = x return p } // 二分木 type Tree struct { root *Node } // 二分木の生成 func newTree() *Tree {

元記事を表示

漸化式アルゴリズムサンプル(golang)

#何が書いてあるか
漸化式のアルゴリズムのGo版。備忘録用。

## 適用ケース
N段の階段をA段飛ばし、B段飛ばしで登ったときの、各段ごとにとれる登るパターン数を計算する。 など
上記ケースでのコード例)

“`go
package main
import “fmt”
func main(){
dp:=make([]int,N+1)
dp[0]=1

for i:=1;i<=N;i++ { dp[i]=0 if i>=A {
dp[i]=dp[i]+dp[i-A]
}
if i>=B {
dp[i]=dp[i]+dp[i-B]
}
}
// ここから続く5行は、頂上手前で飛ばす段数よりも残り段数が少ない場合には、頂上に到達させるとする場合のルート数の計算。
end:=0
for i:=N-1;i>=N-A+1;i– {
end+=dp[i]
}
dp[N]+=end

元記事を表示

[Go] Structの子要素を親要素のポインタで変更できるのか

## はじめに
Structのポインタを渡して中身を変更するときに子要素のStructの中身も変更できるのか分からなかったので検証しました。

バージョン:Go 1.16

## 検証
“`go
package main

import “fmt”

type Child struct {
AAA string
}

type Parent struct {
BBB string
Child Child
}

func changeParent(p *Parent) {
p.BBB = “ccc”
}

func changeChild(p *Parent) {
p.Child.AAA = “ddd”
}

func changeChildDirect(c *Child) {
c.AAA = “eee”
}

func main() {
c := Child{
AAA: “aaa”,
}

p := Parent{
BBB: “bbb”,
Child: c,
}

fmt.Println(p)
// {bbb {aaa}}

change

元記事を表示

# 【Go】チョットわかるインタフェース

自分がインタフェースについて理解したことをまとめます。僕と同じ初学者の理解を手助けできればうれしいです。Gopher道場が提供してくれている動画やスライド、書籍「プログラミング言語Go」を参考にしています。

## 最初にこの記事の結論

以下のようになりました。タイトルの通りちょっとしかわかりませんでした。

> インタフェースの使い方はちょっと分かったけど、メリットを実感できる使い方まではわからなかった。
>

## はじめに用語を整理する

最初に用語を整理します。現時点は「へえ」くらいの温度感でいいと思うのでざっくり意味を理解することが大切だと思います。

| メソッド | レシーバと紐づけられた関数 |
| — | — |
| インタフェース | 抽象化を実現するメソッドの集まり |

## 前段階にメソッドの理解を深める

本題はインタフェースの理解を深めることですが、前段階としてメソッドの理解を深める必要があると感じています。以下はメソッドを使用した簡単なコードです。一緒に見ていきましょう。

“`go
package main

import (
“fmt

元記事を表示

デンソークリエイトプログラミングコンテスト2022(AtCoder Beginner Contest 239) 参戦記

# デンソークリエイトプログラミングコンテスト2022(AtCoder Beginner Contest 239) 参戦記

## [ABC239A – Horizon](https://atcoder.jp/contests/abc239/tasks/abc239_a)

2分で突破. 書くだけ.

“`python
from math import sqrt

H = int(input())

print(sqrt(H * (12800000 + H)))
“`

## [ABC239B – Integer Division](https://atcoder.jp/contests/abc239/tasks/abc239_b)

4分半で突破. 試したら Python の除算そのままであれってなった.

“`python
X = int(input())

print(X // 10)
“`

## [ABC239C – Knight Fork](https://atcoder.jp/contests/abc239/tasks/abc239_c)

9分で突破. 2点の周

元記事を表示

[Golang] enumを使いたい ~ structでも定数定義できるぞ

元々Javaエンジニアの私ですが、最近Goを趣味で使い始めたのでメモ程度に。
今回はJavaでよく使うenumをGoでもそれっぽく使う方法を残しておきます。

## まずは基本的な使い方
よくGoogleで検索して見かけるやつ

“`hoge1.go
package constant

// 自動で採番してくれる
const (
HOGE1_1_1 = iota // 0
HOGE1_1_2 = // 1
HOGE1_1_3 = // 2
)

// 1始まりにしたい
const (
HOGE1_2_1 = 1
HOGE1_2_2 = 2
HOGE1_2_3 = 3
)

// 文字列で定義したい
const (
HOGE1_3_1 = “hoge1”
HOGE1_3_2 = “hoge2”
HOGE1_3_3 = “hoge3”
)

// 基本型をベースにした独自の型で定義したい
type HOGE uint8
const (
HOGE1_4_1 HOGE = 1
HOGE1_4_2 HOGE = 2
HOGE1_4_3 HOGE =

元記事を表示

Ubnutu20.04.3 LTSにGo言語の開発環境を構築する (Golang + VSCode+Ubuntu)

今更ながら、Ubnutu20.04.3にGoをインストールします。

## インストールするマシンについて
### os情報

“`bash
user@machine:~/gotrain$ cat /etc/os-release
NAME=”Ubuntu”
VERSION=”20.04.3 LTS (Focal Fossa)”
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME=”Ubuntu 20.04.3 LTS”
VERSION_ID=”20.04″
HOME_URL=”https://www.ubuntu.com/”
SUPPORT_URL=”https://help.ubuntu.com/”
BUG_REPORT_URL=”https://bugs.launchpad.net/ubuntu/”
PRIVACY_POLICY_URL=”https://www.ubuntu.com/legal/terms-and-policies/privacy-policy”
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal
`

元記事を表示

【Go】http.ResponseWriterのメソッドw.Header().Add()が効かない

http.ResponseWriterのメソッドHeader().Add()でヘッダーを追加したはずなのに、レスポンスのヘッダーを見ると付与されていない。

単純にw.Header().Addの前に、w.Writeを呼び出していたことが原因だった。順番を逆にすると、想定どおり動作する。

“`go:改修前
func(w http.ResponseWriter, _ *http.Request) {
w.Write([]byte(“Hello, world”))

w.Header().Add(“Access-Control-Allow-Origin”, “http://localhost:3000”)
w.Header().Add(“Access-Control-Allow-Headers”, “Content-Type, X-CSRF-Token”)
w.Header().Add(“Access-Control-Allow-Methods”, “POST, OPTIONS”)
w.Header().Add(“Access-Control-Expose-Headers”,

元記事を表示

[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による参照型生成のパターンは以下の通りです。

| 呼び出し形式 |

元記事を表示

OTHERカテゴリの最新記事