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

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

【Go言語】echoのAPIをテストする [ハンドラー単体のテスト]

テストによってはサーバーを起動させることなくハンドラーの単体テストを行いたいことがあります。そういった場合にはリクエストを直接ハンドラーに流してあげることで結果を得ることができます。

## テスト用にプログラムを用意する

### APIを作成する

前回の記事、[【Go言語】echoのAPIをテストする [サーバーを起動させてテスト]](https://qiita.com/marurusan/items/6579810c3356e0ecedb3)で作成したAPIのコードをそのまま利用しても同じようにテストができるということを証明するためにコードを再利用します。

“`go
package main

import “github.com/labstack/echo/v4”

func InitServer() *echo.Echo {
e := echo.New()

e.GET(“/”, func(c echo.Context) error {
return c.String(200, “Hello, World!”)
})

return e
}

func

元記事を表示

【Go言語】echoのAPIをテストする [サーバーを起動させてテスト]

今回はそのテストの中でもサーバーを起動させてテストする方法について書きます

## テスト用にプログラムを用意する

### サーバーの初期化部分を切り分ける

まず、APIのコードは初期状態であれば以下のようになっていると思います。
しかしこのままではテストができないのでまずはテストを行うためにコードを切り分けます。

“`go
package main

import “github.com/labstack/echo/v4”

func main() {
e := echo.New()

e.GET(“/”, func(c echo.Context) error {
return c.String(200, “Hello, World!”)
})

e.Logger.Fatal(e.Start(“:8080”))
}
“`

このようにサーバーを初期化する部分を外に切り分けます。
これを行うことで、テスト側でサーバーの初期化を行って起動させることができるようになります。

“`go
func InitServer() *echo.Echo {
e

元記事を表示

【Go言語】構造体の基本的な使い方

Go言語でビジネスや開発に役立つソフトウェアを構築する際、**構造体**は重要な役割を果たす。
**構造体**は、プログラムを理解しやすくするための小さな構成要素にプログラムを分解するのに役立つ。

### 構造体の特徴
Goの構造体には次のような特徴がある。

* フィールドをまとめることができる。
* 他の構造体を埋め込むことができるが、アップキャストやダウンキャストはできない。
* 関数の中や式の中でも動的に定義できる。

構造体の基本的な書き方では、**フィールド**の名前と型を定義する。
小文字で始まるフィールド名はプライベート、大文字で始まるフィールド名はパブリックになる。

### 構造体のインスタンス化
Goの構造体をインスタンス化する方法は3つある

1. `new()`関数で作成
1. `var`変数宣言
1. 複合リテラルを使用

#### それぞれの特徴
| 生成方法 | 生成される型 | フィールドの初期値 |
|——————|———————-

元記事を表示

【Go言語】コマンド1つでGoのプロジェクトを作る

## 前置き

Goのプログラムを動かすために必要な動作は以下の4つです。他の言語であればいろいろと省ける部分がありますがGoはこのように動作が多いです。

cdなどを加えると打ち込むコマンドの数はそこそこ多くなるので大変です。

1. ディレクトリの作成
2. go mod init
3. main.goを作成
4. main.goにpackageとmain関数を用意する

## 便利にする

これらを1つのコマンドで実行できるようにすると便利です。そこで以下のような関数を用意しましょう。

“`bash
function gomake() {
rand=go-test-$(openssl rand -hex 2)
mkdir $rand
cd $rand
go mod init test
touch main.go
echo “package main

func main(){}
” > main.go
code .
}
“`

これを`.bashrc`や`.zshrc`などに追記しておくと、`gomake`というコマンドでGoのプロジェクトを

元記事を表示

【Go言語】機密情報を扱うフィールドの定義と出力書式のカスタマイズ

Go言語で機密情報の取り扱いをする方法を説明する。
氏名、住所、クレジットカード番号などの個人情報や、顧客情報や仕入先リストなどの機密データの取り扱いは注意が必要になる。
不適切なログ出力によって、これらの情報が不要な箇所で露呈してしまわないようにする必要がある。

### 実装方法

Goの`fmt`パッケージに含まれる`Stringer`と`GoStringer`という二つのインターフェースを実装することで、クレジットカード番号などの機密情報の出力フォーマットをカスタマイズできる。

#### Stringerインターフェース

“`go
type Stringer interface {
String() string
}
“`

#### GoStringerインターフェース

“`go
type GoStringer interface {
GoString() string
}
“`

#### 使用サンプル
これらのインターフェースを使用して拡張することにより、クレジットカード番号などの機密情報を含むフィールドのログ出力を、ダミー値に置き換えること

元記事を表示

個人的Goでアルゴリズムとデータ構造の基本文法まとめ

# アルゴリズムめっちゃ大事

エンジニアにとってCSの基礎知識を学んでいない筆者が効率的に処理を書くとはを自慢気に語れるようになりたいと思い

個人で学習したアルゴリズムの書き方をまとめる。

解説は必要と思ったタイミングでは入れますが、詳細には書かれていないので学びたい方は更にググるかコメントください。

## 超基本のmap

mapはGoには標準搭載されている。mapはO(1)で値にアクセスできる優れものである。

例として要素数N個のスライス中に重複する要素があるかを判定する関数を考えてみよう。

最初に筆者が考えたのは

– 一番目の要素を二番目以降の要素と比較して重複があるか判定
– 二番目の要素を三番目以降の要素と比較して重複があるか判定

– N-1番目の要素をN番目以降の要素と比較して重複があるか判定

この処理だと時間計算量は**O(N^2)**となり効率は良くはありません。

これをmapを使う方法で考えてみます。

– mapを定義
– スライスをループして、mapのキーにindexの要素があるか重複判定。重複がなければmapのキーにindexの要素を追

元記事を表示

【Go】JSONから構造体が生成できるJSON-to-Goを紹介

## はじめに

こんにちは、なかじです!

GoでWEB開発する際、JSONデータを扱うことが多いと思います!

JSONデータをGoの構造体に変換するのは、面倒なときがあると思います。

そこで役立つのが、「**JSON-to-Go**」というツールです!

今回の記事では、この「JSON-to-Go」を紹介したいと思います!

## 😃 JSON-to-Goとは?

こちらが、今回紹介するJSON-to-Goです。

https://mholt.github.io/json-to-go/

## 😃 使用方法

今回はダミーでデータを用意します

スクリーンショット

“`go
[
{
“id”: “3fa85f64-5717-4562-b3fc-2c963f66afa6”,
“n

元記事を表示

DB初心者が自作DBMS始めてみた

この記事は [DeNA 24 新卒 Advent Calendar 2023](https://qiita.com/advent-calendar/2023/dena-24-newgrad) の 23 日目の記事です。

# TL;DR

– DBMSの基本的な仕組みを知るのに有益だったリソース
– CMUのDBMS講義
– 先人の素晴らしい自作DBMSの解説記事&ソースコードリーディング
– 小さな小さな自作DBMSの設計と実装
– 最小限SELECTやINSERTなど基本的なSQLが動く

https://github.com/yamoyamoto/GarakutaDB

# この記事のゴール

データベースの内部構成を超ざっくり理解するために有用なリソースを知り、そして(全開発者のロマンである)自作 DBMS に一歩踏み出すきっかけになればうれしいです。

# モチベーション

自分は普段業務でアプリケーションのような割と高レイヤーな開発がメインなこともあって、ミドルウェアやOS、ネットワークと言った低めのレイヤーに憧れを持っており、この気持ちをまずは自作

元記事を表示

Go言語の実装テクニック

# はじめに

私は普段SREとしてAWSやEKS(Kubernetes)などのクラウドインフラの運用に従事しています。クラウド技術を支える代表的な言語としてGo言語が挙げられます。本記事では自身が学んできたGo言語のテクニックについて紹介します。

OSSのソースコードリーディングやコントリビュート、業務委託でGoを読んだり、書いたりしていますが、まともにGoをレビューしていただける開発経験がないので誤りがあるかもしれません。ご了承ください。

## コンストラクタ関数

Goでは`func NewUser(name string, age int) *User`のようなメソッドがコンストラクタのような役割をします。また、レシーバを使うことでgetterである`func (u *User) GetName() string`、setterである`func (u *User) SetName(name string)`が提供できます。

“`golang:
package main

import “log”

type User struct {
name string
age

元記事を表示

Go言語学習メモ

# 前書き
golangはシンプルな言語と言われていますが、実際勉強してみて、分かりづらかった点、十分に理解しないと、間違いやすい点などがあったので、 まとめてみました。

# :=, =の違い
– 初期化と再代入
– `:=` は、変数の`宣言と初期化を同時`に行うことができます。var キーワード、変数名、代入演算子(=)を1つの簡潔な形式で書けます
– `=` は、すでに宣言されている変数の`再代入`に使用されます
– スコープ
– `:=` は、関数またはブロック内のみ使用できます
– `=` は、コードのどこでも使用できます
– シャドーイング
(同名の新しい変数が宣言されるときに、発生)
– `:=` は、ブロック内で既存のブロック外の変数をシャドーイング(新しい変数として扱う)します
– `=` は、既存の変数のスコープに影響を与えず、シャドーイングが発生しない
シャドーイング例
“`golang
var a = 1
var b = 1
var c = 1

func shadow1() int {

元記事を表示

k8sのIngressを動的に変えるOperatorを作っている話

この記事は[CyberAgent Group SRE Advent Calendar 2023](https://qiita.com/advent-calendar/2023/ca-sre)の22日目の投稿になります。

## はじめに

はじめまして。SREをしている[@toro_ponz](https://twitter.com/toro_ponz)です。普段はEKSの運用やキャパシティプランニングなどをしています。その傍らサービス開発としてサーバーサイドアプリケーションの設計・開発のタスクをすることもあるのですが、やはりTerraformやHelm、YAMLなどを記述する時間のほうが長いのは言うまでもありません。ソフトウェアエンジニアとして今後取り残されないためにも、何らかのカスタムコントローラーでも作ってみたくなりました。

今日は、現在個人的に開発中の**Dynamic Ingress Operator**のコンセプトについてご紹介したいと思います。

本当は公開できるレベルまで実装しておきたかったのですが、まだほどんどが未実装です。Goを使ったソフトウェア開発もそこまで経験

元記事を表示

チーム開発参加の記録【2023-10~2024-03】(4) Go言語用ORM「Bun」をDBファーストで使う試み(PostgreSQL使用)

# 本シリーズのリンク

– [チーム開発参加の記録【2023-10~2024-03】(1) Go言語用ORM「Bun」をDBファーストで使う試み(SQLite使用)](https://qiita.com/kanedaq/items/97ca682602b626d5d717)
– [チーム開発参加の記録【2023-10~2024-03】(2) Go言語からTursoを使ってみた](https://qiita.com/kanedaq/items/0c81946306d2412df555)
– [チーム開発参加の記録【2023-10~2024-03】(3) slogを使ってリクエスト・レスポンス情報をログ出力してみた](https://qiita.com/kanedaq/items/3914de42cb111c8817bc)
– チーム開発参加の記録【2023-10~2024-03】(4) Go言語用ORM「Bun」をDBファーストで使う試み(PostgreSQL使用)

# 本記事で行うこと

本シリーズの[1番目の記事](https://qiita.com/kanedaq/items/

元記事を表示

GoでAWS S3を扱う

# aws-sdk-goの紹介
Goでs3を扱う方法を紹介します。
`aws`コマンドは有効化済みの想定です

## インストール
“`bash
go get github.com/aws/aws-sdk-go/aws
go get github.com/aws/aws-sdk-go/aws/session
go get github.com/aws/aws-sdk-go/service/s3
“`

## プログラム本体
“`go
package main

import (
“fmt”
“log”
“os”

“github.com/aws/aws-sdk-go/aws”
“github.com/aws/aws-sdk-go/aws/session”
“github.com/aws/aws-sdk-go/service/s3”
)

func main() {
sess, err := session.NewSession(&aws.Config{
Region: aws.String(“ap-northeast-1”)},
)
if err !=

元記事を表示

Azure OpenAI機能と実装

# Azure OpenAIについて

## 目次
1. 概要
2. 機能/詳細
3. サンプルコード
4. まとめ

## 1. 概要
Azure OpenAIは、Microsoft Azureの一部として提供されるサービスであり、人工知能を活用した様々な機能を提供します。OpenAIは、機械学習や自然言語処理を含むAI関連のテクノロジーを提供しています。

## 2. 機能/詳細
Azure OpenAIは以下のような機能を提供しています。

– **GPT-3**: GPT-3(Generative Pre-trained Transformer 3)は、大規模なトランスフォーマーモデルを用いた自然言語処理のAIモデルです。GPT-3は他のAIモデルに比べて非常に高い性能を持ち、文章生成、翻訳、文章の要約などの様々なタスクに利用されます。

– **DALL-E**: DALL-Eは、画像生成に特化したAIモデルです。このモデルはテキストの説明に基づいて画像を生成することができ、独創的でクリエイティブな画像生成が可能です。DALL-Eは例えば、ある語句に基づいてそのイメージを生成

元記事を表示

ギャリック砲で Pod を打ち抜け!vegeta で始める負荷試験 with GitHub Actions

この記事は [ZOZO Advent Calendar 2023](https://qiita.com/advent-calendar/2023/zozo) シリーズ9の22日目の記事です。

# はじめに
こんにちは、計測プラットフォーム開発本部 SRE ブロックの yamagai です。

タイトルがドラゴンボールのアニメタイトルのようになってしまいましたが、今回は [vegeta](https://github.com/tsenart/vegeta) という Go 製の負荷試験ツールを使って、EKS Fargate で動く Pod に対し GitHub Actions で簡単に負荷試験を実行する仕組みを作ったので、その方法や vegeta の使い方について記事にしました。

# 背景
今回の負荷試験の導入には以下のような背景がありました。

– EKS Fargate の Pod として動かしているアプリケーションのパフォーマンスを分析したかった
– 上記アプリケーションは、ZOZO New Zealand(以下、ZOZONZ)という日本とは別のチームによって開発されており、

元記事を表示

座席統合・移動機能について

![Advent Calendar 2023 Template.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143450/c579cfe6-969a-9917-8a28-f9b6a13939e8.png)

この記事は、Chompy アドベントカレンダー 21日目の記事です。

https://qiita.com/advent-calendar/2023/chompy

## はじめに
はじめまして。エンジニアのKazukiです。
Chompyには、約3年ほど前にGoを勉強し始めて間もない頃にインターンとしてジョインしました。今はバックエンドに限らず、Webやモバイルのフロントエンドも含め開発に携わっています。

Chompyでは、飲食店に関わる様々なシステムを開発しており、その1つとして、飲食店に特化したレジ × ハンディ × CRMツールであるChompy Studio(以降Studio)を提供しています。

https://apps.apple.com/jp/app/chompy-studi

元記事を表示

goenvからGoオフィシャルのバージョン管理に切り替える

goenvでのバージョン管理をやめて、Goでのバージョン管理に切り替える事になったので、
goenvのアンインストール方法と、Goオフィシャルでのバージョン固定方法を記載します。

## 手順

### 前提

* [anyenv](https://github.com/anyenv/anyenv)経由で[goenv](https://github.com/go-nv/goenv)をインストールしている。
* macOS Ventura

### goenvのアンインストール

goenv経由でインストールしているGoをアンインストールする。

“`zsh
$ goenv versions
1.20.3
* 1.21.0 (set by /Users/mitsuaki.ihara/Documents/01_sharefull/sharefull-backend/.go-version)
“`

“`zsh
$ goenv uninstall 1.20.3
$ goenv uninstall 1.21.0
“`

anyenv経由でインストールしているgoenvをアンイン

元記事を表示

WindowsデスクトップアプリをGoで作成する① ~WSL+Docker+Wails~

## はじめに

この記事は「[Qiita Advent Calendar 2023 Go言語](https://qiita.com/advent-calendar/2023/go)」の22日目の記事です。

## ゴール

Windows11上に構築したWSLでGoデスクトップアプリケーションを構築し、開発モードでアプリを起動できるところまでを目指します

## 前提

[前記事](https://qiita.com/miu200521358/private/a668da62bc208f40b121) に基づいて、Windows上にWSL+Docker+VSCode の開発環境が出来ているものとします

## 公式手順

[Wails: Getting Started](https://wails.io/ja/docs/gettingstarted/installation)

## 全体の流れ

1. VSCodeで開発コンテナーを開く
1. npmのインストール
1. ブラウザを開くためのライブラリインストール
1. Wails のインストール
1. 実行中のコンテナーにアタッチ

元記事を表示

Goにおけるinterface{}のnilの挙動

[Go Advent Calendar 2023](https://qiita.com/advent-calendar/2023/go)の22日目の記事です。

# はじめに
あるコードをリファクタリングしている際に得たnilの挙動についての記事となります。

# コード

突然ですが、以下のコードがどのような挙動をすると思いますか?
(実際のコードを簡略化したものとなります)

“`go
func main() {
_, err := hoge()
if err != nil {
fmt.Println(err)
}
}

func hoge() (ret *struct{}, err error) {
defer func() {
if r := recover(); r != nil {
err = errors.New(“hoge error”)
}
}()
// なんか処理してエラーがあったらpanic
if true {
panic(ret)
}
return
}
“`

正解は呼び出し元にて`hoge error`が出力さ

元記事を表示

[Go] ゴルーチンの実例探し

# はじめに

本記事は [RetailAI Adventurers Advent Calendar 2023](https://qiita.com/advent-calendar/2023/rai-adventurers) の22日目の記事です。
昨日は、絶賛キーボード沼にハマっている?(詳しくは[昨日の記事](https://qiita.com/satoshihiraishi/items/3cbc0c0323066029c5a5)を参照) [satoshihiraishi](https://qiita.com/satoshihiraishi) さんの [Quarkus+CloudRunで作る爆速アプリケーション](https://qiita.com/satoshihiraishi/items/3cbc0c0323066029c5a5) という記事でした。まだ見ていない方は是非ご覧ください!♡もよろしくお願いします!!

キーボード、自分にとってベストなものを探すのはとても難しいですよね。。
ちなみに私は少し前に分割キーボードに切り替えまして、現在は [BAROCCO MD770](

元記事を表示

OTHERカテゴリの最新記事