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

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

[golang]プライベート関数の定義方法

## これはなに
この記事では、Goにおけるパッケージ内でプライベートな関数を定義する方法について説明します。Go言語では、関数名を小文字で始めることで、その関数をプライベートにし、パッケージの外部からのアクセスを防ぐことができます。これにより、パッケージ内部の実装を隠蔽し、安全性やカプセル化を高めることができます。

## 対象読者
– Go言語を使ってプログラムを開発しているエンジニア
– Goでの関数の可視性について学びたい初心者
– パッケージ設計やセキュリティに興味があるプログラマ

## ゴール
– Goにおけるプライベート関数の定義方法を理解する
– プライベート関数とパブリック関数の違いを明確にする
– パッケージ内での関数のアクセス制御の方法を学ぶ

## TL;DR
– 関数名を小文字で始めると、Goではその関数がプライベートになり、パッケージ外からはアクセスできなくなります
– 関数名を大文字で始めると、その関数はパッケージ外からもアクセス可能なパブリック関数になります

## プライベート関数の定義方法

### プライベートな関数の定義
プライベートな関数は、

元記事を表示

[golang]初期化関数initについて

## これはなに
この記事では、Goにおける`init`関数の役割と、`init`と`Init`の違いについて説明します。Go言語で開発をしている際に、`init`関数が自動的に実行される仕組みを理解し、どのように使うべきかを知ることで、より効率的に初期化処理を行えるようになります。

## 対象読者
– Go言語を使ってプログラムを開発しているエンジニア
– Goの`init`関数について学びたい初心者
– 効率的な初期化処理の方法を知りたいプログラマ

## ゴール
– Goにおける`init`関数の役割を理解する
– `init`関数と他の関数(特に`Init`)の違いを明確にする
– 適切な初期化処理の方法を学ぶ

## TL;DR
– `init`関数はGoで特別な意味を持ち、パッケージがインポートされたときに自動的に実行される初期化関数です。プログラマが直接呼び出すことはできません
– `init`関数はパッケージレベルの変数の初期化、設定ファイルの読み込み、リソースの準備などに利用されます
– 同じパッケージ内に複数の`init`関数がある場合、それらはファイルの出現順序

元記事を表示

Go言語(Golang)のスライス、マップ まとめ

### スライスの概要

スライスは、Go言語における動的な配列を扱うデータ構造です。スライスは固定長の配列と異なり、要素の追加や削除が可能で、サイズを動的に変更できます。スライスは配列への参照として実装されているため、配列の一部を取り扱うこともできます。

### スライスの宣言と初期化

スライスの宣言と初期化の方法は以下の通りです。

“`go
package main

import “fmt”

func main() {
// 空のスライスを宣言
var s1 []int
fmt.Println(s1) // []

// リテラルでスライスを初期化
s2 := []int{1, 2, 3}
fmt.Println(s2) // [1, 2, 3]

// make関数でスライスを作成
s3 := make([]int, 5) // 長さ5のスライスを作成
fmt.Println(s3) // [0 0 0 0 0]
}
“`

### スライスの操作

スライスに対する基本的な操作を以下に示します

元記事を表示

Go言語(Golang) ポインター まとめ

### ポインターの役割

1. **メモリの効率的な操作**:
ポインターを使用することで、大きなデータ構造をコピーする代わりに、そのデータ構造のメモリアドレスをコピーするだけで済みます。これにより、メモリ使用量と処理速度の面で効率が向上します。

2. **参照渡し**:
関数に引数を渡す際に、値渡しではなく参照渡しを行うことができます。これにより、関数内で元の変数の値を直接変更することが可能になります。

3. **動的メモリアロケーション**:
ポインターを使用することで、動的にメモリを割り当てたり解放したりすることができます。Goでは、`new`や`make`を使用して動的にメモリを割り当てることができます。

### ポインターの基本的な使い方

#### ポインターの宣言
ポインターは、`*`を使って宣言します。例えば、`*int`は`int`型のポインターです。
“`go
var p *int
“`

#### ポインターの初期化
変数のアドレスを取得するには、`&`演算子を使用します。
“`go
var i int = 42
p = &i

元記事を表示

もしPHPが使われなくなったら、どのバックエンド言語を選ぶか?

私はベテランのバックエンド開発者として、PHPは私のキャリアにおいて重要な役割を果たしてきました。しかし、技術の世界は日々変化しており、常に新しい挑戦に備える必要があります。では、もしPHPが今日突然消滅したら、どのバックエンド言語を選ぶでしょうか?以下が私の鋭い見解です。

## 1. Golang

まず、私は間違いなくGolang(Go言語)を選びます。なぜなら、Golangは性能が優れているだけでなく、開発体験も非常に良いからです。PHPと比べて、Golangの並行処理能力はまさに雲泥の差です。Golangのコードを書くことは、面倒な設定や終わりのないデバッグがない、楽しい旅のようです。

Golangの標準ライブラリは非常に強力で、ほぼすべての開発ニーズを満たすことができます。また、Golangの”Bring your own”アプローチは、フレームワークに縛られるのが嫌な開発者にとってまさに理想的です。各構造体のために個別のファイルを作成する必要はなく、エラーハンドリングもより直接的で透明です。要するに、Golangはコードそのものに集中できるようにしてくれます。

##

元記事を表示

[Cloud Functions 2nd Gen.] 単一リポジトリで複数関数を管理する [Go]

Cloud Functions(第二世代)のドキュメントを読んでいくと、ソースのディレクトリ構造のサンプルとして以下のような構造が出てきます。

“`
.
├── myfunction.go
├── go.mod
└── cmd/
└── main.go
“`
[Source directory structure](https://cloud.google.com/functions/docs/writing#directory-structure-go) より

ドキュメントに出てくるようなシンプルな例ならこれでも十分かもしれませんが、Cloud Functions の関数も含めてモノレポにまとめて、共通部分を切り出して…などやっていく場合、どういう構成にすれば良いか悩む人も多そうだな、と。

そこで今回、一つの例として実際に実装してみたのでシェアします。

なお、Cloud Functions の前提知識として、[前回の記事](https://qiita.com/yukia3e/items/a629ec51656493544091) もあわせて読んでい

元記事を表示

【Golang】軽量なHTTPサーバのDockerコンテナを作成

Golangの入門書を読んで何か作成してみたいと思い、どうせならGolangが得意とする軽量なコンテナを作成しました。
# ゴール
下記をゴールとしました。
– 次の機能を有する静的コンテンツを公開するHTTPサーバとする
– デフォルトで、ルートパスへのアクセスで hello ページを返す
– バインドマウントでホストの静的Webコンテンツを返す
– 任意の Content-Type を返すことが可能
– x64やarmなどのマルチプラットフォームに対応したコンテナイメージを作成してDocker Hubで公開
# 実装
まずは、Golangのソースです。
“`golang
package main

import (
“encoding/json”
“fmt”
“html”
“io”
“net/http”
“os”
“strings”
)

type Config struct {
ContentTypes map[string]string
}

func getConfig() (config Config, err error) {
jsonFi

元記事を表示

Goモジュールを作成してみた

# 背景・目的
[前回](https://qiita.com/zumax/items/040c3cce24eeb6727679)、Goについて簡単なプログラムを書いてみました。今回はGoモジュールを作成てしみます

# まとめ
下記に特徴をまとめます。

|特徴|説明|
|:–|:–|
|Goモジュールの概要|関連するパッケージをモジュールに収集し、他の開発者が使用できるようにモジュールを公開できる|
|Goモジュール公開の概要|・モジュールに含まれるパッケージを設計しコーディングする

・Go ツールを介して他のユーザーが確実に利用できるようにする規則を使用して、コードをリポジトリにコミットする

・開発者から見つけられるようにモジュールを作成し公開する

・時間の経過とともに、各バージョンの安定性と下位互換性を示すバージョン番号つき規則を使用するバージョンでモジュールを改定する|
| `go.mod`ファイルの概要|モジュールは、ルートディレクトリに`go.mod`という名前のUTF-8でエンコードされたテキストファイルにより定義される|

元記事を表示

Gemini API を Goで使ってみる

無料枠があるので、Gemini API を Goで使ってみる

Gemini API クイックスタートを参考に。

https://ai.google.dev/gemini-api/docs/quickstart?hl=ja&lang=go


# できたもの
プロンプトや画像の読み込みはコード内に直接書き込んでいます。

“`
// プロンプト: ONEPIECEの作者は?
go run main.go
ONE PIECEの作者は **尾田栄一郎** です。
“`

“`
// プロンプト: 2つの画像の違いを教えて
go run main.go
1枚目はルフィ、2枚目はゾロです。
“`

“`
// プロンプト(user): こんにちは、赤い果物は何がありますか?
// プロンプト(model): いちごやりんごがあります。
// プロンプト: その中で小さいのはどちらですか?
go run main.go
いちごはリンゴよりも小さいです。
“`

“`
// プロンプト: モンキー・D・ルフィが食べた悪魔の実について説明して
go run main.go

元記事を表示

Goを試してみた①(環境構築〜Hello Worldまで)

# 背景・目的
最近、Goに触れる機会が増えてきたので、今後、本格的に学んでいこうと思います。
本ページではGoの特徴など基本的なところを整理します。

# まとめ
下記に特徴を整理します。

|特徴|説明|
|:–|:–|
|概要|・Google がサポートするオープンソースプログラミング言語
・学びやすく、チームに最適
・組み込みの同時実行性と堅牢な標準ライブラリ
・パートナー、コミュニティ、ツールによる大規模なエコシステム|
|Goのユースケース|・Cloud & Network Services
・CLI開発
・Web Development

Development Operations & Site Reliability Engineering|
|Cloud & Network ServicesでGoを利用するメリット|・開発サイクル時間の短縮
・サーバパフォーマンスの向上
・サービス開発をサポートする強力なエコシステム
・サービス用のGo APIと、一般的なOSSライブラリを提供している|
|CLI開発でGo

元記事を表示

ダーツを投げればポインタがわかる!?ポインタ入門【いらすとや図解】

# はじめに
A Tour of Goのポインタで理解に時間がかかったのでイラストやを使って解説してみました。
メモリアドレスといった難しいワードを使わないようにしているので比較的わかりやすいかなと思っております。

https://go-tour-jp.appspot.com/moretypes/1

# 今回の実装コード
以下のコードを解説していきます。
16進数の値は状況に応じて変わる可能性があります。
“`darts.go
package main

import “fmt”

func main() {
blueArrow, redArrow := 42, 2701
blueArrowMap := &blueArrow

// blueArrow: 42
fmt.Println(“blueArrow:”, blueArrow)
// &blueArrow: 0xc000104040
fmt.Println(“&blueArrow:”, &blueArrow)
// redArrow: 2701
fmt.Println(“redArrow:”,

元記事を表示

エナジードリンクから学ぶインターフェース

# はじめに

こんにちは、皆さんエナドリ飲んでますか。

「エナジードリンクなんて、カフェインの塊じゃないか」
「そんなもの毎日飲んでたら身体に悪いぞ」
「依存症になるんじゃないのか?」

大丈夫、私はもうカフェイン依存症です☕️

今日は皆さんに、**カフェイン依存症**と**プログラミング**の意外な関係性についてお話しします。

実はこの2つには驚くほど共通点があります。例えば:

– どちらも「適度に」じゃないと危険
– 一度ハマると抜け出すのが難しい
– 周りから「それ、やりすぎじゃない?」と心配される
– 本人は「まだいける!」と思っている

最後に、

**適切に設計しないと、とんでもないことになる**

「依存」と「設計」の深いい関係に、ダイブしていきましょう。

その前に、エナジードリンク補給してきます。

**カシュウッ!!(缶を開ける音)**

# カフェイン依存症

おk、注入しました😊
本題に入っていきましょう。

まず、私が最初にハマったエナジードリンク、そう、**BlueBull**のことから話します。

BlueBullって知ってます?ほら、あの青いパ

元記事を表示

【Go】psqlコマンドを実行し、テストデータを作成する方法

# はじめに
DBに接続したテストを実行する前に、テストデータを作成したいケースに対応する方法を記事にします

# フォルダ構成
こちらの`repositories`フォルダのテストコードを参照ください
https://github.com/AppDeveloperMLLB/todo_app/tree/main/repositories

`repositories/testdata`にテストで実行するsqlファイルを格納しています
テストでsqlファイルを実行するのは`main_test.go`となります

# 実際のコード
実際のコードは、setupTestDataメソッドを参照してください。
(Githubのコードとは、一部、変えています)
“`go
cmd := exec.Command(
“psql”,
“-h”,
“127.0.0.1”,
“-U”,
“test”,
“-d”,
“todo_db”,
“-f”,
“./testdata/createTable.sql”)
cmd.Env = append(os.Environ(), “P

元記事を表示

フロントエンドエンジニアのためのGo入門:変数と関数をサクッと理解しよう!

# はじめに
Goはシンプルで効率的な言語ですが、TypeScript(Javascript)の経験のあるフロントエンドエンジニアが初めて学ぶ際には、いくつかの独特なポイントで戸惑ったので記事にしました。
フロントエンドエンジニアがGoを学ぶ際につまづきやすい点をわかりやすく解説し、それぞれの言語の比較コードを示します。
この記事はA Tour of GoのBasicsの一部をピックアップしました。

https://go-tour-jp.appspot.com/list

# エクスポートされた名前
Goでは、名前が大文字で始まる場合、その名前はパッケージ外から参照できる「エクスポートされた名前」になります。TypeScriptでも同様にエクスポートの概念がありますが、違いは大文字小文字によってエクスポートが決まる点です。
Goでは、大文字で始まる Name フィールドがパッケージ外から参照可能です。一方で、name のように小文字で始まるフィールドはパッケージ内でしか参照できません。

“`sample.ts
export class User {
constructor(p

元記事を表示

Goのマイグレーションツールであるgooseでdockerのmysqlのマイグレーションをする方法

# はじめに
今回はGo言語の学習で、github版のgooseでのマイグレーションをどうすればいいのか調べてもイマイチいい情報がなかったのでメモ感覚で書きます

# 使っている環境
– golang 1.23
– これはmacに直接ダウンロードしました。
– docker
– mysql 8.0.34
– goose

# やりたい事
マイグレーションファイルを作ってgooseでdocker上にあるmysqlに対してマイグレーションを実行させたい

# やったこと
※golangのインストールやdockerでmysqlのコンテナを立ち上げる方法は割愛します(mysqlはmacに直接インストールしても問題ないです)

### gooseのインストール
下記コマンドでgooseをインストールする
“`
go install github.com/pressly/goose/v3/cmd/goose@latest
“`
その後whichコマンドで確認する

:::note warn
この時パスが通ってない場合はパスを通す必要あり
:::

“`
which goos

元記事を表示

初心者向け!fmt.Printfで覚えておきたいフォーマット指定のやり方

## fmt.Printfでよく使われるもの一覧
### 文字列
| verb | 内容 |
|:-:|:-:|
| %s | 文字列|
| %q | エスケープされた文字列 |

#### 例
“`Go
var s1 = “文字列”

fmt.Printf(“%s\n”, s1) // 文字列

s2 := `バッククオートを使った、改行や
タブが入った
文字列`

fmt.Printf(“%s\n”, s2) // そのまま表示
fmt.Printf(“%q\n”, s2) // バッククオートを使った、改行や\n\tタブが入った\n\t\t文字列
“`

### 整数
| verb | 内容 |
|:-:|:-:|
| %d | 整数 |
| %b | 2進数 |
| %o | 8進数 |
| %x | 16進数(小文字のa-f) |
| %X | 16進数(大文字のA-F) |

#### 例
“`Go
var i = 254
fmt.Printf(“%d %b %o %x %X\n”, i, i, i, i, i) // 254 111

元記事を表示

curl: (7) Failed to connect to localhost port 8080 after 0 ms: Couldn’t connect to serverが生じる

挨拶・経緯

こんにちは。初投稿です。
すごく簡単な勘違いで15分ほど時間を費やしてしまったので、同じ問題で詰まってしまった人のためになる記事を書けたらいいな、と思い作成しました。
Goを学んでいる最中、localhost:8080を起動したは良いものの、curlコマンドを使用するタイミングがあったのですが、

curl http://localhost:8080/hello

の実行結果が、

curl: (7) Failed to connect to localhost port 8080 after 0 ms: Couldn’t connect to server

と出てしまっていました。

解決方法

まず私のPCはMacのARM64になります。
GoをVSCodeで書いている時に、上記のエラーが発生しました。
しかし、こちらのnetstatコマンドでポートの状況を確認しました。
一度、ターミナルを開き、

netstat -tlpen | grep 8

元記事を表示

【Go】deferを理解しよう!〜初学者向けガイド〜

# はじめに
本記事では、Go言語の`defer`について、基本的な特徴を3点紹介します!

# deferの特徴
## 1. 関数の実行を遅延させる
deferは、Goのキーワードの一つで、関数の実行を遅延させるために使用されます。具体的には呼び出し元の関数が終了する直前に、指定した関数を実行することができます。これによって、リソースの解放や後処理を簡潔に行うことができます!

例えば、以下のソースコードを見てください:

“`go
package main

import (
“fmt”
)

func main() {
fmt.Println(“A”)
defer fmt.Println(“B”)
fmt.Println(“C”)
}
“`

このコードの実行結果は次のようになります:
“`
A
C
B
“`
deferを使った行は、関数の終わりに実行されるため、`B`が最後に出力されます。

## 2. deferの関数の実行順序はLIFO(後入れ先出し)
複数のdeferを使うとどうなるでしょうか?次のソースコードを見てください:

“`

元記事を表示

Rustアプリケーションの実装効率と性能評価 – C・Go言語実装との比較

![](http://www.cybergarage.org/memo/wp-content/uploads/sites/4/rust-eval-loc-perf.png)

Rustは、安全性と高速性の両立を目的にデザインされた言語[\[1\]](https://doc.rust-lang.org/stable/book/)であり、近年では業務に採用されるプロフェッショナル言語としての、更なる飛躍が期待されています[\[3\]](https://blog.rust-lang.org/2022/02/15/Rust-Survey-2021.html)[\[8\]](https://blog.rust-lang.org/2022/12/05/survey-launch.html)。

ただし、2021年のアンケート結果[\[3\]](https://blog.rust-lang.org/2022/02/15/Rust-Survey-2021.html)でも、仕事での利用率は前年の42%から59%に大きく向上している反面、業界での採用実績面の少なさが、Rustの将来性の最大の懸念(38%)

元記事を表示

Goのgoroutineで並列処理した結果を順番を維持したまま配列(スライス)に格納する

# 注意
掲載したコードを実行したとき,デッドロックが発生する可能性があります.

## 目標
以下の関数`longProcess`の結果をスライスに格納する.
“`go
func longProcess(n int) string {
rndValue := rand.Intn(1000)
sleepTime := time.Millisecond * time.Duration(rndValue)
time.Sleep(sleepTime)
msg := fmt.Sprintf(“%d^2=%d [%dms]”, n, n*n, rndValue)
fmt.Println(msg)
return msg
}
“`
![process.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3644068/18983dc5-53a4-31e3-9130-103c19229d8c.png)

### longProcessの概要
– `longProcess`関数の処理は2乗の値の計算.戻り値とし

元記事を表示

OTHERカテゴリの最新記事