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

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

Goの型変換の正体

## はじめに
42Tokyoに入ってGo言語を触りだして少し経ちますが、Go言語の仕様そのものについて気になる部分がありました。
Go言語にはパッケージに定義されている関数とは異なり、builtinと呼ばれる組み込み関数群があります。例を挙げると、len()やappend()、panic()などがこれにあたります。
さて、Go言語には型変換と呼ばれる仕組みがあります。
“`go
var i int = 42
var f float64 = float64(i)
“`
このコードは、int型の42をfloat64に変換しています。このfloat64は一体何の関数かが気になり、今回これを調べることにしました。

## builtin.goを読む

https://github.com/golang/go/blob/master/src/builtin/builtin.go

Go言語の組み込み関数は、builtinパッケージのbuiltin.goに記載されています。
コードそのものが書かれているわけではなく、ここには事前に宣言された定数や変数、型などが記載されています。
builti

元記事を表示

【Go】クッキー

# はじめに
前回、レスポンスについてまとめたのですが、長くなるためクッキーは割愛しました。
そこで今回はサーバーからHTTPレスポンスメッセージを通して送られる`クッキー`についてまとめます。

https://qiita.com/YokoYokoko/items/b62f994a5d79da362aed

# クッキー
クッキーは、サーバーがクライアントに送信し、クライアント側で保存される情報の小さな断片です。例えば、ブラウザ(Chrome)で検証すれば簡単に確認できます。(下の画像は何も入っていません。)
![スクリーンショット 2024-07-10 11.32.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3324306/79d4bb97-963b-c076-facb-5a91d17fb70b.png)

サーバーはステートレスであるため、一度クライアントとのやり取りが終わるとその状態を保持しません。そのため、次のリクエストが来たときにそのクライアントが誰なのかを覚えていません。

例えば

元記事を表示

【Go】レスポンス

# はじめに
前回はリクエストの`*http.Request`に焦点を当てて、どのようにリクエストの中身を読み取るのかについてまとめました。

https://qiita.com/YokoYokoko/items/04afe5ff82a4f73909c3

今回は`http.ResponseWriter`とJSONに焦点を当ててまとめてみたいと思います。

# ResponseWriter
サーバーを立てるときには`http.ResponseWriter`と`*http.Request`を引数とした関数を用意します。

:::note info
余談ですが、http.ResponseWriterはインターフェースなので一見値渡しのように見えますが、実際はresponseの参照渡しです。
:::

ResponseWriterインターフェースには次の3つのメソッドがあります。
| メソッド | 説明 |
| — | — |
| Write | レスポンスボディにデータを書き込みます。引数としてバイトスライスを受け取り、書き込んだバイト数とエラーを返します。 |
| WriteHe

元記事を表示

Go言語でのシャドーイングの理解

## 実装

“`go
func main() {

x := 10
fmt.Println(“outter block”, x)//10

if x > 5 {
fmt.Println(“inner block”, x)//10
x := 5
fmt.Println(“inner block”, x)//5
}
fmt.Println(“outter block”, x)//10
“`

上記のxで変数宣言したものは条件分岐より外では、10になります。ブロック内で再宣言すると値が隠蔽され、5になります。そして、ブロック外では最初に宣言した値にアクセスでき、再び10になります。この性質をシャドーイングと言います。

“`go
func main() {
var x int = 10
fmt.Println(“Outside block:”, x) // 10

{
var x int = 20 // ここで新しい変数を宣言しようとすると、エラーが発生します。
fmt.Println(“Insid

元記事を表示

【Go】リクエスト

#
今読んでいる技術書の内容で大事だと思った部分を少しずつまとめていきたいと思います。

今回読んでいる本はこちら
__Goプログラミング実践入門__

この書籍では、フレームワークに頼らず標準ライブラリでweb開発をすることができます。
個人的にフレームワークはブラックボックスが多すぎて面倒であまり好きではない派なので、これを理解できることで理解が深まるのではないかと考え購入しました。

この本ではプログラミング言語Goとその標準のライブラリだけを使って、
ゼロからWebアプリケーションを開発するのに必要な事柄を解説します。

ほかのライブラリやその他のトピック(Webアプリケーションのテストやデプロイなど)について解説するページもありますが、Go言語の標準ライブラリのみを用いたWeb開発を解説することがこの本の主目的です。

本記事では、リクエストとレスポンスについてまとめています。

# Request
まず、`net/http`パッケージの`http.Request`構造体は以下の通り定義されています。
| フィールド | 説明 |
| — | — |
| `Meth

元記事を表示

GORMで特定のフィールドのみ選択(select)したとき、mapを使用してクエリ結果を取得する方法

# はじめに
GORMを使用してデータベースからデータを取得する際、しばしば特定のフィールドのみを選択したい場合があります。
通常、これはカスタム構造体を定義し、その構造体へスキャンすることでデータを取得しますが、カスタム構造体の定義がめんどくさい場合、簡易的にmapを使用することでも取得が可能です。

“`go
type User struct {
ID uint
Name string
Email string
Age int
}

type Order struct {
ID uint
UserID uint
ProductName string
Quantity int
TotalPrice float64
}

// mapを使用し、ここにスキャンする
var results []map[string]interface{}

// 2つのテーブルをjoinして特定のカラムを選択する
err := db.Table(“users”)

元記事を表示

【Go】Filter, Mapなどの便利関数を手軽に使いたい、そんなあなたへ

# はじめに
こんにちは、H×Hのセンリツ大好きエンジニアです。(同担OKです😉)
Goには、標準でFilterやMap、FindやFirstなどの関数が実装されていません。

しかし、ジェネリクスの登場によりこれらの便利な関数を実装できるようになりました。
そこで今回は、ジェネリクスを用いた便利関数がまとめられているライブラリである**samber/lo**をご紹介します😁

# 便利ライブラリ「samber/lo」

https://github.com/samber/lo?tab=readme-ov-file

> ✨ samber/lo is a Lodash-style Go library based on Go 1.18+ Generics.

Go 1.18から登場したジェネリクスを元にしたLodashスタイルのGoライブラリです。
Lodashとは、JavaScriptの便利な関数を提供しているライブラリのことで、samber/loはそのGo版になります。

名前の由来も紹介されており、Lodashのような短い名前かつGoパッケージで使われていないことが挙げられていま

元記事を表示

Goの脆弱性診断を定期実行したい(govulncheck-action)

# はじめに
Goプロジェクトのセキュリティを確保するために、定期的な脆弱性診断は必須ですよね。

Goの脆弱性診断を定期実行する仕組みを構築すれば、開発スピードを落とすことなくセキュリティ対策を強化できます。

今回は、[govulncheck-action](https://github.com/marketplace/actions/golang-govulncheck-action)を使って、Goの脆弱性診断を継続的に実行する方法について紹介します。

# GitHub Actionsのワークフロー作成
以下のyamlを.github/workflows配下に追加します。
“`.github/workflows/go_vluncheck_sample.yaml
name: Go Vulnerability Check
on:
# ここで定期実行のための設定をしています
schedule:
– cron: ‘0 23 * * *’ # UTC表記。毎日8時(JST)に実行
jobs:
go_vulncheck:
runs-on: ubuntu-20.04

元記事を表示

Goの正規表現処理をstringsパッケージで代替してBenchmarkを測ってみる

Goの正規表現を標準の [regexp](https://pkg.go.dev/regexp) パッケージで処理すると遅い、という話をしばしば聞きます。
これは [こちらの記事](https://qiita.com/momotaro98/items/09d0f968d44c7027450d) などで紹介されているように、Goの正規表現で採用しているアルゴリズム(Thompson NFA)の都合上、他のアルゴリズムを採用している言語と比較した時、苦手なケースでは遅くなる、というのが実態のようです。

実際のパフォーマンスは、ユースケースに合わせたBenchmarkテストを書いて測りつつ、他の手法と比較してみるのが良さそうです。
今回は、Go標準の [strings](https://pkg.go.dev/strings) パッケージを使ってどの程度代替できるのか、速くなるのか、いくつかのパターンでBenchmarkを測ってみました。

## 実行環境
go version go1.22.5 darwin/arm64

## 前提
Benchmarkの試行回数は少ないので、計測結果に多

元記事を表示

【Go言語】n進数

## はじめに

“`go
func main() {
sum := 100 + 020
fmt.Println(sum)
}
“`

これを実行すると、**120**ではなく、 **116** が出力されます。
Goでは、0から始まる数字は8進数とみなされます。

:::note info
ちなみに余談ですが、javascriptはもっと奇妙な動作をします。気になる方は
[【超難問】絶対に解けないJavaScriptクイズ8選](https://qiita.com/twrcd1227/items/a64c3f22da46ff2c0fbd)
:::

## 2進数(バイナリ)

`0b`、`0B`のprefixつける。(e.g. 0b1010)

以下はビット演算の例。

“`go
func main() {
var a uint8 = 0b1010
var b uint8 = 0b0110

fmt.Printf(“a AND b = %08b\n”, a & b)
fmt.Printf(“a OR b = %08b\n”, a | b)

元記事を表示

【Go言語】Go100Tips1~4をまとめてみた

# はじめに

Go 100 Tipsの 1〜4 をまとめました。

スライドもあります。

また、Tip.3に関しては、別の記事にしました。

https://qiita.com/twrcd1227/items/6e7079d16fd27a7c7d6e

# シャドーイング

シャドーイングとは、異なるスコープで同じ名前の変数が使用されたときに、異なる変数として扱われること。ちなみに、同じスコープ内だと再宣言となり、コンパイラエラーとなります。

“`go
func main() {
n := 1
if true {
n := 999 // シャドウイングされる
fmt.Println(n) // 999
}
fmt.Println(n) // 1
}
“`

`:=`ではなく、代入演算子`=`を使うとシャドウイングされません。

“`go
var n int
func main() {
n := 1
if true {

元記事を表示

Goのヒープとスタックについて

# Goのヒープとスタックについて

## はじめに
Go言語では、メモリ管理が自動的に行われ、プログラマが直接メモリを管理する必要はありません。しかし、ヒープとスタックの違いを理解することは、効率的なプログラムを書くために重要です。この記事では、Goのヒープとスタックについて説明し、それぞれの特徴、利点、注意点について解説します。

## 目次
1. [ヒープとは](#ヒープとは)
2. [スタックとは](#スタックとは)
3. [ヒープとスタックの違い](#ヒープとスタックの違い)
4. [Goにおけるメモリ管理](#goにおけるメモリ管理)
5. [ヒープとスタックの使い分け](#ヒープとスタックの使い分け)
6. [まとめ](#まとめ)

## ヒープとは
ヒープは、動的にメモリを割り当てるための領域です。ヒープに割り当てられたメモリは、プログラムの実行中に動的に確保され、必要がなくなるまで保持されます。ヒープメモリは、ガベージコレクタによって自動的に解放されます。

### 特徴
– **動的メモリ割り当て**: 実行時に必要なメモリを動的に確保します。
– **長寿命**:

元記事を表示

【Go】サーバーを立ててみる

今読んでいる技術書の内容で大事だと思った部分を少しずつまとめていきたいと思います。

今回読んでいる本はこちら
__Goプログラミング実践入門__

この書籍では、フレームワークに頼らず標準ライブラリでweb開発をすることができます。
個人的にフレームワークはブラックボックスが多すぎて面倒であまり好きではない派なので、これを理解できることで理解が深まるのではないかと考え購入しました。

:::note info
この本ではプログラミング言語Goとその標準のライブラリだけを使って、
ゼロからWebアプリケーションを開発するのに必要な事柄を解説します。

ほかのライブラリやその他のトピック(Webアプリケーションのテストやデプロイなど)について解説するページもありますが、Go言語の標準ライブラリのみを用いたWeb開発を解説することがこの本の主目的です。
:::

本記事では、3章で重要だと思った考えや理解しづらかった箇所を説明しています。

# HTTPでサーバーを立てる
まず、3章では以下のように書かれています。

:::note info
net/httpライブラリはhttpサーバー

元記事を表示

【Go】既存のメソッドを追加、変更する方法(Decoratorパターン)

# はじめに
* Decoraterパターンは、オブジェクトの振る舞いを追加 / 変更するための非常に強力なデザインパターンです
* Goには直接的なサポートはありませんが、インターフェースと関数を使うことで、このパターンを実装することができます
* 本記事では、GoでDecoratorパターンを実装する手法の非常にシンプルな例として、メソッドの出力前後に固定のメッセージを追加するデコレータを紹介します

# 対象読者
* Goの関数、メソッド、インターフェースの基礎を理解されている方

# Decoratorパターンとは
* GoFによって定義されたデザインパターンの一つです
* 既存のメソッドを変更せずに、オブジェクトの振る舞いを追加 / 変更することが可能です

https://www.techscore.com/tech/DesignPattern/Decorator

# ステップ1:インターフェース定義
以下のようなPrinterインターフェースと、それを実装するMyPrinter型を定義します。
“`main.go
package main

import “fmt”

元記事を表示

ざっくりGoのチャネルについて

# Goのチャネルについて

## はじめに
Go言語のチャネル(Channel)は、Goroutine間でデータをやり取りするための強力な機能です。チャネルを使用することで、Goroutine間の通信と同期を簡単に実装することができます。この記事では、チャネルの基本的な概念、使い方、利点、注意点について説明します。

## 目次
1. [チャネルとは](#チャネルとは)
2. [チャネルの使い方](#チャネルの使い方)
3. [チャネルの利点](#チャネルの利点)
4. [チャネルの注意点](#チャネルの注意点)
5. [まとめ](#まとめ)

## チャネルとは
チャネルは、Goroutine間でデータを送受信するためのデータ構造です。チャネルは型付きであり、特定のデータ型のみを送受信することができます。チャネルを使用することで、Goroutine間の通信と同期を簡単に実装することができます。

## チャネルの使い方
チャネルの基本的な使い方を以下に示します。

### チャネルの作成
チャネルは `make` 関数を使用して作成します。
“` go
ch := make(ch

元記事を表示

Go + クリーンアーキテクチャにおけるエラーハンドリング戦略

# はじめに
こんにちは!mizukoです!
先日[PaPut](https://paput.io)という個人開発のサービスをβ版としてリリースしました!

その際、今後の個人開発ライフのために基盤作りを行ったのですが、
エラーハンドリングの戦略も検討したので、アウトプットしていきたいと思います!

PaPutについてはぜひ[こちら](https://qiita.com/mizuko_dev/items/5335f93bb3c93f407796)をご覧いただけますと幸いです🤗

# 前提
– プロジェクトはクリーンアーキテクチャの構成
(本記事で紹介するエラーハンドリング方法はどの様な構成でも使えると思いますが、私自身がこの構成でしか運用したことが無いのため、クリーンアーキテクチャを前提とさせていただいています。)

# 戦略
独自のエラーハンドリングにならないよう、シンプルに以下戦略で進めます…!
– errorの管理はプロジェクトルートにerrors/errors.goを作成し、一元管理する
– 全てerror型で扱い、error型をラップして新しい構造体を作るなどは行わな

元記事を表示

CEL(Common Expression Language)でGo言語の構造体を処理

式言語 [CEL(Common Expression Language)](https://github.com/google/cel-spec) の Go 言語用ライブラリとして [cel-go](https://github.com/google/cel-go) があります。

[cel-go](https://github.com/google/cel-go) では、一般的なプリミティブ型に加えて list, map, JSON, Protocol Buffers の型に対応していますが、ソースコードを見る限り Go の構造体も処理できそうだったので試してみました。

# はじめに

基本的に、cel-go は以下の流れで実装します。

1. Environment のセットアップ
* NewEnv の実行
2. CEL式のパースとチェック
* Compile の実行
* Program の実行
3. 評価
* Eval の実行

“`NewEnv“` で使用する変数や追加の型を定義し、CEL式を “`Compile“` と “`Prog

元記事を表示

ざっくりgoroutine

# Goroutineの説明

## はじめに
Goroutineは、Go言語における軽量な並行処理の単位です。Goroutineを使用することで、効率的に並行処理を実装することができます。この記事では、Goroutineの基本的な概念、使い方、利点、注意点について説明します。

## 目次
1. [Goroutineとは](#goroutineとは)
2. [Goroutineの使い方](#goroutineの使い方)
3. [Goroutineの利点](#goroutineの利点)
4. [Goroutineの注意点](#goroutineの注意点)
5. [まとめ](#まとめ)

## Goroutineとは
Goroutineは、Go言語における並行処理のための軽量なスレッドのようなものです。Goroutineは非常に軽量であり、数千から数百万のGoroutineを同時に実行することができます。Goroutineは、Goランタイムによって管理され、必要に応じてスケジューリングされます。

## Goroutineの使い方
Goroutineを使用するには、関数呼び出しの前に `

元記事を表示

【Go言語】モックを利用したテスト

# はじめに

Goのモックの仕方を学ぶために、以下2つの方法を試していきたいと思います。

* [ライブラリを使わないモック](#ライブラリを使わないモック)
* [gomockを使用したモック](#gomock)

# テスト対象

今回は、以下の**foo.go**の`Fly()`のテストを実装していきたいと思います。

“`foo.go
type FourDimensionalPocket interface {
GetTakecopter() (string, error)
GetDokodemodoa() (string, error)
}

type Doraemon struct {
}

func (d Doraemon) GetTakecopter() (string, error) {
return “タケコプター🚁”, nil
}

func (d Doraemon) GetDokodemodoa() (string, error) {
return “どこでもドア🚪”, nil
}

func NewDoraemon() Doraemon {
re

元記事を表示

GoのCobraを使ってCLIを作ってみた

## はじめに
[前回](https://qiita.com/engineer_tacky/items/bbb2d740a6dc0da3a5ab)、flagパッケージを使ってCLIを作ってみたので、今回はCobraライブラリを使用してCLIを作ってみました。

## コード
ルートのコマンドとして、toolkitという名前のコマンドを作成しています。
そのサブコマンドとして、countとlinesを作りました。
Useフィールドにコマンド名、Runフィールドに実行する関数を登録します。
そして、それぞれFlags().StringP()で引数を定義します。
定義できたら、最後にAddCommand()で登録します。

“`main.go
package main

import (
“bufio”
“fmt”
“os”
“strings”

“github.com/spf13/cobra”
)

func main() {
var rootCmd = &cobra.Command{Use: “toolkit”}

var countCmd = &cobra.Comman

元記事を表示

OTHERカテゴリの最新記事