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

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

DynamoDB&Golang データ取得/更新/削除/操作まとめ

# PutItem/UpdateItem/DeleteItem/BatchWriteItem/TransactWriteItems

アプリケーションを作成する上で非常によく使用する操作の違いや特徴をまとめてみました。

# 特徴の比較
| 特徴 | GetItem | BatchGetItem | TransactGetItem |
|————————-|————————-|————————-|—————————-|
| **用途** | 単一アイテムの取得 | 複数アイテムの一括取得 | 複数の一貫したアイテム取得 |
| **最大アイテム数** | 1つ | 100個まで | 25個まで

元記事を表示

[VSCode] Goの環境設定。Failed to find the “go” binary in either GOROOT() or PATH(…) を解決する

# 環境
– macOS Sonoma 14.4.1
– Apple M1 Pro
– VSCode:1.90.1
– Go for Visual Studio Code:v0.41.4
– `go1.22.4 darwin/arm64` installed by homebrew
– zsh
#

もともとはJetBraisのGoLandを利用していたんですが、周囲でVSCode派が多く無料で利用できるので乗り換えてみることにしました。
GoのExtensionをインストールしていざ利用と思っていたところ以下のようなエラーダイアログがでて定義ジャンプなどの機能が使えなかったので解消のための設定を記録しておきます
## 遭遇したエラー
“`
Failed to find the “go” binary in either GOROOT() or PATH(…). Check PATH, or Install Go and reload the window. If PATH isn’t what you expected, see https://github.com/

元記事を表示

bufio で string を取ろうとして詰まった話

## RE?
Atcoder で https://atcoder.jp/contests/abc237/tasks/abc237_d を解いていて、
テストケースのうち数ケースのみ RE ( Runtime Error ) になってしまった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817605/735d6903-d2ae-a11b-b4af-f5f74a4ab26f.png)

## 原因
### 自分の実装
bufio の scanner をこんな感じで使っていたのが原因
“`golang
var sc = bufio.NewScanner(os.Stdin)

func main(){
sc.Split(bufio.ScanWords)
s:=scanString()
}

func scanString() (s string) {
sc.Scan()
s = sc.Text()
return
}
“`
### ソースコード

#### 定数

元記事を表示

備忘録 GOの開発環境構築 @VScode

# はじめに
今回自宅用のPCをMacbook airに変更したため、VScodeの環境もはじめから作り直すことにしました。
さらに転職も行うなど、また同じようなことを行わないといけないので、自分用のメモとして本記事を作っておきます。

# VScodeのインストール
下記公式HPから使用環境にあったインストーラーをダウンロード。
[VScodeのダウンロードリンク](https://code.visualstudio.com/)
![](https://storage.googleapis.com/zenn-user-upload/75d765883bfc-20240308.png)

ダウンロード後は、インストーラーを起動し、手順に従ってポチポチする。

# Goのインストール
Homebrewを使ってGoをインストールする(公式HPのインストーラーを使ってもOKだが、せっかくなので今回はHomebrewを利用する。Windowsの場合は公式HPからインストーラーを持ってきてインストールする形になる。)
※Homebrewのインストール方法は下記。
https://zenn.dev

元記事を表示

appendメソッドの初期容量以上の要素を追加したときに起こること

## 実装

“`go
s4 := make([]int, 0, 4)
fmt.Println(s4, len(s4), cap(s4))
s5 := append(s4, 1, 2, 3, 4, 5, 6, 7, 8, 9)
fmt.Println(s5, len(s5), cap(s5))

//[] 0 4
//[1 2 3 4 5 6 7 8 9] 9 10
“`

上記の実装をしたときにs5の容量は初期に設定した以上の要素数を追加しようとしています。そのときにGo言語は、自動的により大きな容量を持つスライスを作成します。今回であれば、最初の1-4までの要素は初期値の容量で入れることができます。しかし、残りの5-9は一度、初期容量の倍の数スライス容量を増やします。それでも足りませんので、Go言語は2のべき条の数容量を追加します。よって、上記の例では倍数容量を追加したときに8となりますが、まだ足りないので、さらに2のべき条ずつ容量を追加します。今回は2だけで足りますので最終的`8+2`で10となります。

よって、次の実装も下記のような結果になります。

`

元記事を表示

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の効率的な管理など、ゴルーチンを効果的に処理する。ゴルー

元記事を表示

OTHERカテゴリの最新記事