Go関連のことを調べてみた2023年01月01日

Go関連のことを調べてみた2023年01月01日

gqlgen 1対多のデータの取得【実装編-Part3】

# 1対多のデータの取得

:::note warn
間違っている部分、エラーが発生する部分、わかりにくい部分などがございましたら、是非ご指摘をお願い致します。
:::

## 今回はPart4になります。

**基本的な事をメインに行っているので前回までの内容を知らなくても基本的には問題ありません。前回までの内容をgithubから取得して来ても良いかと思います。(importのgithub.comを調整する必要があるかも知れないですが…)**

前回:公式ドキュメントを用いて作成した物にデータベースの導入を行いました。

https://qiita.com/shion0625/items/7448d39451a626e453bd

## この記事の内容
前回までに作成Todoアプリを改修していきます。
– createUserのmutationの追加
– usersのqueryを追加
– usersからそのユーザの複数のTodoを取得する

## Github Repo
この記事で紹介するコードはGithubに置いています。

**Part4までの切り取り**

https:

元記事を表示

【小ネタ】AWS CDK を使って ECS に LoadBalancer に独自ドメインを設定した話

# 概要

`AWS CDK for Golang` を使って `AWS` の `ECS` のクラスタにロードバランサを設定し、そのロードバランサに独自のドメインを設定します。

# この記事で伝えたいこと

* `AWS CDK` を使うことで、簡単にロードバランサの設定を行うことができる

# 課題を解決する技術、手法

こんな感じのコードを書きます。

“`go
import (
“fmt”

“github.com/aws/aws-cdk-go/awscdk/v2/awscertificatemanager”
“github.com/aws/aws-cdk-go/awscdk/v2/awsec2”
“github.com/aws/aws-cdk-go/awscdk/v2/awsecr”
“github.com/aws/aws-cdk-go/awscdk/v2/awsecs”
“github.com/aws/aws-cdk-go/awscdk/v2/awsecspatterns”
“github.com/aws/aws-cdk-go/awscdk/v2/awsel

元記事を表示

Dockerで始めるgRPC

# はじめに

dockerを使ったgrpcをまとめたいと思います。
内容は、クイックスタートに準拠しています。

https://grpc.io/docs/languages/go/quickstart/

レポジトリーを作りました。

https://github.com/sugiyama404/practice_grpc

## gRPCとは

gRPCとは、http2とバイナリを使用した高速通信可能なgoogleが開発したPRCフレームワークです。

![Qiita](https://grpc.io/img/landing-2.svg)

## プロトコルバッファとは

構造化データ定義し、シリアライズするためのオープンソースメカニズムです。
protocコマンドを打つことで、goファイルを自動生成します。

# コーディング
## Dockerをbuild

“`console:ファイル構成
.
├── client
│ ├── Dockerfile
│ └── go_grpc
│ └── bin
│ └── go_starter

元記事を表示

GqlgenでDB(postgreSQL)の導入【実装編-Part2】

# GqlgenでDB(postgreSQL)の導入

:::note warn
間違っている部分、エラーが発生する部分、わかりにくい部分などがございましたら、是非ご指摘をお願い致します。
:::

## 今回はPart3になります。
**基本的な事をメインに行っているので前回までの内容を知らなくても基本的には問題ありません。前回までの内容をgithubから取得して来ても良いかと思います。(importのgithub.comを調整する必要があるかも知れないですが…)**

前回:公式ドキュメントを参考にGraphqlのスケルトンプロジェクトを作成いたしました。

https://qiita.com/shion0625/items/be454f94a99cac461d5e

## この記事の内容
前回作成した公式のドキュメントで作成したプロジェクトにデータベースを導入していきます。
– migrationファイルの作成
– gormを用いたデータベースの操作

## Github Repo
この記事で紹介するコードはGithubに置いています。

**Part3までの切り取り**

元記事を表示

GoとGraphQLでサーバー実装 【実装編-Part1】

# gqlgenを用いてGoサーバを構築する

:::note warn
間違っている部分、エラーが発生する部分、わかりにくい部分などがございましたら、是非ご指摘をお願い致します。
:::

## 今回はPart2になります。
**基本的な事をメインに行っているので前回までの内容を知らなくても基本的には問題ありません。前回までの内容をgithubから取得して来ても良いかと思います。(importのgithub.comを調整する必要があるかも知れないですが…)**
前回:Dockerを使用してGoとPostgreSQLの環境構築

https://qiita.com/shion0625/items/0f4e919c6b7eb2092233

## この記事の内容
実際にgqlgenを使用してGraphQLサーバを立ち上げて動かします!

## Github Repo

この記事で紹介するコードはGithubに置いています。

### Part2までの切り取り

https://github.com/shion0625/gqlgen-todos-article/tree/main/pa

元記事を表示

GoとGraphQLでサーバー実装 【環境構築編(Docker)】

# DockerでGoとPostgreSQLの環境構築

:::note warn
間違っている部分、エラーが発生する部分、わかりにくい部分などがございましたら、是非ご指摘をお願い致します。
:::

## この記事の内容
この記事はGo,GraphQL,PostgreSQLと使用してサーバの実装の**Part1**になります。
今回はDockerを用いてGoとPostgreSQLの環境構築を行います。

## Github Repo
この記事で紹介するコードはGithubに置いています。

https://github.com/shion0625/gqlgen-todos-article/tree/main/part1
## dockerファイルの作成

### 今回のディレクトリ構成

“`
gqlgen-todos
├── docker
│ └── go
│ └── Dockerfile
└── docker-compose.yaml
“`

#### Dockerfile
Goのイメージには軽量なalpineを使用しています。

– **git:** go

元記事を表示

【小ネタ】Lambda の Dockerイメージをコードから作成した話

# はじめに

[Releaseタグ作成からEKSへのデプロイを自動化した話](https://qiita.com/ijufumi/items/c8c54c2295baf04113b2) でやった内容のうち、 `Lambda` に焦点を当てた内容です。

載せているコードは一部だけなので、全体を見たい方は上記の記事から辿ってください。

# 環境

* `Kubernetes`: `1.24`
* `AWS CDK for Golang`: `v2.56.1`

# やったこと

## Lambda用のコードを準備

`lambda` ディレクトリに、必要なファイルを用意します。
`Dockerfile` のみ載せています。
他は、`Github` リポジトリを参照。

* `Dockerfile`

“`Dockerfile
FROM public.ecr.aws/lambda/python:3.9

COPY . ${LAMBDA_TASK_ROOT}

COPY requirements.txt .
RUN pip install –upgrade pip && pip3

元記事を表示

【Golang】Print系関数の違い

# 出力系関数の違い

## fmtパッケージに含まれるPrint系関数
golangを勉強している中で文字列を出力する関数を調べた所、標準パッケージに複数種類含まれていることがわかった。
まだまだ初心者の自分ではどの関数が今書いているコードに適切な関数か調べる必要があったため、自分の備忘録も含めて記事にしようと思う。

:::note warn
警告
下記まとめ内容は、公式ドキュメントをもとに書き出したものです。
詳細については、各段落記載の公式ドキュメントをご参照ください。
:::

## 全体像
Print系関数についてしらべたところ、ざっくりと下記種類が存在していた。
後述にて、それぞれの関数について記載する。
“`go:Golang:fmtパッケージ
// (1)標準出力へ出力する関数
func Print(a …any) (n int, err error)
func Printf(format string, a …any) (n int, err error)
func Println(a …any) (n int, err error)

// (2)書

元記事を表示

自作言語にdefer文を実装した(がGoと微妙に挙動が違う)

# TL; DR

– 本家(Go)は関数呼び出しのみ遅延
– 自作言語の実装では式の評価全体を遅延してしまった

# はじめに

Go言語の `defer` 文を使うと、関数を抜ける際に必ず処理を実行することが可能です。
panicした場合も後処理の実行が保証され重宝しています。

“`go
file, err := os.Open(“file.go”)
if err != nil {
// …
}
defer f.Close()
“`

https://go.dev/ref/spec#Defer_statements

便利なので拙作の言語 [Pangaea](https://github.com/Syuparn/Pangaea) でも `defer` 文を導入しています。

(Pangaea言語自体は過去の記事でも紹介しておりますので、よろしければご覧ください)

https://qiita.com/Syuparn/items/87cafc7fd206016a0f8d

しかし、先日 「Go Quizzes 101」というGoの文法のクイズ[^quiz]を解いて

元記事を表示

[Go]Collection操作が楽楽書けるsamber/loライブラリの紹介

元々RailsからGoの案件にうつって一ヶ月半ほど経過しました。
この間に、Rubyに存在した

– 配列から条件にマッチする要素を取得する“find(detect)“
– 配列から条件にマッチする要素で絞り込んだ配列を生成する“filter(select)“
– 配列から新たな配列を生成する“map“

といった**便利メソッドが標準ライブラリとして存在せずforループやら活用して自分たちでなんとかするしかない・・・というのが実情であると知って絶望** していましたが、Go 1.18で追加されたジェネリクスを利用した外部ライブラリ[samber/lo](https://github.com/samber/lo)を使えば楽に書けることを知って歓喜しました。

自分と同じように**Rails案件からGo案件に移ってきて絶望した人向けに、サンプルコードで対比して紹介**したいと思います。
また、このライブラリには弱点も存在するので、その辺も交えて紹介したいと思います。

なお、Rubyでは配列は「Array」と呼び、Goでも配列はあるけど、実際使うのはほぼ動的配列である「Sli

元記事を表示

[Go]実務でよく使うGoLandの機能

Goの現場に入り、コーディングに使用するエディタが VSCode から **GoLand**(こっちはIDEですが)になって一ヶ月半ほど経過した。
諸先輩方にアドバイスをいただいた上で、自分が取り入れたプラグインや機能が頭打ちになったのでアウトプットしておく。
GoLandは日本語化してる前提。また、ショートカットはMac前提。

# 1. プラグイン
プラグイン名|説明
—|—
Indent Rainbow|インデントを階層ごとに色分け
Rainbow Bracket|カッコを階層ごとに色分け
GitToolBox|エディタ内各コードのコミット履歴を表示する

VSCodeでお世話になっていた一部の拡張機能の代替品。

# 2. 機能
## 2.1. 検索・置換

機能|操作
—|—
ファイル検索|Command + Shift + O (後述のShift2回からでも可能)
ファイル(アクティブな)内の文字列検索 or 置換|Command + F or R
複数ファイル内の文字列検索 or 置換|Command + Shift + F or R
複数ファイ

元記事を表示

自作Go言語WebAPIをEC2上で デーモン化する。簡単だけどつまづきやすいポイントもあった。

今回はGo言語で作成した自作のお問い合わせメールAPIを、EC2からログアウトした後でも デーモン によってmain.goが実行され続けるようにします。つまりパソコンを閉じてもgo run main.goの処理が止まらないようにします。

前回、EC2環境で実行させることでAPIがインターネットにつながり、ようやくWebAPIが実用的なものになったと思われました。

しかし実際やってみると、EC2でコマンド「go run main.go」によってAPIは動作したのですが、EC2をログアウトすると実行も途切れてしまいました。これでは実用的とは言えません。

## デーモン とは

そこで必要になるのがデーモンです。

デーモンという名前ですが、怖いものではありません。

デーモンとは、バックグラウンドで実行処理をしてくれるおかげで、パソコンを閉じてもEC2のインスタンスが実行状態である限り実行ファイルの実行が途切れなくなるプログラムです。

そしてデーモン状態に切り替えることをデーモン化と言います。

EC2環境でAPIが動作することが前提です。EC2での動作方法はこちらの記事をご覧くだ

元記事を表示

【 APIキー 開発 】Go言語による自作WebAPIに原始的な APIキー 認証機能を実装する

今回は自作のWebAPIに APIキー 認証機能を実装します。様々なツールやライブラリもありますが、今回はそのようなものは使わず、最低限の認証機能をプログラミングだけで作成します。Web通信に0からAPIキー認証機能を実装したいという方の参考になれれば幸いです。

## 土台となるAPI

今回APIキーを実装させるAPIは、前に作ったGo言語・RESTAPI・SendGridによるお問い合わせメールAPIです。作り方や使用は[こちら](https://qiita.com/haruki-lo-shelon/items/3ed239d5479f84b10384)の記事から参照できます。(少しプログラムに変更点もあります。詳しいコードは[GitHub](https://github.com/haruki-lo-shelon/go_sendEmail2)に掲載)

https://qiita.com/haruki-lo-shelon/items/3ed239d5479f84b10384

https://github.com/haruki-lo-shelon/go_sendEmail2

#

元記事を表示

Golangのゼロサプレス

## ゼロサプレスとは

例えば`“000012″`という文字列があったときに、頭についている余計な`”0”`を取り除くこと

“`
// ゼロサプレスの例
000012 → 12
001234 → 1234
000101 → 101
000110 → 110
“`

### 最初にゼロサプレスをするために考えたこと

文字列を一つ一つ見ていって、0ではないものが出てきた時に別スライスにappendすればいいんじゃないか

“`go: before.go
package main

import (
“fmt”
“strings”
)

func zeroSuppress(str string) string {
slice := strings.Split(str, “”)
res := make([]string, 0)
flag := false

for _, v := range slice {
if v != “0” {
flag = true // 0でないものが現れたら、flagをtrueにしてappendするようにした
}
if

元記事を表示

goの -mod オプション

* [Build Command – Go Modules Reference – The Go Programming Language](https://go.dev/ref/mod#build-commands)

パッケージ情報を必要とする go の一部のコマンド実行時に `-mod` オプションを指定することができる。
`vendor` `mod` `readonly` のいずれかの値を指定可能。

対象となるコマンドの例として、`go build` `go run` `go test` などがある。

# 指定できるオプション

## `-mod=vendor`

モジュールの参照先として `./vendor` ディレクトリ配下を使用するする。ネットワーク経由でのダウンロードやモジュールキャッシュの使用はしなくなる。
`./vendor` ディレクトリは `go mod vendor` コマンドで生成することができる。

## `-mod=mod`

`./vendor` ディレクトリが存在する場合でもモジュールの参照先として無視する。
また現時点のソースを見て、`imp

元記事を表示

Dapr go-sdkのactor clientはどのようにリクエストを行っているのか

# TL; DR

– go-sdkのactor client作成時にgRPCリクエスト実装は不要
– ユーザーが指定するのは関数フィールドの定義のみ
– `client.ImplActorClientStub` が `reflect` を使って動的に関数生成

# はじめに

Daprのactorを使ってみようとgo-sdkのサンプル実装を見ていたところ、クライアント側にgRPCリクエスト処理が見当たりませんでした。

https://github.com/dapr/go-sdk/blob/b465b1fa07211ee8a43bdd66906423d2e9e14ebd/examples/actor/api/actor.go

“`go:examples/actor/client/main.go
// actorのメソッドGetUserを呼び出し。この実装はどこにある?
user, err := myActor.GetUser(ctx, &api.User{
Name: “abc”,
Age: 123,
})
“`

メソッドを追いかけようとするも、実態はフィールドで定義が

元記事を表示

AWS SAMでGo+API Gateway+Lambda+DynamoDBのサーバレスAPI構築をIaC化した

# はじめに
前回Goで作成したAPIの環境構築をSAMでIaC化しました。

https://qiita.com/tkhs1121/items/7b193dcce19539f16761

# 環境
MacBook Air M1
開発言語 Go

# 手順

AWS CLIとSAM CLIをインストールします。

“`shell
brew install awscli
brew tap aws/tap
brew install aws-sam-cli
“`

AWSコンソールのIAMからアクセスキーを作成して、クレデンシャルを設定します。

“`shell
aws configure
“`

前回のソースディレクトリにSAMの`template.yaml`を追加します。

https://github.com/tkhs1121/go-serverless-app-3

## ソースコード
“`yaml:template.yaml
AWSTemplateFormatVersion: ‘2010-09-09’
Transform: AWS::Serverless-2016-10-

元記事を表示

ローカルのGoのバージョンアップはめちゃ簡単な話

# 前提
Macでしか試していません。
古いバージョンのGoは、Go公式からダウンロードしてインストールした場合。

# バージョンアップ方法
[Goの公式サイト](https://go.dev/doc/install)でDownloadボタンを押して、インストールを進めるだけです。

既にGoがインストール済みの場合は以下のポップアップがでます。OKを押すだけで古いバージョンを削除したうえで、新しいバージョンをインストールしてくれます。
![Goのインストール.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221948/040cb241-bcc1-ebf5-531d-d2d786461f27.png)

自分で古いGoをアンインストールする手間もないので、めちゃ楽ですね!

元記事を表示

【Go】並列実行の勉強がてらスリープソートを書いてみよう

# まえがき
ゴルーチン、まるで分らない…Fuseです
そんな悩みを解決しようと並列実行が使えそうなものを考えてはみたもののなかなか思いつかない、
そんな中、Wikipediaを漁っていたら…
>バケットソートのバケツをメモリ空間の代わりに時間に置き換えたもので、もともと掲示板4chanに投稿されたアイデアである。
>「全要素の最大値×スリープさせる単位時間」で実際にソートできてしまう。それが役に立つ事例は例題程度であろう。

[バケットソート/スリープソート](https://ja.m.wikipedia.org/wiki/%E3%83%90%E3%82%B1%E3%83%83%E3%83%88%E3%82%BD%E3%83%BC%E3%83%88#.E3.82.B9.E3.83.AA.E3.83.BC.E3.83.97.E3.82.BD.E3.83.BC.E3.83.88)より引用
### これだッ!!
というわけで作ってみました。
## 完成品

## ソースコード
https://github.co

元記事を表示

Goのmoduleのtidyに失敗した時の話

`go mod tidy` をローカルで実行してモジュールのお掃除をしようとしたところ、以下のエラーになりました。

“`
% go mod tidy
go: go.mod file indicates go 1.19, but maximum version supported by tidy is 1.18
“`

英語弱者の私は、「 `go mod tidy` は廃止されたのかー。この間できたばかりの機能だったのになー。」などと勘違いしてしまいした。
違います。
原因は `go.mod` に記載のGoのバージョンよりもローカルのGoのバージョンが古いだけでした。
ローカルのGoのバージョンを1.19にしてエラーがでなくなりました!

記事にするほどの内容でもないですが、念の為、備忘録として残しておきます。

元記事を表示

OTHERカテゴリの最新記事