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

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

golang-migrateを使ってみた(CLI編)

dockerで環境を作成しています
“`
使用イメージ : postgres:16
os : Debian GNU/Linux 12 (bookworm)
postgresql : psql (PostgreSQL) 16.4 (Debian 16.4-1.pgdg120+2)
“`

### golang-migrateをインストール
“`
# apt-get update && apt-get upgrade -y
# apt-get install tar gzip curl vim
# curl -L https://github.com/golang-migrate/migrate/releases/download/v4.18.0/migrate.linux-amd64.tar.gz | tar xvz
# mv ./migrate /usr/bin/migrate
“`
利用できるかチェック
“`
$ migrate -help
“`
### 公式のPostgreSQLのチュートリアルを参考に進めていく

データベースの作成
“`
psql -h local

元記事を表示

libp2pでピア間をストリーム通信

[libp2p](https://libp2p.io/) という P2P 用のネットワークライブラリがあります。
Go言語用のライブラリ [go-libp2p](https://github.com/libp2p/go-libp2p) を使ってピア間のメッセージ通信を試してみました。

# はじめに

今回は、libp2p のノードを 2種類(とりあえず server と client にしました[^1])実行し、以下のようなメッセージ通信を libp2p のストリームで実施します。

[^1]: P2Pに適さない表現かもしれませんが

“`mermaid
flowchart LR

client –>|”now”| server
server –>|”<現在時刻>“| client
“`

client が “`now\n“` というメッセージを送信すると server から現在時刻を返します。
client はこれを 3秒毎に 5回繰り返して終了する事にします。

改行(“`\n“`)をメッセージの区切り文字とします。

# (a) アドレス指定の接続

まずは、接

元記事を表示

Goの値レシーバとポインタレシーバの違い

# Golangの値レシーバとポインタレシーバの違い

Golangの値レシーバとポインタレシーバの振る舞いの違いについて備忘録です。
また、ポインタから値レシーバの暗黙呼び出しについても書いておきます。

Golangには値レシーバとポインタレシーバがあります。

構造体
“`
type Account struct {
Id int
}
“`

値レシーバ
“`
func (a Account) Set(id int) {
a.Id = id
}
“`

ポインタレシーバ
“`
func (a* Account) Set(id int) {
a.Id = id
}
“`

## 値レシーバとポインタレシーバの振る舞いの違い

値レシーバはメソッド呼び出しごとに変数がコピーされてその変数に対して実行されます。なので、宣言じの変数の値は変更されません。

ポインタレシーバは、宣言時のメモリアドレスを持つ変数に対してメソッドが実行されます。
以下の例では値レシーバのメソッド`Add`は何回呼び出しても元の変数の値はそのままです。
ポインタレシーバのメソッド`AddPoi

元記事を表示

Golangの構造体のポインタ配列

# Golangの構造体のポインタ配列

Golangの構造体(Golangでなくてもそうかも)は、メモリ使用量が地味に多いので、ポインタ配列を使いまくるのがコストパフォーマンス面で良さそうなので使いまくるために備忘録。

## 使いまくるポインタ例

“`
type Account struct{
id int
name string
}
“`

でこういうのたち。ポインタとポインタの配列。
“`
*Account
[]*Account
“`

こっちじゃない。これは配列のポインタ。
“`
*[]Account
“`

## ポインタ配列

ポインタ配列の方が速い。使いまくる。

“`
package main

import (
“fmt”
)

// todo
// requirement
// Account is struct
// Accounts has an Account array defined as a pointer in field

type Account struct {
id int
name string
}

ty

元記事を表示

Go言語で平衡二分探索木の AVL木 を実装してみた

# はじめに
どうも、わたしです。今回は Go言語(Golang)で **「AVL木」** を実装してみました。データ構造についてはあんまり理解が乏しいですが、自分が学んだことをアウトプットしたいので記事に書きます!!

なるべく詳しく書くつもりなので、てっとり早く実装どうやってやるんだよという方は以下のわたしが参考にした方(karaskさん)の Github をご覧ください。

https://github.com/karask/go-avltree/blob/master/avltree.go

この記事はまず二分探索木について話して、そのあと平衡二分探索木の話、AVL木についてと、メインの実装というようにまとめたいと思います。

# 動機
いまわたしは Go で AtCoder の競プロを頑張っているんですが [ABC352 の D 問題](https://atcoder.jp/contests/abc352/tasks/abc352_d) に挑戦した際、わかんなーいってなって解説見たんですが「平衡二分探索木」を使いましょうってあってなんじゃそれはとなりました。調べてみると Go

元記事を表示

GoでHTTPサーバーを構築して複数のAPIエンドポイントを作成する方法

この記事では、Goの標準ライブラリ `net/http` を使って、簡単なHTTPサーバーを立ち上げ、複数のAPIエンドポイントを作成する手順を解説します。これにより、ブラウザやHTTPクライアントからリクエストを受け取り、JSONデータやレスポンスを返すAPIサーバーを構築できます。

## 必要な準備

1. Goがインストールされていること(バージョン1.16以上推奨)
– インストールされていない場合は、公式サイトからインストールします:[Go公式サイト](https://golang.org/dl/)
2. ターミナル(またはコマンドプロンプト)

## サーバーコードの実装

以下のコードを使って、複数のAPIエンドポイントを持つサーバーを作成します。

“`go
package main

import (
“encoding/json”
“fmt”
“net/http”
)

// User 構造体
type User struct {
ID int `json:”id”`
Name string `json:”name”`
Age

元記事を表示

Goのnet/httpパッケージ チートシート

# Goの`net/http`パッケージ チートシート

Goの`net/http`パッケージに関する詳しいチートシートです。コード例とコメントを含めているので、参考にしてください。

## 1. 基本的なHTTPサーバー

“`go
package main

import (
“fmt”
“net/http”
)

// HTTPリクエストを処理するハンドラ関数
func handler(w http.ResponseWriter, r *http.Request) {
// クライアントにレスポンスを返す
fmt.Fprintf(w, “こんにちは、あなたはこのURLをリクエストしました: %s
“, r.URL.Path)
}

func main() {
// ルートパス”/”にハンドラ関数を登録
http.HandleFunc(“/”, handler)

// ポート8080でHTTPサーバーを起動
fmt.Println(“ポート8080でサーバーを起動します”)
err := http.Lis

元記事を表示

Go SQL チートシート

# Go SQL チートシート

Goの標準ライブラリ「`database/sql`」を使ったSQLの基本操作をまとめたチートシートです。簡単な説明とともにコードサンプルを紹介します。

## 1. インポート & ドライバ設定

“`go
import (
“database/sql”
_ “github.com/go-sql-driver/mysql” // 使用するデータベースドライバ(MySQLの場合)をインポート
// _ “github.com/lib/pq” // PostgreSQLの場合はこのように別のドライバをインポート
)
“`
– `database/sql`: Go標準のSQLデータベースインターフェース。
– `_` は、ドライバパッケージを明示的に使用しないが、初期化は行う必要があるために使う。

## 2. データベースに接続

“`go
db, err := sql.Open(“mysql”, “user:password@tcp(127.0.0.1:3306)/dbname”)
if err != nil {

元記事を表示

GoのEchoの環境を構築してみる(Macのローカルに直接構築)

## 概要

Macのローカルに直接GoのEchoの環境を構築する方法をまとめる。

## 前提

下記の内容が完了していること。

https://qiita.com/miriwo/items/2cdcadb0c81fa34c0c27

## 内容

1. 任意のディレクトリにtest-local-echo-appというディレクトリを作成、作成したディレクトリにターミナルで移動
1. 下記を実行してGoのモジュールを初期化(`go: creating new go.mod: module test-local-echo-app`と返れば正常っぽい)

“`terminal
go mod init test-local-echo-app
“`

1. 下記を実行してEchoのインストールを実施

“`terminal
go get -u github.com/labstack/echo/v4
“`

1. test-local-echo-appのディレクトリルートにmain.goのファイルを作成し、下記のように記載

元記事を表示

HomebrewでMacのローカルにGoを入れる

## 概要

HomeBrewを使ってMacのローカルにGoを入れる方法を簡単にまとめる。

## 方法

1. `$ brew -v`を実行
1. `$ brew install go`を実行してGoをインストール
1. `$ go version`を実行してバージョンを確認

元記事を表示

sqlc記事まとめ

最近書いた[sqlc](https://github.com/sqlc-dev/sqlc)関連の記事をまとめておきます。これくらい知っていればストレスなく使えるんじゃないかなぁと思います。

1. [Go のちょっと変わったORM sqlc の紹介](https://qiita.com/ktat/items/2ed13afcd29f49aee6a1) … sqlcの基本的な使い方
1. [sqlcで動的なWHEREを作る](https://qiita.com/ktat/items/ddf0e5e510279503feee) … sqlc は動的にSQLを組み立てることは出来ないので、その対策
1. [Go の ORM sqlcでBulk Insertを行う(MySQL)](https://qiita.com/ktat/items/94b6e84f07ffefa80b84) … ↑と似た話で、Bulk Insertも動的なので、その対策
1. [sqlcでType Overrides の活用とgo-optionalの話](https://qiita.com/ktat/item

元記事を表示

Go言語でWake On Lanパケットを送信する

# はじめに

ネットワークにマジックパッケットを送信してPCの電源をONにする技術Wake On Lan

https://qiita.com/gam0022/items/4c2a3fdc29ac4977b51c

のマジックパケットをGo言語から送信する話です。

# Wake on LANパケットを送信するプログラム

“`go
package main

import (
“log”
“net”
)

func main() {
err := SendWakeOnLanPacket(“78:84:3c:2a:ac:08”)
if err != nil {
log.Fatalln(err)
}

}

// SendWakeOnLanPacket : send wake on lan magic packet to mac address
func SendWakeOnLanPacket(mac string) error {
ra, err := net.ResolveUDPAddr(“udp4”, “255.255.255.255:9”)
if err

元記事を表示

GO プログラミングノート

## やったこと
①https://go.dev/tour/welcome/1
web上で実行できるのでまずは環境構築をせずにgoの感覚を掴みたい人はやってみるといいと思います。

②https://go.dev/doc/tutorial/
公式チュートリアルです。以下の写真の3つのチュートリアルを行いました。
![](https://storage.googleapis.com/zenn-user-upload/be4793aa18e5-20240907.png)
3つ目のチュートリアルをすることで簡単な感覚がつかめたと思います。ここからは実務や実際の個人開発などで使い方を学んでいこうと思います。

③Chat gptを使ってapiを作成した。またnext.jsと連携してボタンを押したら情報を取得するようにした。

https://zenn.dev/articles/4de93a0fe6c22f/edit

④公式チュートリアルの4つ目をやった。
postgresqlと接続してクエリを取得したり、データの追加などを行うことができる関数を作成した。

⑤公式チュートリアルの5つ目をやっ

元記事を表示

Golandでファイルとそのtestファイルをまとめる設定

インターン先のメンターさんに、Golandで下の画像のようにgoのファイルとそのテストファイルをまとめる方法を教えていただいたので、そちらを共有したいと思います。

![スクリーンショット 2024-09-27 14.58.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766230/f2977635-999d-ae91-3152-0f8d0ed0641e.png)

# Golandでの設定

左の方にある下の画像に写っている3点リーダを探します。
![スクリーンショット 2024-09-27 14.59.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766230/1e77b9bb-3d8e-a1f3-046a-963cd304a6d5.png)

そうすると下のような欄が出てくるので、`File Nesting`を選択します。
![スクリーンショット 2024-09-27 15.00.49.png](h

元記事を表示

Go言語でNetFlowを受信する方法

# はじめに

Go言語でNetFlowのパケットを受信して処理するためのパッケージ

https://github.com/tehmaze/netflow

の使い方を説明します。

# サンプルプログラム

GiHUBのリポジトリにcmd/nf-dumpというサンプルプログラムがあります。
そのままです。

“`go

/*
Command nf-dump decodes NetFlow packets from UDP datagrams.

Usage:

nf-dump [flags]

Flags:

-addr string Listen address (default “:2055”)
*/
package main

import (
“bytes”
“flag”
“log”
“net”

“github.com/tehmaze/netflow”
“github.com/tehmaze/netflow/ipfix”
“github.com/tehmaze/netflow/netflow1”
“github.com/tehmaze/netf

元記事を表示

grpc-gatewayを使用したRESTful API/gRPC APIを同時に提供

# RESTful API/gRPC API提供

gRPC-GatewayはgRPCで提供されているAPIをRESTful APIに変換して、提供するためのコード生成ができます。
なので、HTTP/2をサポートしていない環境からは、RESTful API経由で、リクエストを受け付けるといった使い方ができます。

*.protoファイルで一括管理できて、サーバーの管理がとても楽になります。

備忘録です。

## 環境

“`
% go version
go version go1.22.5 darwin/arm64
“`

“`
% protoc –version
libprotoc 3.20.3
“`

### 実行ファイルをインストール

“`
go install \
github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-grpc-gateway@latest \
github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2@late

元記事を表示

簡単なAPIを作ってみたまとめ

# 簡単なAPIを作ってみた

APIについて色々読んだりしてみたものの、設計ルールをがっつり盛り込んでAPIを設計するほどのアイデアが出てこなかったのでまずはAPIを作る事に慣れようの回とした。

今回はローカルホストだけどこんな感じに返ってくるAPIを作ってみた。

# 参考リンク

今回はこちらをメインに参考

https://qiita.com/entaku0818/items/c29add790718c215381e

https://chicog.me/posts/m30-7wf2g6

Go公式で参考にしたページ

https://pkg.go.dev/net/http

APIの設計ルール諸々紹介されている記事

https://qiita.com/kazuki_tachikawa/items/7dab01

元記事を表示

GoでHTTPサーバーをゼロから構築する方法

## はじめに

最近、Go言語のシンプルさと高いパフォーマンスに興味を持ったため、
試しにHTTPサーバーを構築してみました。

## 1.Goのインストール
Go言語は、公式サイトから各OSに合わせたインストーラーを使用して簡単にインストールできます。

https://go.dev/dl/

私はMacを使用しているので、Macのインストーラーを使用しました。
このコマンドでバージョン情報が表示されれば準備完了です。

“`shell
% go version
go version go1.23.1 darwin/amd64
“`

## 2. Goプロジェクトの作成
Goプロジェクトの依存関係管理には、Go Modulesを使用するのが一般的です。
ここでは、Goプロジェクトのディレクトリを作成し、初期化する手順を説明します。
まず、新しいGoプロジェクト用のディレクトリを作成します。

“`shell
% mkdir go-http-server
% cd go-http-server
“`

次に下のコマンドを実行してプロジェクトをGoモジュール化します。

`

元記事を表示

表面的にサクッと理解するGo言語(他言語を知っている人向け)

※ この辺の知識が特別な説明なく登場します
* 構造体
* ポインタ
* 抽象データ型(interface)
* ジェネリクス

etc.

# ざっくりとした概要
* 静的型付け言語
* クロスコンパイルが可能
* C と Java を足して2で割った感じ(個人的主観)
* プリプロセッサはない
* コンパイラはGo言語の公式コンパイラとGCC版がある(llgo というLLVMベースのものもあるらしい)
* 名前的型付け(≠構造的型付け)
* キャメルケースを使った命名
* 各命名における頭文字の大文字/小文字でスコープの制御を行う
* インラインアセンブリは書けないが、Goアセンブリというちょっと特殊なアセンブリを使った実装も可能
* 構造体や配列などのオブジェクトは基本的にミュータブル
* 関数型スタイルのコードはちょっと書きづらい(最近は変わりつつもある)

# Hello World
“`main.go
package main

import “fmt”

func main() {
fmt.Println(“Hello, World!”)
}
“`

# 実行方法

元記事を表示

LayerX初開催!ソフトウェアエンジニアサマーインターンが楽し過ぎた!!!

## はじめに

9月2日から9月13日まで、LayerXさんの2週間のサマーインターンに参加しました。この記事では、インターンの内容や学んだことについて紹介します。バクラクサマーインターンが本当に実りある楽しい内容だったことを全力でお伝えしていきます:sob::star:。

インターン期間は前述の通り、9月2日から9月13日の2週間でした。全日オフィス開催の予定でしたが、台風 ⛈️ の影響で初日と2日目は急遽オンライン開催となり、3日目以降からオフィスでの開催となりました。

オフライン初日はとても緊張しましたが、伝言ゲームなどのアイスブレイクを通じて、チームメンバーとすぐに打ち解けることができました。その後の日程も、チームで食事に行ったり、開発中にわからないことはすぐに質問できたりと、コミュニケーションが取りやすく、とても充実した時間を過ごすことができました。

## インターンの内容

### 前半:講義パート

インターン最初の3日間は、技術に関する講義がメインでした。LayerXで実際に使用されていて、インターンでも使用する技術を学びました。インターン生は事前に「must(

元記事を表示

OTHERカテゴリの最新記事