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

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

Go の第一印象が Cっぽくてなんか懐かしい、と思った。

# 変数型

“`
int int8, int16, int32, int64

uint uint8, uint16, uint32, uint64
“`
**符号無し8ビット整数**
とか
で uint8 で byte の別名を表すところもCっぽい。
あれは確か Windows の MFC だったかな。

# 構造体
『構造体❣』と来ました。

## C
“`
struct Player {
char* string;
int age;
};
typedef struct Palyer;
“`

## Go
“`
type Player struct {
name string
age int
}
“`

元記事を表示

GoでExcelデータを読み込む方法

Excelに一覧として持っているメールアドレスや会社名などの情報を読み込み、処理に使用するよう構造体へ格納する、ということを行ったため、Goで実装する方法をまとめます。

# GoでExcelの操作をするには
[excelize](https://github.com/qax-os/excelize) というライブラリを使用します。

# excelizeのインストール
下記コマンドを実行して、excelizeをインストールします。

“`cmd
$ go get github.com/xuri/excelize/v2
“`

# Excelファイルを読み込む
Excelファイルを読み込みます。
今回は以下のような、リストを持つファイルをあらかじめ作成しました。

ファイル名: 宛先.xlsx
| 会社名 | 担当者名 | メールアドレス |
| ———— | ———- | ————————– |
| 株式会社A | 田中太郎 | tanaka@example.com

元記事を表示

Golangの関数におけるポインタレシーバーと値レシーバーの違い

Golang(Go言語)では、関数を定義する際に、ポインタレシーバー(Pointer Receiver)と値レシーバー(Value Receiver)の2つのオプションがあります。これらは、メソッドを構造体に関連付ける方法を定義します。

### 値レシーバー(Value Receiver)

値レシーバーは、関数が特定の型の値をレシーバーとして受け取ることを示します。このような関数は、そのレシーバーが持つ値のコピーに対して動作します。つまり、レシーバーのフィールドの変更は、元のオブジェクトには影響を与えません。値レシーバーを使用することで、メソッドがオブジェクトを変更しないことを保証することができます。

### ポインタレシーバー(Pointer Receiver)

ポインタレシーバーは、関数が特定の型のポインタをレシーバーとして受け取ることを示します。つまり、関数はそのポインタが指すオブジェクト自体を変更することができます。この場合、関数内での変更は元のオブジェクトに影響を与えます。

“`go
package main

import “fmt”

type Rectang

元記事を表示

【Go】swap関数の作成を通してポインタについて学ぶ

## 問題

2つの数字を入れ替えるswap関数を実装します。
swap関数の引数として、2つの数字のメモリアドレスが渡されるものとします。

“`go
package main
import “fmt”
func main() {
num1, num2 := 1, 2
swap(&num1, &num2)
fmt.Println(num1, num2) // 2, 1
}
“`

:::note info
本記事ではポインタそのものに関する解説はしません。
ポインタに関しては以下の記事が参考になります。
:::

https://qiita.com/gold-kou/items/0d1585fb8d687061c890

## 誤答

私が最初に考えた答えは以下の通りです。何が誤りなのか考えてみてください。

“`go
func swap(a, b *int) (a2, b2 *int) {
a2, b2 = b, a
return
}
“`

### 誤っている点

#### 1. 返り値がある

`swap(&num1, &num

元記事を表示

Kubernetes+Golnag+gRPC+Terraformでクライアントからサーバーに接続する方法

クライアントからサーバーにgRPC接続する際に以下のようなコードを書くと思います。ローカル環境で開発する際はSERVER_URLとしてlocalhost:ポート番号を指定すれば良かったのですが、Kubernetesにデプロイする際に何を指定すればよいのかについて説明します。terraformで構築するものとして説明します。

“`golang:client.go
conn, err := grpc.Dial(os.Getenv(“SERVER_URL”), grpc.WithTransportCredentials(insecure.NewCredentials()))
“`
# 解決法
まず、サーバー側のアプリケーションのサービスを以下のように作ります。「cluster_ip = “None”」とするのが重要です。自分は「type = “NodePort”」としていて色々試してずっとうまくいきませんでし。。。
“`terraform:server_service.tf
resource “kubernetes_service_v1” “server_service” {

元記事を表示

Go TemplateでCコンパイラを実装する【ELVM】

# TL; DR

– ELVM のバックエンドにGo `text/template`(以下「Go Template」、処理系は[Gomplate](https://docs.gomplate.ca/))を追加
– C言語(8cc) -> ELVM IR -> Go Template にコンパイル
– 8ccの8cc実装をコンパイルすればGo Templateで8ccコンパイラがつくれる!(セルフホスト)

https://github.com/shinh/elvm

# はじめに

~~ご存じの通り~~ Go Templateはチューリング完全[^turing]なので、任意の処理を実装可能です。
といっても brainf\*ck だけでは華が無いので、今回は **C言語のソースコードをGo Template上で実行します**。

# 過去の ~~ネタ~~ 記事

Go Templateでプログラミングをする方法については過去の記事をご覧ください。

https://qiita.com/Syuparn/items/4157d13c39b95185acfd

https://qiita.

元記事を表示

Go言語 暗黙的なinterfaceのメリット

Go言語の何がいいかって、色々な部分で実践的な感じがする(唐突)
その代表例として今回はGo言語の暗黙的なインターフェースの何がいいかコードを例に説明したい

まず初めにGoのインターフェースの例を示します

“`go
type Writer interface {
Write(data string) error
}

type File struct {
Name string
}

func (f *File) Write(data string) error {
file, _ := os.OpenFile(f.Name, os.O_WRONLY|os.O_CREATE, 0644)
defer file.Close()
file.WriteString(data)
return nil
}
“`

これで`File`構造体(クラスみたいなイメージ)は`Writer`インターフェースを実装していることになります
JavaやTypeScriptと違って明示的にimplementsする必要はないんですね
これの何がいいんかって話です
## Javaでの実装
今回は`

元記事を表示

AWSでEC2+RDSでGo+Nginxのアプリケーション構築

## 前提条件
– MacOSを対象としている
– LinuxのVPCを対象
– EC2のインスタンスを作成済み、キーペア作成済み
– RDSのインスタンスを作成済み

### EC2にSSH接続
#### ダウンロードしたキーペアの移動・権限付与(済みの場合はスキップ)

“`
$ mv ~/Downloads/プライベートキーの名前.pem ~/.ssh
$ chmod 400 ~/.ssh/プライベートキーの名前.pem
# プライベートキーの名前は作成時に決められている(例:aws_user.pem)
“`

#### SSH接続
“`
$ ssh -i aws_user.pem ec2-user@パブリックIPv4アドレス
# パブリックIPv4アドレスはEC2のインスタンス詳細画面にて確認できる(例:12.34.567.890)
〜省略〜
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added ‘13.231.224.154’ (ECDSA) to th

元記事を表示

【VSCode】Goのテストで事前に環境変数をセットする

# はじめに
VSCodeのエディタ上からGoのテストを行う際に、事前に環境変数をセットする方法を共有します。

例えば、以下のようなテストコードを想定します。
“`go
func TestEnvVar(t *testing.T) {
// 環境変数から値を取得
envVar := os.Getenv(“MY_ENV_VAR”)

// 環境変数が設定されているかをチェック
if envVar == “” {
t.Error(“Environment variable MY_ENV_VAR is not set”)
} else {
fmt.Printf(“MY_ENV_VAR value: %s\n”, envVar)
}
}
“`
環境変数を取得し、値がセットされているかを確認するコードです。しかしながら、VSCodeの`run test`からテストを実行すると、環境変数がテスト実行時に存在しないため、このテストは失敗します。

本来であれば、以下のように環境変数がセットされた状態でテストが実行されてほしいです。
“`bash
MY_ENV_VAR=”he

元記事を表示

GoでDI (依存性注入) を実装する

# はじめに

Go でいつものオブジェクト指向言語のノリでサービス層をリポジトリの抽象に依存させようとした場面があったのですが、言語の機能として`implements`がなく永遠に頭を抱えてしまったので実装法を記します

# DI とは

あるオブジェクトにおける依存関係をオブジェクトのソースコード内に記述せず全く違うオブジェクトから注入させるシステム開発におけるデザインパターンの一つです

![スクリーンショット 2024-04-02 19.34.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2839531/07ac9c26-0839-2a7e-b203-22544863386c.png)

## メリット

DI を行う最大のメリットはテストが容易になることです

例えば、`DB登録を含む処理`をテストしたい時、外部に依存している`DB登録処理`は一旦テストから除外したいとします。そんなとき、`DB登録処理`はある引数を渡したら定数が返ってくるようにする(モック化)と外部サービスに一切依存す

元記事を表示

API Gatewayを単一Lambda関数と統合する際のハンドラーのルーティング方法

# はじめに

API GatewayとLambdaの統合には様々な実装パターンがあるせいか、下記の状況下でのルーティングの方法の情報が無かったので投稿します。

# 前提

– すべてのメソッドを単一のLambda関数とプロキシ統合する
– プロキシリソース(`{proxy+}`)は使わない(HTTPルーティングはAPI Gatewayで行う)
– [aws-lambda-web-adapter](https://github.com/awslabs/aws-lambda-web-adapter)や[aws-lambda-go-api-proxy](https://github.com/awslabs/aws-lambda-go-api-proxy)などは、使用しない

# 結論

Lambda関数が受け取るeventオブジェクトに含まれる`resource`と`httpMethod`を使用する。
`path`も使えそうですが、実際のパラメータが含まれる値のため、使用しない方が良いでしょう。

“` json:event
{
“resource”: “/todo/{id}”,

元記事を表示

go言語 単体テストをする

# 1.はじめに

Go言語で単体テストを実施したい
GO言語に標準で含まれている”testing”パッケージを利用してテストコードを書いてみる

以前投稿した以下の記事で作成したGoアプリにテストコードを追加する
[Qiitaの最新記事を教えてくれるアレクサスキルを作ろう Alexa X Lambda X Golang ](https://qiita.com/keny-N/items/47b8dd299e65b6ca85bb#:~:text=github%E3%81%AB%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%8C%99%E3%81%92%E3%81%A6%E3%81%84%E3%82%8B%E3%81%AE%E3%81%A7%E5%8F%82%E8%80%83%E3%81%AB%E3%81%97%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84)

参考

https://pkg.go.dev/testing

# 2.単体テスト

## 2.1 テ

元記事を表示

Go言語でブロックチェーンのシステムを作成する(その3)

## はじめに
前回は、Block、Blockchainの作成、hashのハッシュの実装までやりましたが、今回はtransactionsの実装をしていきます。

– 前回までの記事

https://qiita.com/jun_11/items/a1adf93ba02292321b25

– バージョン
– Go 1.22.0

## 実装
### イメージ図
下の図のPool、transactionsの実装をしていきます。

ブロックチェーン2.png

### transactionsの実装
まず、transactionsの実装をしていきます。

“`golang
type Transaction struct {
senderBlockchainAddress string
recipie

元記事を表示

gormのメモ

## はじめに
gormはGo言語のORMライブラリーです。
gormで、最初見たとき、gormのcrud処理の前に、把握しておいた方がよかったことをメモりました。
・データベース接続箇所(シャーディングによるDBの振り分け例)
・`&gorm.Config{}` について
・structの定義箇所について
・`gorm.Model`の有無

## コード例

“`go
package main

import (
“fmt”

“gorm.io/driver/sqlite”
“gorm.io/gorm”
)

// User モデル
type User struct {
gorm.Model
Name string
}

// シャードされたデータベースへの接続を管理する
var shardMap = map[int]*gorm.DB{}

func init() {
// シャードデータベースの初期化
for i := 1; i <= 2; i++ { db, err := gorm.Open(sqlite.Open(fmt.Sprintf("test_shar

元記事を表示

Go言語でブロックチェーンのシステムを作成する(その2)

## はじめに
前回は、ブロックチェーンについてまとめましたが、今回から実際にGo言語で実装していきます。

– 前回の記事

https://qiita.com/jun_11/items/a1adf93ba02292321b25

– バージョン
– Go 1.22.0

## 実装
### イメージ図
下の図のようなイメージで実装していきます。

ブロックチェーン1.png

– prev hash
– 前のブロックの情報
– timestamp
– 生成の時間
– nonce
– nonceの計算結果
– transactions
– 取引履歴
– Pool
– 取引情報が入る

上の図から新しいブロックが作られたとき、下の図のようになり、新しいブロックのprev hashには前の

元記事を表示

Goのmapのキーの使用方法メモ

## 内容
Go言語のmapのキーの使用方法の確認

## mapの特徴
`map`はGo言語における非常に便利なデータ構造の一つで、他のプログラミング言語では辞書(Dictionary)、連想配列(Associative Array)、ハッシュ(Hash)などと呼ばれることがあります。`map`はキーと値のペアを格納するためのコレクションです。キーは一意でなければならず、各キーは一つの値にマッピングされます。これにより、キーを使用して迅速に値を検索、挿入、または削除することができます。

### mapのメリット

– **高速な検索**: `map`の主なメリットは、キーに基づくデータの検索が非常に高速であることです。キーを使用して値を直接参照できるため、大量のデータの中からも迅速に特定の要素を見つけ出すことが可能です。
– **柔軟性**: 任意の型のキーと値のペアを保存できるため(ただし、キーは比較可能でなければならない)、様々な種類のデータを扱うことができます。
– **簡単なデータ操作**: `map`は値の追加、更新、削除が簡単にでき、これらの操作も高速に行えます。

#

元記事を表示

VS CodeでFailed to find the “go” binary in either GOROOT() or PATHエラー解決

## はじめに
MacでGoの環境構築時のメモです

## 解決方法

Homebrew等でGoをインストールして, PATHが追加してあることを確認します.

VS Codeを一度終了させます.

VS Codeをターミナルから直接起動することで、ターミナルの環境変数を引き継ぐことができます。ターミナルで以下のコマンドを実行してVS Codeを起動してみてください。

“`sh
open -a “Visual Studio Code”
“`

これで、タイトルにあるエラーが解決できました.

Go言語を始める際の参考になれば幸いです。

元記事を表示

Golangのパッケージレベル変数と関数レベル変数の違い

Golangでは、パッケージレベル変数と関数レベル変数は異なるスコープと目的を持ちます。

### パッケージレベル変数:

– スコープ:

パッケージレベル変数は関数の外、つまり関数の中ではなく、通常はGoソースファイルの一番上に宣言されます。
同じパッケージ内のすべての関数からアクセスできます。
パッケージがインポートされるときに初期化されます。

– 初期化:

パッケージがロードされるときに初期化され、パッケージ内の関数が呼び出される前に初期化されます。
明示的な初期化が必要です。初期化されていない場合、ゼロ値が割り当てられます。

– 使用法:

パッケージ全体で共有されるデータや設定などの値を保持するために使用されます。
同じパッケージ内の異なる関数間でデータを共有するのに役立ちます。

### 関数レベル変数:

– スコープ:

関数レベル変数は関数内で宣言され、その関数内でのみアクセス可能です。
他の関数からはアクセスできません。
– 初期化:

関数が呼び出されるたびに初期化されます。
初期化はオプションですが、初期化されていない場合、ゼロ値が割り当てられます。

元記事を表示

Go言語でブロックチェーンのシステムを作成する(その1)

# はじめに
Go言語を使用して、ブロックチェーンのシステムを作成していきます。
今回は、ブロックチェーンについて簡単にまとめていきます。

# ブロックチェーンとは
ブロックチェーンは、デジタルデータの取引を記録する技術であり、特に暗号通貨の世界で注目を集めています。この技術は分散型台帳技術(DLT)とも呼ばれ、取引データを複数のコンピュータにまたがって保存し、管理する方法です。

## ブロックチェーンの主な構成要素
1. ブロック:データ(取引記録)、前のブロックへの参照(前のブロックのハッシュ値)、およびその他の情報(タイムスタンプ、自身のハッシュ値など)を含みます。
2. チェーン:各ブロックが前のブロックと連結して形成する、途切れることのない連続したリスト。
3. ノード:ブロックチェーンネットワークに参加する個々のコンピュータ。ノードは取引を検証し、ブロックを生成し、ブロックチェーンのコピーを保持します。

## ブロックチェーンの構造
ブロックチェーンは名前の通り、「ブロック」と呼ばれるデータの集合体が「チェーン」のように連なって構成されています。各ブロックには、複数の

元記事を表示

[golang] 構造体のスライスを重複排除(with ソート)

参考: https://future-architect.github.io/articles/20230816a/
この方法だと、重複排除するには事前にソートしないとダメらしい

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

例)
SQLでいう
“`SQL
select distinct *
order by classNumber, name, age
“`
をgoの構造体のスライスで、やる。

“`go
package main

import (
“cmp”
“fmt”
“slices”
)

type user struct {
classNumber uint8
name string
age uint8
}

func main() {
users := []user{
{classNumber: 2, name: “hanako”, age: 12},
{classNumber: 3, name: “jiro”, age: 32},
{classNumber: 2, name: “h

元記事を表示

OTHERカテゴリの最新記事