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

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

【Golang】無名関数を関数の引数もしくはリターンで使用する

自分に対する備忘録として残すもの

## 無名関数を関数の引数で使用する
サンプルコード

“`Go
package main

import “fmt”

// 関数applyFunctionは、無名関数を引数に取り、その関数を実行します。
func applyFunction(f func(int) int, x int) int {
// 引数として渡された無名関数を実行し、結果を返す
return f(x)
}

func main() {
// 無名関数を作成し、その場で引数として渡す
result := applyFunction(func(n int) int {
return n * 2
}, 5)

// 結果を出力
fmt.Println(“Result:”, result)
}
“`

引数に渡す無名関数は以下の通りでも良い。(個人的にはこちらの方が読みやすいから好き)
“`Go
package main

import “fmt”

// 関数applyFunctionは、無名関数を引

元記事を表示

golang/goのコードリーディングでVSCodeのコードジャンプが効かない

# 結論

developブランチを参照するのではなく、インストールされているバージョンのブランチを参照する

“`
git checkout go1.22.2
“`

# memo

goplsで以下のようなエラーが出ていた。
原因はdevelopブランチが開発中のgo1.23のコードになっていたためである。

“`
go env env,json,GOMOD,GOWORK: Command failed: /opt/homebrew/bin/go env -json GOMOD GOWORK go: downloading go
“`

元記事を表示

zerologでCloud Logging用の構造化ログを作る

Google Cloud上でアプリケーションを動かす際に、[Cloud Loggingが求める構造](https://cloud.google.com/logging/docs/structured-logging)を使うと、Cloud TraceやError Reportingなどと相性がいいので、Cloud Logging用にログの形式を設定する。

**logger側**
“`go
package log

import (
“context”
“fmt”
“os”
“path”
“runtime”
“strconv”

“cloud.google.com/go/compute/metadata”
“github.com/rs/zerolog”
“github.com/rs/zerolog/log”
“go.opentelemetry.io/otel/trace”
)

// Google Cloud Project ID
var projectID string

// init Loggerの初期設定を行う。
func init() {
project

元記事を表示

Goで簡易なコマンドラインセレクタを作りました。

## 作成したもの
RustでCLIのメモツールを作成する際、メモ一覧を表示して選択する機能が欲しいと考え、簡易なコマンドラインセレクタを作成いたしました。

本当はRustで作成したかったのですが、[Ratatui](https://ratatui.rs/)などのTUIツールをうまく使いこなすことができなかったため、Goで書くことにしました。

GoのTUIライブラリである[tview](https://github.com/rivo/tview)は非常に使いやすく、簡単に作成することができました。

mattnさんの[cho](https://github.com/mattn/cho)にとても影響を受けており、かなり簡易な作りにしてあります。
(mattnさんのchoはWindowsでも使えるため、高度な実装をしていると思います。)

## 使い方
slctは、標準入力から受け取った文字列を改行で区切り、それを選択肢として表示することを目的としていますので、単体で使うことはまずないと思います。
実際に使用する際は、lsやfindなどのコマンドとパイプラインを組み合わせて

元記事を表示

Go、Rust、Pythonで実装したAPIサーバーの負荷試験比較

## はじめに
みなさん様々な言語でAPIサーバーを立てて負荷試験を実施したことはありますか。

私自身、業務でPythonのアプリケーションに対して負荷試験を実施した経験があります。

その際にPythonの速度観点の不安定さを目の当たりにしたと同時に、別の言語ではどのような違いが生まれるのだろうか、という疑問を持ちました。

そこで今回は、簡単ではありますがGoとRustとPythonでそれぞれAPIサーバーを立てて負荷試験をしてみます。

## 負荷試験対象のAPIサーバー
今回は(1) Hello, World!を返すAPI(2) ファイル読み込みAPI(3)1秒待ってから応答するAPIの3つを実装します。

(1)はAPIサーバー自体の応答速度の計測、(2)はメモリを消費する処理が生じた場合のAPIの応答速度の計測、(3)は待ち時間発生している時のAPIの応答速度の計測することが目的です。

(2)について、ファイル読み込みAPIとはAPIが叩かれた際に特定のファイルを読み込んで完了メッセージを送るAPIを意図しています。(POSTではなく、 GET)

読み込む対象のファイ

元記事を表示

【Go】マップのキー・バリューを昇順・降順にソートする

# はじめに

Goのmapは順序を保持しないため、並び替えたい場合はひと工夫が必要です。

以下のようなマップをキー・バリューそれぞれで昇順・降順に並べ替えていきます。

“`go
m := map[string]int{
“Taro”: 23,
“Keiko”: 41,
“Jun”: 11,
“Azusa”: 16,
}

// マップは順序を保持しない
for k, v := range m {
fmt.Printf(“Name: %s, Age: %d\n”, k, v)
}
“`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/911578/1bd39d49-ef5d-5a21-039c-393540a67c2c.png)

## キー(文字列)でソートする

### 昇順

“`go
// 先にキーだけソート
keys := []string{}
for k := range m {
keys = append(ke

元記事を表示

Golangでhttpサーバーを作り直して、「Tiny Shiba.」と名付けた

![shiba_barner.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127562/d4ec84f9-b7c9-36c8-ef1d-1865183a5cc9.png)

golangのnet/httpを使った簡易WEBサーバー「Shiba.」をgithubにて公開していたのですが。HandleFuncが勝手にスレッドを作って動いているマルチスレッドなサーバーだと知って作り直し初めまして

どうせなら、構造体を使ったURLの指定を思い浮かんだので使いたい。そして、実行スレッド数を指定できる方法を海外のウェブで見つけたので、それも取り込んで作り直したら。ワンソースなプログラムでまとまりました

“`go:shiba.go
package main

import (
“fmt”
“time”

“net”
“net/http”

“golang.org/x/time/rate”
“log”

“context”
“os”
“os/signal”

“runtim

元記事を表示

Goの基本構文一覧

## 1. HelloWorld
Goのプログラムの開始地点は`main`パッケージの`main`関数です。
“`go
package main

import “fmt”

func main() {
fmt.Println(“Hello World!”)
}
“`
## 2. 変数宣言
“`go
// 変数
var num int = 10
// 定数
const constNum int = 20
“`
Goの基本のデータ型は以下の通りです。
| データ型 | 値 |
|:–|:–|
| int8
int16
int32
int64 | 8~64ビット整数 |
| uint8
uint16
uint32
uint64 | 8~64ビット符号なし整数|
| float32
float64 | [単精度浮動小数点](https://ja.wikipedia.org/wiki/%E5%8D%98%E7%B2%BE%E5%BA%A6%E6%B5%AE%E5%8B%95%E5%B0%8F%E6%95%B0%E7%82%B9%E6

元記事を表示

Go言語のJson出力をjson serverの形式に揃える方法

## はじめに

Go言語で集めたデータをjsonで保存.そのjsonをjson-serverでホストしてフロントエンドから取得,及び変更する簡易な自作ツールを作成していた.
運用期間を延ばしてもそこまでjsonが肥大化する性質のツールではないためjsonもGitリポジトリで管理したい.しかし,Go言語標準ライブラリのjson encoderのデフォルトの出力形式とjson-server側で変更した際に整形される形式が異なっている.
そのため,Go言語でデータ取得した後json-serverの変更が実行された場合や,json-serverの変更が実行された後に再度Go言語でデータを取得した場合にGit上ではファイル全てが書き換えられたように認識されてしまい変更履歴が機能しない.
なのでGo言語標準ライブラリのjson encoderの出力形式をjson-serverと同じ形式にしたい.

## 対処

以下愚直にjson encoderを使用したコードとその出力.json-serverの形式と違う部分は1行にまとめられていることとHtml要素がエスケープされていることだった.

“`

元記事を表示

Golang_study_1

## 本日やったこと
– GO言語を学ぶための環境構築
– [参考にさせていただいた記事](https://qiita.com/melty_go/items/c977ba594efcffc8b567)
– goのインストール
– vscodeをGO開発向けにカスタマイズ
– 静的チェック
– デバッグ
– goのプロジェクト作成
– GO言語の基礎学習
– [A Tour of Go](https://go-tour-jp.appspot.com/list)
– Git環境の構築
– gitのインストール
– GitLabアカウント作成
– ローカルマシンの既存プロジェクトフォルダをgitリポジトリ化
– GitLabの空プロジェクトと上記ローカルリポジトリの同期

## 詰まった点
### GO関連
– Goのプロジェクトを作成するときに実行する“`go mod init <モジュール名?>“`がよくわからなかった
– 変数の宣言時に、型を変数名のあとにつける感じが慣れない

元記事を表示

Vercel FunctionsでGoのAPIサーバをデプロイする!

# はじめに
こんにちは、H×Hのセンリツ大好きエンジニアです。(同担OKです😉)

今回は、運用にお金を使いたくない人向けの味方「Vercel Functions」にステートレスなGoのAPIサーバをデプロイする方法をまとめました。

前提として、Vercel Functionsのデプロイに向いているものは以下の条件にクリアしたものになると思います😇
– ステートレス(セッション管理などをしない)
– 小規模なAPIサーバ
– 一回のデータ取得に時間が掛からない

# セットアップ
1. Vercelのアカウント登録
1. Vercel CLIのインストール
– npmの場合、`npm i -g vercel`
3. Vercelにログイン
“` npm
vercel login
“`

# APIエンドポイント作成
### ディレクトリ構成
これを元に、ご自身で構成を変えていただければと思います🫣
“`
.
├── api # エンドポイント用
│ ├── articles # APIの例
│ │ └── index.go
│ └── index.go

元記事を表示

【未経験・独学】Next.js+TypeScript+GoでWebアプリケーションを開発しました

# はじめに
大学も情報系ではなく、仕事もITとは程遠い社会人ですが、プログラミングに興味を持ち勉強を開始しました。まだまだ機能は追加していく予定ですが、一番実装したい機能がじっそうできたので紹介させていただきたく本記事を作成しました。

# アプリ解説
予備試験、司法試験に出題される各法令を表示、各法令内で指定した条文番号にジャンプ、各法令内でキーワード検索をするアプリです。

https://raku-roppou.vercel.app/

## 開発の動機
予備試験、司法試験本番では紙の六法を使用します。しかし、日ごろの勉強では紙の六法を引くのが面倒なことがあります。私も受験生時代は紙の六法を引くのが面倒なときは例えばe-govで条文をPCで見ていました。ただ、e-govは重かったりピンポイントで特定の条文にジャンプするのが困難と言う問題を感じていました。このような不便さから条文を見ようと思っても「まあいいか」と怠ることがよくありました。以上のような受験生時代に感じていた問題点を解決すべく本アプリを開発しました。

## 機能
## ユーザー機能
* 条文表示
* 条文にジャン

元記事を表示

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

## はじめに
前回は、nonceの実装までやりましたが、今回はマイニングの実装をしていきます。

– 前回までの記事

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

https://qiita.com/jun_11/items/259f0a777e12b3fa1b32

https://qiita.com/jun_11/items/61adfc340792cdb2af08

https://qiita.com/jun_11/items/88f9a40648444b597529

– バージョン
– Go 1.22.0

## マイニングとは
マイニングとは、トランザクションを確認し、新しいブロックをブロックチェーンに追加するプロセスです。
具体的には、以下のステップが含まれます。
1. トランザクションの収集
2. nonceの計算(プルーフ・オブ・ワークの計算)
3. ブロックの追加と報酬の受け取り

1.では、未確認のトランザクションを収集し、新しいブロックにまとめます。
2.では、前回の記事で実装した、nonceを

元記事を表示

外部ライブラリを利用せず、structをPretty Printしたい

外部ライブラリを利用せず、Go言語でstructをPretty Printする方法を2つ紹介します。

# fmtパッケージを利用する

`fmt.Printf`を利用する場合、書式指定子に`%+v`を指定すればよいです。

“`go
package main

import (
“fmt”
“time”
)

type Employee struct {
ID int
Name string
HireDate time.Time
}

type Department struct {
ID int
Name string
Employees []Employee
}

func main() {
department := Department{
ID: 9876,
Name: “営業部”,
Employees: []Employee{
Employee{ID: 100, Name: “佐藤”, HireDate: time.Date(2001, 1, 1, 1, 1, 1, 1, time.UTC

元記事を表示

JavaのOptionalをgolangにportする

# はじめに

Java さわってますか?私は10年近くさわってません。[JDK 8 Release Notes](https://www.oracle.com/java/technologies/javase/8all-relnotes.html#JSERN108)を見ると2014年5月15日にリリースされているので大体10年です。

この10年位は golang をさわってます。

Javaの勉強もしなければなと思いつつも、作りたいアプリケーションも特にありません。ドキュメントを読んでるだけというのも長続きしないかなと思ってます。そんな時に以下の2つのブログを読みました。

* [Goのヌル安全について](https://zenn.dev/nobonobo/articles/f49dd93073fdd3c6c663)
* [元JavaエンジニアがGoに感じた「表現力の低さ」と「開発生産性」の話](https://inside.dmm.com/articles/ex-java-engineer-thoughts-about-go/)

これらを読んで「 Java の Optional

元記事を表示

GoLangを使うのはなぜ?

Go言語(Golang)は、Googleによって開発されたオープンソースのプログラミング言語です。近年、その人気が高まっており、様々な用途で使用されています。

Go言語を使う理由は、以下のようなものが挙げられます。

**1. シンプルでわかりやすい**

Go言語は、C言語のような構文を持ちながら、よりシンプルでわかりやすい言語です。そのため、初心者でも比較的簡単に学ぶことができます。

**2. 高速な処理速度**

Go言語は、C言語のようにコンパイルされる言語です。そのため、実行速度が非常に速いです。

**3. 並行処理に優れている**

Go言語は、goroutineと呼ばれる軽量スレッドを用いて、簡単に並行処理を行うことができます。

**4. 標準ライブラリが充実している**

Go言語は、標準ライブラリが充実しています。そのため、様々なタスクを簡単に実行することができます。

**5. 静的型付け**

Go言語は、静的型付け言語です。そのため、実行時エラーを防ぐことができます。

**6. テストがしやすい**

Go言語は、テストがしやすい言語です。そのため、コ

元記事を表示

Vscodeでgoテストのタイムアウトを伸ばす

1. vscodeでSettingsを開く
![スクリーンショット 2024-04-19 12.25.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961840/82794284-ef96-fad5-d369-c70605deea0f.png)

1. `go.testTimeout`を検索
1. タイムアウトを設定する

– 参考

https://stackoverflow.com/questions/73033725/how-to-edit-default-go-test-timeout-in-visual-studio-code

元記事を表示

[Go]JSON文字列とデータオブジェクト間の変換

# 概要
Golangにおける標準パッケージ `json` を使った以下の操作について記述。
JSON文字列を構造体に変換( `json.Unmarshal` )
構造体をJSON文字列に変換( `json.Marshal` )

※Railsでいうところの `.to_json` , `JSON.parse` のお話。

以下、基本的な処理のサンプルコード。
https://go.dev/play/p/W5Of2mG79Mf

“`sample.go
package main

import (
“encoding/json”
“fmt”
“log”
)

// パースしたJSONを受け入れる構造体
type jsonBlock struct {
StringKey string `json:”string_key”`
IntKey int `json:”int_key”`
FloatKey float64 `json:”float_key”`
}

func main() {
// パース対象のJSONバイナリ
jsonBlockBin := []

元記事を表示

[Go言語]goqueryを用いたWebスクレイピングメモ

## 概要

* ライブラリ`goquery`を用いたWebスクレイピング方法についてメモする。

## goquery 概要

* Go言語で開発されたライブラリ。
* 主にHTMLドキュメントの解析と操作を行うために使用される。
* jQueryのようなシンタックスを模倣しており、HTMLドキュメントを簡単に選択、操作、抽出することができるように設計されている。

**主な特徴**

1. **jQuery風の操作**: jQueryの選択子やメソッドを模倣しているため、WebページのDOM要素を簡単にトラバース(走査)や操作が可能。これにより、HTMLドキュメントからのデータ抽出が容易になる。
2. **HTMLドキュメントのパース**: HTMLをパースしてドキュメントオブジェクトモデル(DOM)を作成し、その後、要素を簡単に検索して操作できる。これはWebスクレイピングやテストデータの生成など、さまざまな用途で利用できる。
3. **軽量で高速**: Go言語の軽量性と高速な実行速度を活かし、効率的なHTMLドキュメントの処理を実現する。

**使用時の留意事項**

1.

元記事を表示

JWTのBase64URLデコードで引っかかった話

JWTの各要素をパースする処理を自前で書いていたときに、ちょっと詰まってしまったので備忘録として記述しておく。

# 結論
– Base64エンコードとBase64URLエンコードは異なるものである。
– JWTのヘッダ、ペイロード、署名はそれぞれBase64URLエンコードされているものなので、取り出すにはBase64URLデコードしないとダメ。
– Goならば `base64.RawStdEncoding.DecodeString`関数を使う。

# Base64エンコードとBase64URLエンコード
要約すると以下の違いあり。

**Base64エンコード**
`A-Z, a-z, 0-9, +, /`しか扱うことができない通信環境において、元のデータをこれらの文字にエンコードする方式。
パディング文字として`=`が使われる。
主にEメール、Basic認証、インターネット掲示板で使われる。

**Base64URLエンコード**
URLでは`+, -`は特別な意味をもつため、Base64エンコード済み文字列の中でこれらに相当する文字はそれぞれ`-,_`に変換して扱う方式

元記事を表示

OTHERカテゴリの最新記事