Go関連のことを調べてみた

Go関連のことを調べてみた

entgoで生成されるモデル構造体から`json:”omitempty”`を駆逐したい

:::note info
**要するに**
entgoで生成されるモデル構造体から`json:”omitempty”`を駆逐するためのライブラリを作成しました。

– https://github.com/a10adotapp/entfw
:::

# 困ったこと

goのORMに[ent.](https://entgo.io/)を使用し、スキーマファイルからモデル構造体を自動生成する際、
生成される構造体には`json:”omitempty”`のタグが自動で付与されています。

例えばこのようなスキーマを作成して、

“` go
package schema

import (
“entgo.io/ent”
“entgo.io/ent/schema/field”
)

// Pet holds the schema definition for the Pets entity.
type Pet struct {
ent.Schema
}

// Fields of the Pet.
func (Pet) Fields() []ent.Field {
return []e

元記事を表示

Golang&PostgreSQL:「Dockerfile」「compose.yml」環境構築

# Dockerfile
alpineを使うことで、軽量なdocker イメージを利用することができます。
基本的にGolangは、マルチビルドな構成のため、FROMが二つあります。
デフォルトの`GOARCH=amd64`を指定してますが、余裕があればさらに軽量な`GOARCH=arm64`を試してみてください。
“`Dockerfile
### ビルド用ステージ ###
FROM golang:1.21.4-alpine as builder

WORKDIR /app
COPY go.mod ./
COPY go.sum ./
RUN go mod download
COPY . .
RUN GOOS=linux GOARCH=amd64 go build -o main .

### 開発用ステージ ###
FROM golang:1.21.4-alpine as development

# アップデートとvim,gitのインストール
RUN apk update && apk add vim git

# sqlcのインストール
RUN go install github

元記事を表示

GoでReactをSSRする

## 概要

GoでReactをSSRできそうだったので試してみました。
下記が動作の様子と実施のコードです。

![](https://storage.googleapis.com/zenn-user-upload/4f86b0635c6b-20240121.gif)

https://github.com/K-Sato1995/go-ssr-poc

やっている間に良い感じに実現されている下記のプロジェクトも見つけました。
私の現状のPOCだと実現できないことが色々実現されててすごいなと思いました。

https://github.com/natewong1313/go-react-ssr

## やりたい事

– Go環境でReactの[renderToString](https://react.dev/reference/react-dom/server/renderToString)でSSRを行う
– 実行結果をブラウザに渡す
– ブラウザでReactの[hydrateRoot](https://react.dev/reference/react-dom/client/hyd

元記事を表示

KEDAとEventHubsを使用したKafka ScaledJobsのサンプル

以下は、Kafka ScalerとScaledJobのテスト用サンプルを作成するためのブログの日本語訳です。シンプルなGoクライアントが必要で、メッセージを消費したら終了するものです。Goを使用する理由は、[KEDA](https://keda.sh/)のKafka ScalerがKafka Scalerの実装に[saram](https://github.com/Shopify/sarama)を使用しているからです。そのため、Kafka Scalerの実装を理解するのに役立つと思いました。

# Kafka Broker

Kafka Brokerは、ブローカーを簡単に作成するためにEventHubsとして使用します。EventHubsはKafka APIで使用することができます。

* [Apache KafkaアプリケーションからAzure Event Hubsを使用する](https://docs.microsoft.com/en-us/azure/event-hubs/event-hubs-for-kafka-ecosystem-overview)

# 設定

## Sar

元記事を表示

Go言語のdatabase/sqlパッケージはデータベースドライバーをどのようにして読み込んでいるのか

# 本題
Go言語のdatabase/sqlパッケージがデータベースドライバーをどのようにして読み込み、利用しているか気になったので調べてみました。
## サンプルコード
“`go
import (
“database/sql”
“time”

_ “github.com/go-sql-driver/mysql”
)

// …

db, err := sql.Open(“mysql”, “user:password@/dbname”)
if err != nil {
panic(err)
}
“`
引用) https://github.com/go-sql-driver/mysql

mysqlの場合はこんな感じで読み込むのですが、`database/sql.Open`関数の第一引数には”mysql”という文字列しか渡されていなく、ドライバーの実装は渡されていないんですよね。

`database/sql.Open`関数の実装を見てみましょう。
“`go
func Open(driverName, dataSourceName string) (*DB, error

元記事を表示

fake-clientのRESTClientをIndexerInformerに渡すとpanicする

Kubernetes client-goのIndexerInformerを使った実装で、以下のようにclientsetからRESTClientを取得してcacheを作成しようとしたところ、go testでfake clientを渡した際にclient内部でパニックが発生していた。
“`go
cachedLw := cache.NewListWatchFromClient(clientset.CoreV1().RESTClient(), resource, “”, fields.Everything())
indexer, informer := cache.NewIndexerInformer(cachedLw, &v1.Pod{}, 0, cache.ResourceEventHandlerFuncs{
AddFunc: func(obj interface{}) {
// on create…
},
UpdateFunc: func(old interface{}, new interface{}) {
// on update

元記事を表示

GCP Cloud Data fusion機能/実装

# GCPのCloud Data Fusionの概要と機能

## 目次
1. [概要](#概要)
2. [機能/詳細](#機能詳細)
3. [まとめ](#まとめ)

## 概要
GCPのCloud Data Fusionは、エンタープライズデータ統合のための完全マネージドなサービスです。データパイプラインの構築、監視、管理が簡素化されます。Cloud Data Fusionは、異種のデータソースを統合して、高度なデータ変換やトランザクションを行うことができます。

## 機能/詳細
– **データ統合パイプラインの作成**: Cloud Data Fusionは、直感的なビジュアルユーザーインターフェースを提供し、データパイプラインの作成を簡単にします。ビジュアルドラッグアンドドロップエディタを使用して、異なるデータソースやトランスフォーマーションステップを組み合わせてデータフローを構築できます。

– **スケーラビリティと信頼性の向上**: Cloud Data Fusionでは、自動スケーリングがサポートさ

元記事を表示

Docker + GolangでTimeZoneがうまく設定できない

# はじめに
どうも僕です。

業務でDockerを使うことがあるのですが、`golang`のコンテナで`cron`の実行をする際、タイムゾーンが`UTC`だったので`JST`に変えようとしたところ、結構つまづいたのでメモっておきます。

# 概要
`golang`にてcronを使って毎日特定の時刻に関数を走らせたい!

しかしタイムゾーンがUTCだ!!

どうにかせんといかん。

# 結論
先に結論を言うと、 Dockerfileに次のコードを追加する。

“`Dockerfile
FROM golang:1.19

WORKDIR /usr/src
# これを追加↓
ADD https://github.com/golang/go/raw/master/lib/time/zoneinfo.zip /usr/local/go/lib/time/zoneinfo.zip
“`

そしてコード

“`go:sample.go
package main

import (
“fmt”
“log”
“os”
“time”
)

func main() {
os.Seten

元記事を表示

GoでgRPCサーバーを立ててみる2(gRPCのスキーマ定義とコード生成)

こんにちは。
金です。
今日は「gRPCのスキーマ定義」について部分いたします。

# 事前準備

まずは、以下のようにディレクトリとファイルを作成します。

“`
.
└─ article
├── client ─ client.go
├── repository ─ repository.go
├── server ─ server.go
├── service – service.go
└── article.proto
“`

また、ルート配下でgo moduleの初期化を行なっておきましょう。

“`terminal
go mod init
“`

### .protoファイルの記述

.protoファイルにgRPCのスキーマ定義を記述していきます。
実装するarticleサービスの仕様はprotoファイルのservice部分で定義しているように、CRUD+全取得ができるものになっています。

“`article/article.proto
syntax = “proto3”;

package article;
option go_p

元記事を表示

Go で OIDC RP が実装できるライブラリを探す

## はじめに

OIDC RP を実装する場合以下のようなことをする必要があります。
※ 認可コードグラントです。

– ディスカバリ構成の管理
– 認可エンドポイントの生成
– トークンエンドポイントへのアクセス
– トークンの検証

etc …

OIDC はカッチリ仕様が決まっていますし、そこまで複雑な実装にもならないと思いますが、ライブラリがあるなら頼りたいものです。
本記事では Go で OIDC RP をライブラリを用いて実装するにあたり候補となるライブラリを調査し実際に使ってみたのでご紹介します。

## ライブラリ

調べたところ候補となるライブラリは以下の2つがありました。
(ほかにもあったら教えていただきたいです。)

https://github.com/zitadel/oidc

https://github.com/coreos/go-oidc

どちらもライセンスは `Apache-2.0 license` です。

本記事執筆で参照しているそれぞれのライブラリのバージョンは

– `zitadel/oidc` : [v3.10.0](https://

元記事を表示

Connectを使用したgRPCサーバーでReflection APIを有効にする方法

# Connectを使用したgRPCサーバーでReflection APIを有効にする方法

## はじめに
最近、`connectrpc.com/connect`を使用してgRPCサービスを開発する際、gRPC UIツールで「Failed to compute set of methods to expose: server does not support the reflection API」というエラーに直面しました。この問題は、Connectを使ったgRPCサーバーでReflection APIが有効になっていないために発生します。この記事では、Connectを使用してgRPCサーバーを構築する際にReflectionを有効にする方法を紹介します。

## Connectとは?
Connectは、gRPCとHTTP/2をサポートする軽量なGoライブラリで、net/httpサーバーでの使用に最適化されています。しかし、Connectを使用するときには、通常のgRPCサーバーとは異なる方法でReflectionを設定する必要があります。

## Reflectionの必要性
gR

元記事を表示

GoでforEachなど便利機能を提供してくれるgo-funkを紹介したい

## はじめに
go-funkはJavaScriptにあるforEactやMap,PHPなどにあるFindやGetなどの便利機能を提供してくれるライブラリです。
使い方は公式を見ればわかるので、ここでは代表的な機能について数行で紹介していきます。

https://github.com/thoas/go-funk

github.com/thoas/go-funk

## 使用できる機能
個人的によく使用する順で載せていきます。ここに載っているものが全てではないので、公式で使いたいものがあるか探してみるのもいいと思います。

`func Map(arr interface{}, mapFunc interface{}) interface{}`
JSのmapと同じで、配列、スライスの各要素を2乗するなどの加工が可能。ただ、goの場合はMap機能によってmapからslice、sliceからmapに変更することができる。

`func Find(arr interface{}, predicate interface{}) interface{}`
指定された条件に該当する最初の要素を配

元記事を表示

GCP Data Catalog機能/実装

# GCPのData Catalogの概要と機能

## 目次
– [概要](#概要)
– [機能/詳細](#機能詳細)
– [まとめ](#まとめ)

## 概要
GCPのData Catalogは、データの探索、検索、モデリング、データガバナンスを容易にするためのメタデータ管理サービスです。Data Catalogを使用することで、組織内のデータリソースを中央集中的に管理し、データの可視性を向上させることができます。

Data Catalogは、データ資産に関連するメタデータ(データの特性や関連情報)を統合したデータカタログを提供し、以下のような機能を提供します。

## 機能/詳細

### メタデータ管理
Data Catalogは、データリソースのメタデータを一元管理します。メタデータには、データセット、テーブル、ビュー、ストアドプロシージャなどのデータリソースの情報が含まれます。メタデータは階層的に組織され、関連データリソースを簡単に見つけることができます。

以下は、Data Catalogのメタデータを管理する方法の一例です。

“`java
import com.g

元記事を表示

Goを「何となく使っていた」から、理解して「使える」ようになる

# はじめに

go を実際に利用をしてきましたが復習も兼ねて、下記の内容を試しに動かしつつ確認をしました。
( 何かリクエストがありましたら、コメントいただければ追記したいと思います )

1. func の定義方法の違いに関して
1. context や goroutine の正しい扱い方に関して
1. testingパッケージ の使い方に関して

:::note info
自分用のメモとしてまとめているため、細かい解説はありません。
:::

※ [go の playground](https://go.dev/play/) を利用しました。
 「Share」を押下すると、記載したコードを表示できるリンクが生成されるので、便利ですね。

# Struct の Func定義方法による違い

https://go.dev/play/p/CMn_54pImua

“`golang
package main

import (
“fmt”
)

type StructPointer struct {
Hoge string
Fuga string
}

func (sp *S

元記事を表示

entでINNER JOINを行う

https://github.com/urakawa-jinsei/ent-join

entでのINNER JOINの実装方法がいまいち正確に載っていなかったので、頑張って調べてみました。

## ER図
“`mermaid
erDiagram
uploaded_content ||–|{ content : content
uploaded_content {
string filename
}
content ||–|| content_movie_metadata : content_movie_metadata
content {
string filename
string uploaded_content_filename
}
content_movie_metadata {
string filename
int width
int height
}
“`

## スキーマ定義
“`go:ent/sch

元記事を表示

Go言語でimportされているmoduleのダウングレードを行う方法

## 1
GO.modに記載されているダウングレードしたいmoduleを全て削除する。

## 2
go mod tidyコマンドを実行する

以上!

参考リンク

https://gist.github.com/d-kuro/3e78cba6b68d52c01b30a3b2b73b8285

元記事を表示

golang/mockをわかりやすく説明したい

## はじめに
golang/mockをわかりやすく解説したい

https://github.com/golang/mock

## 要点
・go mockによってテスト中にメソッドの返り値を強制的に設定できる。

・go mockによってテスト中にメソッドが呼ばれない、または指定した引数で呼ばれていないときはテストを失敗にできる。

## 実際にコードを見てみよう
試しに下のようにsample.goにinterfaceを定義します。

“`
package sample

type Sample interface {
Method(s string) int
}
“`

その後次のコマンドを打ちます。

“`
$ go install github.com/golang/mock/mockgen@v1.6.0

$ mockgen -source sample.go -destination mock/mock_sample.go
“`

そうするとmockディレクトリに下のコードが生成されます。

“`
// Code generated by MockGe

元記事を表示

Go pkg/errorsのerrors.Cause()は何にでも使っていいわけではない

# はじめに
こんにちは。最近業務でGoを書いているハセガワカンタです。
先日[pkg/errors](https://pkg.go.dev/github.com/pkg/errors#section-readme)のCause()メソッドで少しハマったので書き残しておきます。

# errors.Cause()の注意点
errors.Cause()はエラーの連鎖を遡って根本的な原因を探る関数ですが、すべてのエラーを辿ることができるわけではありません。エラーがcauserインターフェースを満たしていない場合、errors.Cause()の再帰的な処理が中断されます。この場合、errors.Cause()だけでは最後までエラーを辿ることができません。

https://github.com/pkg/errors/blob/5dd12d0cfe7f152f80558d591504ce685299311e/errors.go#L264-L288C2
“`go
// Cause returns the underlying cause of the error, if possible.
/

元記事を表示

M1 Mac環境でOracleClientを利用する(Go言語)

M1 MacでGo言語を利用してOracleに接続する処理を開発したいが、OracleClientにはM1 Macに対応したClientが提供されていません。[Rosetta2](https://support.apple.com/ja-jp/HT211861)を利用して動作確認した際の設定をまとめます

以下のようにIntel x86版しかない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3635433/e654c902-57d7-1ef5-3064-04188360091b.png)
https://www.oracle.com/jp/database/technologies/instant-client/downloads.html

## 前提
・OracleClient x86_64版がインストールされている
・Goがインストールされている

# まずは動かしてみる

環境確認
“`
~ % uname -m
arm64
“`

Oracleに接続するコードを用意
[

元記事を表示

変態DevOpserが構築するGitHub PRのresolveし忘れリマインダー①(コメントはGemini APIで関西弁で要約)

## はじめに

1日324回DevOpsのことを考えてしまう変態子持ちflutterエンジニアです。
妻からは育児中にいつも~~DevOpsのことばかり考えるな~~スマホばかりいじるなと言われ、悪戦苦闘の毎日です。。
…そんなことはどうでも良いんです、ハイ。本題に行きましょう。

私はモバイルアプリのチーム開発をしておりますが、バージョン管理はGitHubが使われてます。
チーム開発において、レビュワーからコメントがあったものは、レビュワーが[resolve](https://docs.github.com/ja/pull-requests/collaborating-with-pull-requests/reviewing-changes-in-pull-requests/commenting-on-a-pull-request#%E4%BC%9A%E8%A9%B1%E3%82%92%E8%A7%A3%E6%B1%BA%E3%81%99%E3%82%8B)を判断すべきだと思ってますが、私を含めてチーム内で、resolveのし忘れがたまにあります。
そこで勝手に、Discordで

元記事を表示

OTHERカテゴリの最新記事