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

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

GoとRustの文字列周りのデータ型

筆者は普段Goを使って開発していてデータ型に関して馴染があった。

最近はRustを勉強し始めて文字列周りのデータ型について気になったことがあったのでまとめていく。

## Go

Goの文字列にまつわるデータ型は以下の通り。

– string
– byte
– rune

### string

一般的に文字列を扱うためのデータ型。

特に補足はいらないと思うがコードで例を見てみる。

“`go
s := “Hello, World!”
fmt.Println(s)

// “Hello, World!”
“`

ダブルクオーテーションで囲まれた文字列がstring型として扱われる。

### byte

byteはuint8のエイリアスであり、バイトデータを扱うためのデータ型。

コードで例を見てみる。

“`go

b := []byte(“Hello, World!”)
fmt.Println(b)

// [72 101 108 108 111 44 32 87 111 114 108 100 33]
“`

このように文字列をbyte型に変換することでその文字のA

元記事を表示

Goの基本概念だけを学習

# はじめに

Go は近年非常に人気があり、多くの企業や開発者が使用しています。この記事では、Go の基本的な概念について学び、そのメリットを探ります。

# ポインタ

Go ではポインタを使用して変数のアドレスを参照できます。これにより、関数間でデータを効率的に共有することができます。

“`go
package main

import “fmt”

func main() {
x := 5
fmt.Println(“Before:”, x)
increment(&x)
fmt.Println(“After:”, x)
}

func increment(x *int) {
*x = *x + 1
}
“`

このコードでは、increment 関数に x のポインタを渡しています。increment 関数内で x の値を変更すると、main 関数内の x の値も変更されます。

## ポインタのメリット

1. 効率的なデータ共有: 大きなデータを関数に渡す際に、データ全体をコピーするのではなく、ポインタを渡すことで効率的にデータを

元記事を表示

僕なりの Go 備忘録

# GoとGinのDocker環境を作る

“`bash
.
├── Dockerfile
├── docker-compose.yml
└── www
├── app
│   ├── go.mod
│   ├── go.sum
│   ├── main.go
│   └── views
│   └── index.html
└── html
“`

“`yaml
# docker-compose.yml
version: ‘3’

services:
go:
build:
context: .
dockerfile: Dockerfile
stdin_open: true
tty: true
volumes:
– ./www:/var/www
ports:
– 8080:8080
“`

“`dockerfile
# Dockerfile
FROM golang:1.22.4-bullseye

WORKDIR /var

元記事を表示

DockerでGinのコンテナを立てようとしたらエラーが出た。

# エラー内容

docker composeでコンテナを立てようとしたら
“`
docker compose up –build

[+] Building 0.0s (1/1) FINISHED docker:desktop-linux
=> [server internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 200B 0.0s
failed to solve: dockerfile parse error on line 13: unknown instr

元記事を表示

Ginの環境構築をdockerでやってみた

# はじめに
Goの有名なフレームワークの一つであるGinを触ってみたいと思い、dockerで環境構築してみました。
# Dockerでの環境構築

## 1.Ginのインストール
まず、`Dockerfile`を記述します。

“`Dockerfile
FROM golang:latest

WORKDIR /code
“`

`docker-compose.yml`を記述します。
“`docker-compose.yml
services:
server:
build: .
container_name: gintest
tty: true
volumes:
– .:/code/
ports:
– 8080:8080
“`

一度、`go.mod`を作成するためにイメージを作成します。
“`
docker compose build
“`

ここから一旦コンテナを起動して、go.modを作成します。
“`
docker compose run –rm server sh -c “go mod ini

元記事を表示

Dockerで簡単なGOの環境構築してみた

# はじめに
Goを触りたいと感じることが多くなり、Dockerで簡易的に環境構築してみようと思ったので、やってみました。

# Dockerで環境構築
`Dockerfile`は以下のように記述します。
“`Dockerfile
FROM golang:latest

WORKDIR /app

COPY . .

RUN go mod init myapp
“`

`docker-compose.yml`は以下のように記述します。
“`docker-compose.yml
services:
app:
build: .
container_name: gotest
tty: true
ports:
– 80:8000
volumes:
– .:/app
“`

:::note
tty:trueとつけるとコンテナを永続させることができるので、`docker exec`コマンドが使いたい場合はつけたほうがいいです。
:::

`main.go`にHello Dockerと表示させるスクリプトを書いてみます.
`

元記事を表示

イベントソーシングを知ろう ~ステートソーシングとの比較とGoでの簡単な実装例つき~

イベントソーシングとは、データベースに保存するデータをイベントの形式で保存することです。イベントソーシングを使うことで、データベースの状態をイベントの履歴から再現することができます。

CRUDのようにデータベースの状態を直接変更するのではなく、イベントを発行してデータベースの状態を変更します。イベントソーシングを使うことで、データベースの状態を変更する操作をイベントの履歴として保存することができます。

ステートソーシングとイベントソーシングの違いは、データベースの状態を直接変更するのではなく、イベントを発行してデータベースの状態を変更する点です。イベントソーシングを使うことで、データベースの状態を変更する操作をイベントの履歴として保存することができます。

ステートソーシングにおいて履歴をトレースするためには、データベースの状態を保存するためのテーブルを作成したりロギングを行って時系列で解析する必要があります

この特徴から、イベントソーシングは、データベースの状態を変更する操作をイベントの履歴として保存することができるため特定の時点でのデータベースの状態を再現することが容易で

元記事を表示

【Go】Go1.22で試験導入されたrangefuncを理解したい!

# はじめに
こんにちは、H×Hのセンリツ大好きエンジニアです。(同担OKです😉)
今回は、Go Conference 2024でも取り上げられていた`rangefunc`という新たな機能について自分なりにまとめたので、そちらをご紹介します!

# rangefuncとは?
公式リファレンス参照:https://go.dev/wiki/RangefuncExperiment
> For a future Go release, the Go team is considering adding range-over function iterators. Go 1.22 contains a preliminary implementation of the change, enabled by setting GOEXPERIMENT=rangefunc when building your program. We invite anyone who wants to help us understand the effects of the change to try using

元記事を表示

Goでwebsocketを作ってみた

# どのような実現方法があるのか?
GPTによると…

・Gorilla WebSocket: 高機能で安定しているが、やや複雑。
・nhooyr.io/websocket: シンプルでコンテキスト対応、軽量だが機能は少なめ。
・golang.org/x/net/websocket: 基本的な機能を提供するが、メンテナンス頻度が低い。
・github.com/gobwas/ws: 高速で低レベル制御が可能だが、学習コストが高い。
・github.com/olahol/melody: 使いやすく多機能だが、パフォーマンスやスケーリングの面で劣ることがある。

# プロジェクトの作成
必要なければ飛ばしてください.

詳細を表示

go言語のインストールはこちらから

インストール出来たら.

1. ディレクトリ作成
“`bash
mkdir myproject
“`

2. ディレクトリに移動
“`bash

元記事を表示

インストールしたけどパスが通っていなかった

# 起こったこと

“`bash
go install github.com/deepmap/oapi-codegen/v2/cmd/oapi-codegen@latest

oapi-codegen -version
> command not found: oapi-codegen
“`

oapi-codegenを使用してGoのコード自動生成を行おうとしていました。
インストールを実行したはずなのに、コマンドが見つからないようです。

# やったこと

oapi-codegenはgoのバイナリファイルにインストールされるので、Goのパスを確認します。

“`bash
go env GOPATH
> /home/username/go
“`

すでに通っているパスを確認します。

“`bash
echo $PATH
> /usr/local/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin
“`

この中にさきほど確認したGoのパスがないので、パスを通してやる必要が

元記事を表示

Dockerで簡単なAPIサーバ(Go)を立てる

## 前提
main.goファイル、go.mod , go.sumファイルが同階層にある前提です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821214/76962e7d-7264-dfb5-b545-9ea037268017.png)

以下を実施した後だとやりやすいです。

https://qiita.com/konnbu/items/76b977f715a13ec3bece

## Dockerfile 作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821214/2d225c90-d7bb-78f4-3a50-952198dbee13.png)

main.goと同じ階層に作成しています。

“`
# FROM –> DocketHubからpullしてくるベースなるイメージの指定
# WORKDIR –> コンテナ起動後の作業ディレクトリ
# CMD –> C

元記事を表示

Go&echoで簡単にAPI作成

作るものは「最低限必要なものを揃えたmain.go」のみ。
ゴールは「local起動し、ブラウザから確認」&「curlコマンドからAPIを叩けること」です。

## フォルダ構成

めちゃ簡素。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821214/9b373c54-dc1c-34f2-c4ae-9f0cde3afd5a.png)

つくりかた
1. main.go ファイルを作成
1. `go mod init` を実行、 go.mod, go.sum ファイルが生成される

以上!

## main.go の中身
[こちらの記事](https://zenn.dev/def_yuisato/articles/echo-get-started)を参考にそのまま使わせていただきました。
今回はファイル名だけserver.go → main.goとしています。
ミドルウェアについて、それぞれ
“`
e.Use(middleware.Logger()) // ここからlogが取得

元記事を表示

Go(guregu)+lambda+dynamoDBでデータのやりとりをしよう

## はじめに
この記事では、Go(guregu)を用いてLambdaを介し、DynamoDBとのデータのやりとりを紹介します。

## lambdaを動かしてみよう
2023/12/31にLambdaのGoランタイムがサポート終了となりますが、buildしてLambdaへ渡すため、ランタイムは必要ありません。

まずは簡単なコードから実行してみましょう。任意のディレクトリで以下のコマンドを実行して、プロジェクトを作成します。

まずは簡単なコードから実行していきましょう。
任意のディレクトリで
“`sh
$ mkdir go-lambda-test
$ cd go-lambda-test
$ go mod init test
“`
上から順に実行し、プロジェクトを作成していきます。
ディレクトリ直下にmain.goを作成し、以下のコードを記述します。
“`main.go
package main

import (
“context”
“github.com/aws/aws-lambda-go/lambda”
)

// ハンドラ関数を定義
func handler() (

元記事を表示

Echo(Go)を使用してアプリを作成してみた【簡単なタスクのCRUD操作とJWPの認証機能】

## Todo REST API with Echo(Go)
①The clean Architecture

## Echo/GORMを使ったREST APIの実装

## REST API:Task CRUD + JWT認証

## フロントエンド(React)との連携

## Deploy

## 参考サイト
[Echo/Go + Reactで始めるモダンWebアプリケーション開発
](https://www.udemy.com/course/echo-go-react-restapi/learn/lecture/36949722?start=0#overview)

元記事を表示

ゴルーチン(goroutine)について_1

# ゴルーチン(goroutine)
goの基本構文を学んでいくうえで今一つイメージが掴みづらかったゴルーチンについてまとめてみた。

● ゴルーチン(goroutine)は、Go言語で並行処理を実現するための軽量スレッドである。
● ゴルーチンは、通常のスレッドよりも低コストで作成され、数千〜数百万のゴルーチンを簡単に起動できる。
● ゴルーチンは、キーワード「go」を使って関数呼び出しの前に指定することで作成される。
以下がコード例である
“`diff_go
func main() {
go hello()
}

func hello() {
fmt.Println(“Hello, goroutine!”)
}

“`
このコードでは、hello 関数が新しいゴルーチンとして実行される。main 関数が終了しても、ゴルーチンは実行を続ける。

ゴルーチンは、Goのランタイムによってスケジュールされ、複数のゴルーチンが同時に実行されることがある。Goのランタイムは、マルチコアプロセッサの利用やブロッキングIOの効率的な管理など、ゴルーチンを効果的に処理する。ゴルー

元記事を表示

Go言語で簡単に請求書を生成:Invoice Generatorリポジトリの紹介

請求書作成をもっと簡単にしたいと思いませんか?

[Quail](https://quail.ink “Quail.ink”) が提供する [Invoice Generator](https://github.com/quail-ink/invoice-generator “Invoice Generator by Quail”) を使えば、プロフェッショナルな請求書を簡単に生成できます。この強力で使いやすいライブラリをGo言語で活用して、請求書作成プロセスを効率化しましょう。

![](https://camo.githubusercontent.com/340c844b04bc236cb8b8bf11b44619c8b81ce7d3dbb1ac86125d8b6566948144/68747470733a2f2f7374617469632e717561696c2e696e6b2f6d656469612f717a35757a7635712e77656270)

### なぜこのInvoice Generatorを選ぶべきか?

**1. Go言語とシームレスに統合**
– 既存

元記事を表示

AWS SDKのモック実装例

# はじめに

AWS SDKを使用したコードに対して高速且つ多様なケースの単体テストを実装するためのノウハウ(≒SDKの挙動のモック化)を、実装例と共に備忘録として残します。

## なぜAWS SDKをモック化したいのか

AWS SDKを使用したコードをモック化しないで単体テストしようとすると、以下のような点が実現性や生産性のボトルネックになりがちです。

– 実際にAWSリソースを操作しようとすると、手間と時間とコストが掛かる
– 実際のAWSのAPIから意図したレスポンス(例えば特定状況下でのエラーレスポンス)を返却させるのが困難、又は不可能
– セキュリティ上の都合でIAMやNWが制限されておりAWSのAPIの利用が不可能

以上のような理由から、高速且つ多様なケースをテストするためにAWS SDKをモック化したい場合があります。

## 注意・免責事項

– この記事に記載している内容が唯一且つ最適解という訳では無いかも知れません。もっと効率的なやる方があるかも知れません
– モック化はあくまでも単体テストでのみ使用すべきであり、結合試験・E2E試験時

元記事を表示

クリーンアーキテクチャに入門してみた

# はじめに

– クリーンアーキテクチャとはよく聞くけどいまいちわからないと思い調べてみた時のメモです
– 自分とは同じようにクリーンアーキテクチャについて聞いたこと、調べたことはあるけどいまいち理解できなかったという人の理解の助けになれば嬉しいです!
– 実装例はGo言語を使用しています

### この記事から得られる内容

– アーキテクチャとは何か
– 一般的なアーキテクチャ、その課題と解決策
– クリーンアーキテクチャについて、各レイヤーの責務

# アーキテクチャについて

### アーキテクチャとはなにか?

– ソフトウェア開発におけるアーキテクチャとは、システムの根幹となる構造を定義する「設計図」の役割です
– アーキテクチャは、システムを異なるパーツに分け、それぞれのパーツがどのように組み合わせられるかを決めます
– これがプログラミングの基本原則の一つである「関心事の分離」で、具体的には、各機能や役割を独立したモジュールやクラスにまとめることで、コードを他の部分と明確に分けることができます

### アーキテクチャの目的

– アーキテクチャの目的は、ビジネスニー

元記事を表示

github.com/kubernetes/client-go informers 和訳

K8s の client-go の informers の調査の一環としてこのドキュメントを読むことになりました。英語力に不安があるので、DeepL でベースの翻訳を行い、怪しい単語は手動で直したメモを書いていました。一般的な内容なので共有します。

**Version: v0.30.1** の内容です。

# informers

## Overview

`informers` は K8s の API 用に生成された informers を提供します

## Types

### type [`GenericInformer`](https://github.com/kubernetes/client-go/blob/v0.30.1/informers/generic.go#L77)

“`golang
type GenericInformer interface {
Informer() cache.SharedIndexInformer
Lister() cache.GenericLister
}
“`

GenericInformer は SharedIn

元記事を表示

Goのdefer実行タイミング

慣れている人からすると当たり前なんですが、冷静に考えると間違えそうだったので、備忘録。

## deferのタイミング
“`go: コード
func foo(str string) {
fmt.Println(str)
}

func main() {
str := “でぃふぁー”
defer foo(str)

str = str + “ぷりんと”
}
“`

さて、この時表示する結果はなんでしょうか。

1. でぃふぁー
2. でぃふぁーぷりんと
3. ぷりんと
4. 空文字

正解は

“`go: 結果
でぃふぁー
“`

ですね。

defer関数の引数は実際の呼び出しが行われた時ではなく、deferステートメントが実行されたときに評価されます。

## return時はどうなるか

ではreturnがある場合先なのか、後なのかどちらでしょう。

“`go: コード
func hoge() string {
str := “でぃふぁー”
defer fuga()
fmt.Println(“りたーんまえ!”)
retu

元記事を表示

OTHERカテゴリの最新記事