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

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

go install時にis not in stdエラー

単純なミスに気が付かずにハマったので備忘録。
検証のためにGoのインストールやアンインストールを繰り返していたら下記エラーが出るようになった。

“`zsh
go install golang.org/dl/go1.21.0@latest
../../go/pkg/mod/golang.org/dl@v0.0.0-20231219203010-00f4782d5d4c/internal/version/version.go:9:2: package archive/tar is not in std (/opt/homebrew/Cellar/go/1.21.5/src/archive/tar)
../../go/pkg/mod/golang.org/dl@v0.0.0-20231219203010-00f4782d5d4c/internal/version/version.go:10:2: package archive/zip is not in std (/opt/homebrew/Cellar/go/1.21.5/src/archive/zip)
../../go/pkg/m

元記事を表示

terminalでChatGPTを使いたい

# GoでChatGPT
terminalから呼び出せるGPTクライアントをgolangで作成します。

## main関数
“`go:main.go
package main

import (
“bufio”
“fmt”
“os”

“./gpt”
)

func main() {
for {
fmt.Print(“> “)
scanner := bufio.NewScanner(os.Stdin)
if scanner.Scan() {
input := scanner.Text()
if input == “exit” {
fmt.Println(“exit!”)
break
}
gpt.Call(input)
}
}
}
“`

exitと入力したら終了します。

“`go:gpt/call.go
package gpt

import (
“bytes”
“encoding/json”
“fmt”
“io”
“log”
“net/http”
“os”

“github.com/joh

元記事を表示

Go 1.21以降での、go.modを利用したバージョン固定可否の検証

今はプロジェクトでバージョンの固定にgoenvを利用しているが、

「Go 1.21以降では、go.modに記載されたgoのバージョンがインストールされていない場合、自動でダウンロードして指定のバージョンのgoで実行されるためGoenvが不要になる。」

という話を聞いたので、Go公式が用意したツールチェインを利用した方法で、
マイナーバージョンも含めてGoのバージョンをプロジェクトごとに固定出来るか、検証した。

## 検証

### 事前準備

#### go1.21.1のインストール

“`zsh
$ go install golang.org/dl/go1.21.1@latest
$ go1.21.1 download
“`

“`zsh
$ go1.21.1 version
$ go1.21.1 env GOROOT
/Users/mitsuaki.ihara/sdk/go1.21.1
$ go version go1.21.1 darwin/arm64
“`

#### go.modの作成及び検証用ファイル作成

Goのプロジェクトを初期化する。

“`zsh
$

元記事を表示

Go入門したい人におすすめの学習方法6選

## はじめに
こんにちは、もみです!

大学で情報工学を学びながら、Web系エンジニアを目指している学部2年生です。
Go言語の学習を半年前に始め、学生であることの時間的利点を生かして、複数のGo言語学習リソースを学んできました。

昨今、Go言語はそのシンプルさや大規模開発への適合性などさまざまな魅力から人気を集めています。
企業でも採用されることが増えており、Go言語を学び始める人も増えています。

今回の記事では、これからGo言語に入門する人へ、私が実際に試してとくに良かった学習リソースを紹介します。

## 対象読者
– Goに入門したい人
– プログラミング初心者〜中級者
– 自分にあった学習リソースを探している人

## プログラミング未経験者向け

[Progate Go](https://prog-8.com/courses/go)
– プログラミング未経験者でもつまずきにくい
– 環境構築が不要
– コードの自動採点がある
– イラストや図などを用いたわかりやすいスライド解説
– 基本的な内容、簡単な内容のみで構成されており、はじめの一歩に

元記事を表示

IPアドレスを隠蔽したいので、GolangでHTTPプロキシサーバーを作る

# Goでプロキシサーバー
プロキシサーバーをGolangで作成してみます。

# プロキシサーバー
ポート8080で作成します。リクエスト先のURLを取得し、代理でプロキシサーバーがリクエストを送信、レスポンスを複製して返しています。

“`golang:main.go
package main

import (
“fmt”
“io”
“log”
“net/http”

“github.com/labstack/echo/v4”
“github.com/labstack/echo/v4/middleware”
)

func handler(c echo.Context) error {
url := c.Request().URL.String()
req, _ := http.NewRequest(c.Request().Method, url, c.Request().Body)

for name, values := range c.Request().Header {
for _, value := range values {
req.H

元記事を表示

Go API(Gin)をCloud Functionsにデプロイする方法(CLI, Terraform)

## はじめに
Glolang WebアプリケーションGinを用いたサーバーレスアプリケーションをgcloud CLI, Terraformそれぞれを用いてCloud Functionsにデプロイします

今回用いたコードは[GitHub](https://github.com/tomoish/gin-Cloud-Functions)で公開しています。

## 環境
Golang: 1.20.4
Terraform v1.6.6

## ディレクトリ構成
“`
.
├── gin
│ ├── cmd
│ │ └── main.go
│ ├── function-source.zip
│ ├── gin_http.go
│ ├── go.mod
│ └── go.sum
└── infra
├── main.tf
└── terraform.tfvars
“`

## Gin
### Gin Tutorial
今回は[Gin Tutorial](https://go.dev/doc/tutorial/web-service-gin)で作

元記事を表示

Salesforce Pub/Sub API を利用してみる

※ これから記載する事項は、私が所属する会社とは一切関係のない事柄です。

今回は [Pub/Sub API](https://developer.salesforce.com/docs/platform/pub-sub-api/overview) の[サンプル](https://github.com/developerforce/pub-sub-api/tree/main/go/examples)を実行する方法を紹介したいと思います。

## Pub/Sub API では何ができるの?

Pub/Sub API は gRPC と HTTP/2 に基づいた API で、リアルタイムでイベントを介してデータのやり取りを行うことができます。公開されたイベントはイベントバスに 72 時間保存されるので、一時的に切断されていたとしても過去のイベントを再取得することができます。

ユースケースとしては外部システムとのデータの同期やオブジェクト変更時の通知といったようなことが挙げられます。

Trailhead の「[Pub/Sub API を使用する](https://trailhead.sal

元記事を表示

OpenTelemetry 調査

# OpenTelemetryについて

## 目次
1. [概要](#概要)
2. [機能/詳細](#機能詳細)
3. [なぜ必要か](#なぜ必要か)
4. [サンプルコード](#サンプルコード)
5. [まとめ](#まとめ)

## 概要
OpenTelemetryは分散トレーシングとメトリクスの観測性データを収集し、分析・監視・トラブルシューティングを行うためのオープンソースのツールキットです。分散システムのコンテキストをキャプチャし、リクエストの経路やパフォーマンスの問題を追跡するための一貫した手法を提供します。

## 機能/詳細
OpenTelemetryには以下の主な機能があります:

### トレーシング
分散トレーシングを使用して、リクエストの経路やリクエスト間のタイミング情報を収集します。これにより、アプリケーションのコンポーネント間の相互作用の可視化とトラブルシューティングが容易になります。

### メトリクス
アプリケーションのパフォーマンスやリソース利用率を測定し、カスタムメトリクスを作

元記事を表示

【GoとPython】異なる言語、共通する哲学

:::note info
この記事はAndrew Gerrand氏のGo and the Zen of Python[^1]を訳したものです。
:::
[^1]:https://go.dev/talks/2012/zen.slide#1

## “Beautiful is better than ugly.”

Goは、C言語を彷彿とさせる軽量で規則的な構文を持っている
しかし、美しいか醜いかは、個人に依存する

## “Simple is better than complex.”

メソッドはただの関数であり、特別な場所は無い
thisやselfなどのキーワードはなく、レシーバは他の関数引数と同じようなものである

“`go
type Vector struct {
X, Y float64
}

func (v Vector) Abs() float64 {
return math.Sqrt(v.X*v.X + v.Y*v.Y)
}
“`

## “Simple is better than complex.”

メソッドはクラスがなくても任意の名前付き型で宣

元記事を表示

プログラミングについて管理者がとりあえず知っておきたい内容 Go言語編

# 業務で利用しないのに何日もかけて勉強するのはちょっとしんどい!

「1日」ならできる!

# たった1日で基本が身に付く!Go言語  清水 美樹[著]

以下は本のホント触りの部分。詳しくは本を参照ください!

・Google社が開発したプログラミング言語。
・「構造体」「ポインタ」等、C言語を感じさせるが、C言語より簡単
・コンパイラを用いてOS上で直接動く実行プログラムを作成する。

|言語|説明|
|—-|—-|
|C/C++|WEBアプリから周辺機器のドライバまで幅広い用途。コンパイラ必要。|
|Java|オブジェクト指向言語。C言語の書き方に近い部分あり。ライブラリや開発ツール豊富。実行環境をインストールした上でコンパイラで中間言語に変換する。|
|C#|Microsoftの.NETフレームワークを実行環境とするオブジェクト指向言語。コンパイラ必要。Microsoft Visual Studioが主要な開発ツール。|
|Python|最近ではAIと共に再注目されている。|
|JacaScript|HTML5との組み合わせでWEBページの記述で使用される言

元記事を表示

Go 1.21.0からruntime/coverage.WriteCountersDirで-covermode=atomicエラー

GoのバージョンをGo 1.21.0に上げた所、
scenarigoを利用して起動しているE2Eテストにて、
カバレッジを出力するAPIにて、下記エラーが出るようになった。

“`go
func (h *Handler) Record(gc *gin.Context) {
err := coverage.WriteCountersDir(“./_coverage”)
if err != nil {
panic(err)
}
}
“`

“`zsh
2023/12/18 18:36:24 http: panic serving 127.0.0.1:52164: WriteCountersDir invoked for program built with -covermode=set (please use -covermode=atomic)
goroutine 3046 [running]:
net/http.(*conn).serve.func1()
“`

## 原因

Go 1.21.0から、atomic mode必須に変更されている。

### Go 1.2

元記事を表示

Echo(Go)のMiddlewareを理解する (Recover,CORS)

# はじめに
こんにちは。TuneCoreJapanでバックエンドエンジニアをしています @masafumi330 です。
この記事は[Wano Group Advent Calendar2023](https://qiita.com/advent-calendar/2023/wano-group) 最終日の記事です。もう一度言いますよ。最終日の記事です!

今回は、弊社バックエンドアプリケーションの開発でも使用しているGo、 そのフレームワーク**Echo**について、その**Middleware**の機能にフォーカスを絞り、
– Middlewareとは何なのか?
– Middlewareによってどのような課題を解決できるのか?
– 実際にどのようにMiddlewareの機能を使うのか?
をまとめていきたいと思います。

https://echo.labstack.com/

# 調査の経緯
まずは今回、EchoのMiddleware機能を調査してみるにあたった経緯を話そうと思います。

Wanoに入社して2年間、私はバックエンドチームにてGoを用いたアプリケーション開発を行ってき

元記事を表示

【Go言語】ジェネリクス

**ジェネリクス**は、関数や構造体に型パラメーターを追加することで、より柔軟なコードの記述を可能する。
しかし、ジェネリクスの概念はメソッドの記法とは異なる点がいくつかある。

ジェネリクスの基本
* ジェネリクスを使うと、関数や構造体に追加の型パラメーターを設定できる
* 型パラメーターは関数名や構造体名の後ろに配置され、角括弧`[]`で囲む
* さまざまな型に対して同じ関数や構造体を使い回せるようになる。

### 構造体でジェネリクス
“`go
package main

import “fmt”

// ジェネリックな構造体
type Pair[T1, T2 any] struct {
First T1
Second T2
}

func main() {
// ジェネリックな構造体の使用例
pair1 := Pair{1, “one”}
pair2 := Pair{“two”, 2}

fmt.Printf(“Pair 1: First=%v, Second=%v\n”, pair1.First, pair1.Second

元記事を表示

GoのORM決定版 Genをはじめよう

# はじめに
こんにちは、muff1225です。

2023年も終わりに近づいてきましたね〜
今年もGoたくさん書いて、たくさんリリースできましたか?

私は長らくGoのORMの書き味に悩んでいましたが、今年ようやく一つの答えに辿りつきました。

この記事ではgormの[Gen](https://gorm.io/ja_JP/gen/)の開発者体験が最高だった、ということで感謝の意味を込めてgormの[Gen](https://gorm.io/ja_JP/gen/)を紹介します。

# GoのORM
## 歴史
みなさんはGoのプロジェクトでどんなORMを使ってますか?
GoはORMを使う派 / 使わない派でくっきり分かれている印象です。
これはGoの思想として、標準パッケージを使うことがよしとされている文化的な背景や、まだ他言語に比べ歴史が浅いという背景があり、現時点でデファクトスタンダードなアプローチはありません。
とはいえGoにもORMパッケージはたくさんあり、Active Recordのようなフルパッケージのものであったり、シンプルなクリエを書くための軽量ORMであったりとさまざ

元記事を表示

GoでREST APIを実装し、クリーンアーキテクチャを整理してみた

今年の2月からLaravelで開発を行っています。そんな中、一番詰まったのは

**「責務を分けて実装」**

でした。クリーンアーキテクチャってやつです。
正直今でも感覚的にしかわかっていない点がありますが、今年のまとめとしてクリーンアーキテクチャの復習をするつもりで趣味で触っているGoを使ってREST APIを実装してみました。(gRPCじゃないのかよって突っ込まれそう)

年の瀬に、一番苦手だったことを記事にして恥を晒して年越しします。
アドベントカレンダーのトリがそんなんですみません。
どこかに飛んでいきたい・・・・鳥だけに。

## クリーンアーキテクチャ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3287130/91fa8c71-8353-400d-0698-07e4fbcbe774.png)

>[クリーンアーキテクチャ(The Clean Architecture翻訳)](https://blog.tai2.net/the_clean_architecture.ht

元記事を表示

【Go言語】エラーに自分で情報を追加する方法

## pkg/errorsについて

`pkg/errors` は、エラーハンドリングを強化するために使うパッケージです。今回はこれを使います。

Go1.13からは標準の `errors` パッケージというのが標準パッケージに追加されたのですが、`errors`は未だにいろんなところで見かけるので、今回は `pkg/errors` を使います。

移行についても紹介します。

### go getする

“`bash
go get github.com/pkg/errors
“`

### errors.Wrapを使ってエラーに情報を追加する

`errors.Wrap` は、エラーに情報を追加するための関数です。

以下のようにerrにエラーが入っているときに、`errors.Wrap` を使うとエラーに情報を追加することができます。
以下のように関数がエラーを返すときにWrapで情報を追加してあげることができます。

“`go
package main

import (
“fmt”
“io/ioutil”

“github.com/pkg/errors”
)

f

元記事を表示

Goのベンチマークをとる

# ベンチマーク
Goには標準関数でベンチマークを計測するものがあるので、試してみます。
ベンチマーク対象はフィボナッチ数列を計算する関数です。

## フィボナッチ数列の計算

“`go:main.go
package main

func Fibonacci(n int) int {
if n <= 1 { return n } return Fibonacci(n-1) + Fibonacci(n-2) } ``` ## ベンチマーク関数の作成 ```go:main_test.go package main import "testing" func BenchmarkFibonacci(b *testing.B) { for i := 0; i < b.N; i++ { Fibonacci(10) } } ``` 特徴は`*testing.B`型を渡していること、関数名の接頭辞が`Benchmark`であることです。 ## ベンチマーク実行 ```bash $ go test -bench=BenchmarkFibonacci ``` ###

元記事を表示

aws-sdk-go-v2にifaceパッケージがないので自動生成する

## 記事の要約
– aws-sdk-go-v2では存在しないiface (interface) を自動で生成したい
– ifacemakerというOSSを使って生成する
– 生成したinterfaceをmockgenと連携する

## 経緯
aws-sdk-go-v1には`${AWS_SERVICE_NAME}iface`というパッケージ名でAWSの各サービス用interfaceが定義されていた。
S3を例に上げると[s3iface](https://github.com/aws/aws-sdk-go/blob/8d5e4144167bcd8d6bd98383d285025145099382/service/s3/s3iface/interface.go)があたる。

aws-sdk-go-v1では、この`${AWS_SERVICE_NAME}iface`パッケージを使うことでmockgenやStruct Embeddingを組み合わせることでテスト用のmockファイルを簡単に生成できた。

しかしaws-sdk-go-v2になり、とあるversion以降はifaceパッケージが無く

元記事を表示

Go言語でのブラックジャックの作り方

# Go言語でのブラックジャックの作り方
作成手順は

1. 全体構造の設計、タスク出し
2. 必要な構造体、関数の作成
3. main関数の作成

である。今回はGoの文法などの基礎知識は前提として話を進める。

# 全体構造の設計、タスク出し
今回作るブラックジャックのルールやゲームの内容を決め、必要なタスクを書き出す。

**ルール、ゲーム内容**
* AからKまでの13枚の数字が書かれたカードが4色ある、52枚のカードを使用する。
* 実行開始時、ディーラーとプレイヤー全員に2枚ずつカードが配られる。
* プレイヤーは自分のカードの合計値が21に近づくよう、カードを追加するか、追加しないかを決める。
* カードの合計値が21を超えてしまった時点で、その場で負けが確定する。
* ディーラーはカードの合計値が17を超えるまでカードを追加する。
* 双方が21を超えなかった場合は手の大きさを比較し21に近い方を勝利とする。

* 各カードの点数は以下のように決定する。
* 2から9までは、書かれている数の通りの点数
* 10,J,Q,Kは10点
*

元記事を表示

【Go言語】echoのAPIをテストする [contextを使う]

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

### APIを作成する

[【Go言語】echoのAPIをテストする [サーバーを起動させてテスト]](https://qiita.com/marurusan/items/6579810c3356e0ecedb3)、[【Go言語】echoのAPIをテストする [ハンドラー単体のテスト]](https://qiita.com/marurusan/items/21bccbe24a02852a43b4)をもとに少し改変します。
`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 main() {
e := InitServer()
e.Logger.Fatal(e.Start(“:808

元記事を表示

OTHERカテゴリの最新記事