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

Go関連のことを調べてみた2022年04月06日
目次

Go+CodeCommitで任意の名称のライブラリを作成・利用する方法

# 目的
Goでモジュールを作成する際には`go mod init`で任意の名称を指定することができます。
しかし AWS CodeCommit を利用時にはCodeCommitのホスト名(`git-codecommit.${AWS_REGION}.amazonaws.com`)を使用する必要があります。
そこでCodeCommitを利用しつつ任意の名称でGoのライブラリを作成する方法を調査したのでそのやり方をまとめます。
# 経緯
こんな感じです。
– プロジェクトではCodeCommitを使わないといけない
– ~~モジュール名にCodeCommitのホスト名が含まれると、別リージョンにリストアした際にクライアント側からアクセスが出来なくなる~~
– 所感にも記載しましたが、Gitのホスト名を置換する機能を使うと解決です
– モジュール名にCodeCommitのホスト名が含まれることに気持ち悪さを感じている
– Goでライブラリを作成しないといけなくなった!!!

絶対に達成しないといけないわけではなく完全に好みですね。
# やり方
今回実現するのに、Gitのホスト名を置換

元記事を表示

【Golang】ポインタと実体の使いどころ

Golangにおけるポインタの使いどころ、実体の使いどころを整理しました。

# 結論

| | イミュータブル変数 | 関数引数/メソッドレシーバ | ゼロNULL区別 |
|:-:|:-:|:-:|:-:|
| ポインタ | × | ◎ | ○ |
| 実体 | ○ | ○ | × |

# 1. イミュータブル変数は「実体」で宣言する。
ポインタは、別変数に値を渡すと、その変数からも元値の更新が可能となる。
つまり、複数の変数間で1つの値を共有する**ミュータブルな**変数を意味する。

“`go
package main

import “fmt”

func main() {
v1 := &S{Number: 1} // ポインタで宣言
v2 := v1 // 別変数に値を渡す
v2.Number = 10 // 別変数を更新
fmt.Printf(“v1: %v, v2: %v”, v1, v2)
// -> v1: &{10}, v2: &{10}
// v1の値も更新されてしまう: ミュータブル変数
}

ty

元記事を表示

東京ドームのイベント情報をSlackに通知させてみた

# はじめに
私が通っている大学のすぐ近くには東京ドームがあり,コロナ禍に入る前はライブ帰りの客で駅や電車がやたら混むということがよくありました.
今年に入ってからイベントが再開されてきていることもあり,またこういったことが起こる気がしたので,予めイベント情報を知れる仕組みを作りたいと思いました.

# 使用した技術
* Go
* goquery
* Serverless Framework
* AWS Lambda
* Github Actions

# プロジェクトの作成
予め作成したディレクトリに移動した上で,以下を実行します.
“`
$ sls create -t aws-go-mod
“`
そうすると,最低限動くServerless Frameworkのプロジェクトが作成されます.
もしServerless Frameworkをインストールしていない場合は,以下のコマンドでインストールしましょう.(Node.jsが必要)
“`
$ npm i -g serverless
“`
or
“`
$ yarn add global serverless
“`

# 実装

元記事を表示

Go言語で平均を出すコード

“`go:Goで平均を出すだけのコード
package main

import “fmt”

func avg(num []int) int {
goukei := 0
count := 0
for {
goukei = goukei + num[count]
if count == len(num)-1 {
return goukei / count
}
count ++
}
}

func main() {
keisan := []int{34,56,23}//ここに値
x := avg(keisan)
fmt.Println(“平均:”,x)
}
“`

元記事を表示

Goのコンパイラバージョンアップ手順

`Go`のコンパイラをバージョンアップする際の変更点やコマンドのメモです

# バージョンアップ
## `go.mod`ファイル

`go.mod`でmodule管理している場合は`go mod edit`コマンドで`go.mod`ファイルでの`Go`のバージョンを変更します。

以下のように`1.17`が指定されていたとして`1.18`に更新する場合は、
“`go:go.mod
module sample-app

go 1.17
“`

次のコマンドを実行します。

“`bash
$ go mod edit -go=1.18
“`

再び`go.mod`ファイルを確認すると`1.18`になっていることが確認できます

“`go:go.mod
module sample-app

go 1.18
“`

## `Dockerfile`

`Dockerfile`は手で書き換えます。

https://hub.docker.com/_/golang

“`diff:Dockerfile
– FROM golang:1.17.8-buster
+ FROM golang:1

元記事を表示

GO1.18のGenericsを用いてmap,flatMap,filterなどのコレクションライブラリを作ってみる

# はじめに
ついにgo1.18でgenericsが使用できるようになりました.
go.1.17で導入される予定でしたが延期されたので待望のアップデートです.
[go1.18 release notes](https://tip.golang.org/doc/go1.18)

これによってScalaやKotlin, ypescriptのように, map/reduce/filterなどのコレクション関数が使用できるかもしれません.
早速試してみましょう.

また本記事で紹介しているコレクション関数は以下に公開しております.
[go-collections](https://github.com/koh789/go-collections)

# コレクション関数例
## Map

ある型Tのsliceを受け取って,異なる型Vを返却するmap関数です.

“`go:
func Map[T, V any](elms []T, fn func(T) V) []V {
outputs := make([]V, len(elms), cap(elms))
for i, elm := ra

元記事を表示

元組み込みC++エンジニアがWebアプリを作ってみる – とりあえず動かしてみる

※親ページは[コチラ](https://qiita.com/dashi-no-ajiwai/items/c1e776a17e0c1e6af40b)

# やること
とりあえず、バックエンドのルーターを作って動かしてみます。
ブラウザでURL(今はローカルなので`localhost`)を指定して、データが取得できることを確認します。

# 下準備
だいたいターミナル操作です。
## ディレクトリ構成
“`
$ cd ~
$ # 作成するアプリのもろもろを配置するディレクトリ
$ mkdir first_app && cd first_app
$ # ページのルーターを配置するディレクトリ
$ mkdir first_app_router && cd first_app_router
“`
## インストール
– [Go](https://go.dev/)
Macなら[Homebrew](https://brew.sh/index_ja)が入っていれば楽ですね。
現時点で`1.18`が最新です。
“`
$ brew install go
$ go version
go version

元記事を表示

Go1.18でジェネリクスが追加されたので、5年ぶりにGolangを覚えなおし、GenericListとマルチキャスト可能Channelの実装をした

# はじめに
Go1.18が2022/3/15にリリースされました
以前Goの開発陣はジェネリクスは不要とか言ってたような気がするが
1.17でもお試しが出来たと思いますが
今回正式に導入されたので、5年ぶりにGoのお勉強です

ジェネリクス以外に5年間のUpdateを調べましたがツールやライブラリは変わったものの
言語じたいはたいした変化はなかったので
ジェネリクスだけです

# ジェネリクスとは
C++でいうテンプレートです
D言語、Java、C#、Haskell・・・
今では様々な言語に導入されている概念です
引数の型が異なる関数やメソッド、メンバ、クラスに対して、一つの実装で複数の型に対応出来ます

具体的には、例えばint型の入るリストクラス IntListを作ったとします
float型のリストも必要となったのでコピペして FloatListクラスを作成
string型のリストも欲しいから StringListクラスを作成
自作したMyClassを保存する MyClassListを作成・・・
メンテできませんね。。

ジェネリクス例
List というクラ

元記事を表示

【Oracle】Mac環境でmattn/go-oci8のライブラリをインストール時「oci.h: No such file or directory」が発生

## 概要
GolangでOracleに接続する際に、[mattn/go-oci8](https://github.com/mattn/go-oci8)のライブラリを使うことになると思います。ライブラリのGitHubのページにある手順に従ってMacにインストールしようとしたのですが、go getの実行時に`oci.h: No such file or directory`が発生しました。
今回はこのエラーについて、対応した内容をメモ書きします。

## 原因
原因はエラーにある通りの内容で、`oci.h`というファイルが無いからになります。
まず前提として、このライブラリを使う前にOracleのInstant Clientを用意する必要があります。基本的には`mattn/go-oci8`のGitHubのページにある手順の通り、ダウンロードした後に、設定ファイルの作成とパスを通せば良いです。ただ、このInstant Clientでにて、接続時に使用する`oci.h`が含まれてませんでした。

## 対応
Macに限った話ではないのですが、 Instant Clientでは`Basic P

元記事を表示

Go 1.18 を触ってみた(Generics, Fuzzing, Workspaces)

# 初めに
Go 1.18がリリースされたので触ってみました。
今回の重要なリリースは下記の The Go Blog に掲載しているものだと思ったので、ここに書いてあるものを触ってみました。

https://go.dev/blog/go1.18

# 主な改善点
上記のページを見ると、今回のバージョンアップで特に注目すべきものは以下になります。

– Generics
– Fuzzing
– Workspaces
– 20% Performance Improvements

それぞれコードを交えながら、触ってみた感想と解説をしていこうと思います。

# Generics

日本語だと「ジェネリクス」と読みます。Javaを触ったことある人にとっては知ってて当たり前のものではないでしょうか。
Generics とは、1つのソースコードで様々なデータ型の処理をできるようにするものです。

The Go Blog には、最も頻繁にリクエストされていた機能だと書いてあります。つまりこの機能は多くの人が待ち望んでいた機能だと言えます。

親切にチュートリアルまで用意してくれています。今回はこ

元記事を表示

nil かもしれないメンバのある構造体の整列

# これは何?

https://qiita.com/sachiko-kame/items/e1315bff25e2abdb8639

という記事を見て、自分ならどう書くかなと思って書いたもの。
generics の練習を兼ねて

# まずはソース

“`go:go1.18
package main

import (
“encoding/json”
“fmt”
“math/rand”
“sort”

“golang.org/x/exp/constraints”
)

type Sample struct {
Name *string
Description *string
Note *string
}

func ToPtr[T any](x T) *T {
return &x
}

func NewSample(name, desc, note *string) *Sample {
return &Sample{
Name: name,
Description: desc,
Note: not

元記事を表示

XMLをスライスにUnmarshalするときの罠

スライスを `Marshal` して `Unmarshal` すると、**先頭要素しか取得できません**!

“`go:スライスをもとに戻せない?
package main

import (
“encoding/xml”
“fmt”
)

func main() {
nums := []int{1, 2, 3}
b, _ := xml.Marshal(nums)

var copiedNums []int
_ = xml.Unmarshal(b, &copiedNums)
// 先頭要素しか取れない!
fmt.Printf(“%#v\n”, copiedNums) // []int{1}
}
“`

JSONのように `Marshal` と `Unmarshal` を逆変換として使うことは**できません**。XMLをオブジェクトのシリアライズに使っている場合は注意が必要です。

# バージョン

Go 1.18

# Why?

スライスをmarshalすると各要素が並んだ形式で出力されます。

“`
[]int{1, 2, 3} → “1

元記事を表示

Go言語 HelloWorld

## Code
“`Go
package main

import “fmt”

func main() {
fmt.Println(“Hello, World!”);
}
“`
## Comment
Go言語は、「go run」コマンドによって、ビルドプロセスを隠蔽出来る。
もちろん、「go build」コマンドによって、明示的にビルドすることも出来る。

## Output Sample
$ go run hello.go
Hello, World!
$ go build -o hello hello.go
$ ./hello
Hello, World!

## GitHub
https://github.com/GL-Kageyama/Go_HelloWorld

元記事を表示

Golangのポインタで詰まったので備忘録

### 執筆の経緯
最近の静的型付言語ブームに乗っかって、Golangの勉強を始めました。
絶対詰まるだろうなと思っていたポインタでやっぱり詰まったので、20億番煎じくらいの内容ですが備忘録として残します。
保険をかける[^1]わけではないですが、初心者の備忘録なので誤っている箇所も多数あると思います。
是非ご指摘いただけると大変嬉しいです。
なお各コードの冒頭にThe Go Playgroundのリンクを付けてあります。
是非実際の動作を試したり、ちょっとイジって実験してみたりしてください。

### 筆者について
普段Vue.js / TypeScriptを業務で書いているフロントエンドエンジニアです。
趣味でReactやLaravelを触ったりはしてますが、Golangのような静的型付言語は初めてです。(Javaはほんのちょっと触ったことがある程度)

### 値渡しと参照渡しについて
“`main.go
package main

import “fmt”

func main() {
var age = 10
fmt.Println(age) // 10
}
“`

元記事を表示

Goのプログラム内でjqを使ってJSONを加工する

## はじめに

JSONデータをフィルタしたり、集計したりといった加工に`jq`コマンドは便利ですよね?

Goでプログラムを書いた場合も、プログラムの中でJSONを扱うケースは多々あると思いますが、
JSONの構造に合わせて構造体を定義してマッピングしたり、ちょっとした成形をしたりと面倒なことがあると思います。

今回は、`gojq`を使ってGoのプログラムの中でjqを使ってみましょう。
`gojq`はGoで書かれたjqコマンド実装で、Goのライブラリとしても使用できます。

gojq
https://github.com/itchyny/gojq

## 題材

ホットペッパーWebサービスに含まれる「グルメサーチAPI」の出力結果を一部取り出すGoプログラムを書いてみます。
https://webservice.recruit.co.jp/doc/hotpepper/reference.html#1

ホットペッパーWebサービスを呼び出す場合は、ユーザ登録が必要です。
「プライバシーポリシー」と「リクルートWEBサービス 利用規約」に同意し、メールアドレス認証を行います。

元記事を表示

【Go】VSCodeの実行で標準入力を行うと「noDebug mode: unable to process ‘evaluate’ request」が発生

## 概要
GoでAtCoderをやる時など、標準入力を使うと思いますが、VSCodeで実行時に`noDebug mode: unable to process ‘evaluate’ request`というエラーが発生しました。
なお、Goの標準入力の詳細については、[[1分学習]Goで標準入力を受け付ける](https://zenn.dev/tomatomato/articles/onemin_golang_stdin)の記事を参照ください。

## 対応
[こちら](https://github.com/golang/vscode-go/issues/2015)のissueを参照すると、VSCodeの`launch.json`へ設定追加が必要なようです。`”console”: “integratedTerminal”`の設定を追加すれば、動作しました。
念の為、`launch.json`の全体内容を以下に記載します。

“`json:launch.json
{
“version”: “0.2.0”,
“configurations”: [
{

元記事を表示

Goを使ってNotionカレンダーからGoogleカレンダーへデータを移動させてみる

# はじめに
NotionのカレンダーとGoogleカレンダーを両方つかっていましたが、
2つとも管理するのが煩わしくなってきたので、Googleカレンダーに統一しようと思いました。

そこでNotionAPIとGoogleCalendarAPIを使って、Notionカレンダー→Googleカレンダーへ
データを移動するプログラムをGoで作ってみました。

# それぞれのAPIの始め方
ひとまず両方ともAPIを触ったことがなかったので、公式のスタートガイドから概要を学びました。
スタートガイドとリファレンスについては下のリンクになります。
詳しいガイドの内容については割愛させて頂きます。

**NotionAPI**
[NotioAPIスタートガイド](https://developers.notion.com/docs)
[NotionAPIリファレンス](https://developers.notion.com/reference/intro)

**GoogleCalendarAPI**
[GoogleCalendarAPIクイックスタート](https://developer

元記事を表示

GOPATH と go module を理解するためのメモ

この記事はほぼ自分用メモです。

### 概要
– GOPATH, GOROOT, go mod を理解できてなくていろんなところでつまずく
– goenv 使わない限り GOROOT は気にしなくてもよさそうだから、とにかく GOPATH と go mod を理解したい
– 以下の記述はこれらのページを参照して自分用に整理したものなので、不明点・曖昧箇所があった場合はこちらを参照すること
– [Go のモジュール管理【バージョン 1\.17 改訂版】](https://zenn.dev/spiegel/articles/20210223-go-module-aware-mode)
– [Go1\.16からの go get と go install について \- Qiita](https://qiita.com/eihigh/items/9fe52804610a8c4b7e41)
– [go mod完全に理解した](https://zenn.dev/optimisuke/articles/105feac3f8e726830f8c)

### Go Modul

元記事を表示

gorm with PostgreSQL で Primary Key / ID を UUIDv4 にするには ( Docker 対応 )

# Motivation
– できるだけ gorm 標準の `gorm.Model` に準拠させた形にして、gorm の恩恵を受けたい

“`go
import (
“gorm.io/driver/postgres”
“gorm.io/gorm”
)

type Product struct {
gorm.Model
Code string
Price uint
}
// → このままだと PK が uint / auto_increment フィールドになる
“`

# 結論
以下のサンプルコードをご覧ください。

“`go
type UUIDBaseModel struct {
// UUID が主キーになり、UUID は Postgres が勝手に生成する
ID string `gorm:”primaryKey;size:255;default:uuid_generate_v4()”`
CreatedAt time.Time
UpdatedAt time.Time
DeletedAt gorm.DeletedAt `gorm:”index

元記事を表示

SQL Boilerでintで生成されるフィールドをint32にする

SQL BoilerはDBスキーマから構造体などを生成してくれる便利ORMです。
DBスキーマの型からGoの型にいい感じにマッピングしてくれるのですが、DB(ここではPostgresSQL)でintegerで定義したものはGo上ではintで表現されるようになります。
これでも特に困らないことは多いのですが、OpenAPIやProtocolBuffersなどから生成されるGoのコードではintはint32で定義されるので、これらと相互に変換する際にはint32になっていたほうが都合が良いです。
intとint32の変換であればそこまで大変ではないのですが、 null許可されたカラムはnull.Intと*intで表現されるため、これを*int32にキャストはとてもめんどうです(めんどうというかやり方がわからなかった。)
*intを避けるのであれば、DBスキーマでNULL許容しなければよいという話ではあるのですが、その話をすると長くなるのでここではやめ、*intと真剣に向き合うことにします。
とは言え方法は簡単で、SQL Boilerの設定ファイルに以下のように記載するだけです。
“`to

元記事を表示

OTHERカテゴリの最新記事