- 1. Goを基本からまとめてみた【基礎】
- 2. Go-for文で繰り返し処理
- 3. dockerでGoファイルを実行する方法
- 4. Go入門 : Go(Gin)で簡単にWebサーバーを作ってみる
- 5. 【Go言語学習】チャネルとミューテックス
- 6. Goで2進数の0,1の数を数えたい
- 7. 【Go言語学習】チャネル( Channel )
- 8. 【Golang】日付型を扱う時はsql-driverのparseTimeをTrueにしよう
- 9. 【Golang, PHP】PDFスライド画像変換&S3保存処理のパフォーマンス改善
- 10. Go未経験のバックエンドエンジニアがGoらしさに触れる(命名規則編)
- 11. 初心者視点で読むGoチュートリアル
- 12. 【Go言語学習】goroutine (ゴルーチン)
- 13. Golang+Echo+Postgresのコンテナ開発環境をDockerfileとdocker-compose.ymlを使って構築しよう!
- 14. 【Go言語学習】txtファイルをgoファイルへ変換
- 15. ttrpc tutorial – 1 –
- 16. RailsエンジニアがGolangでアプリ開発してみた
- 17. Go言語でMYSQLからデータを取得する手順
- 18. GoとJenkinsをWindows11にインストール
- 19. Golangでtorを使う
- 20. Golang 基礎 – 環境設定からプロジェクト管理まで
Goを基本からまとめてみた【基礎】
## Goをインストールする
① goenvのインストールと.goenvができているか確認
“`
git clone https://github.com/go-nv/goenv.git ~/.goenv
ls -a
“`
② GOENV_ROOTの設定“`
vim .zshenv
echo ‘export GOENV_ROOT=”$HOME/.goenv”
echo ‘export PATH=”$GOENV_ROOT/bin:$PATH”
eval “$(goenv init -)”
echo ‘export PATH=”$GOROOT/bin:$PATH”
echo ‘export PATH=”$PATH:$GOPATH/bin”※Press i to enter insert mode.
※Press Enter to add a new blank line.
※Press Esc to return to normal mode.
※Type :wq to save and exit.goenv install
“`## 参考サイト
[【Go言
Go-for文で繰り返し処理
# Go言語のFor文の基本構文、実例を紹介します!
### for文の基本構文
以下がfor文の基本構文となります
“`go:sample.go
for 初期値 ; 条件 ; 後処理 {
}
“`
補足
:point_up:初期値はforループのスコープ内でのみ有効
:point_up:条件がtrueの間にforループが行われる
:point_up:後処理はイテレーション毎の最後に実行されます以下にコード例を示します
“`go:sample.go
package mainimport “fmt”
func main(){
for i := 0 ; i <= 5 ; i++ { fmt.Println(i) } } /* 出力 0 1 2 3 4 5 */ ``` ちなみに、初期値と後処理は任意となっています。 ```go:sample.go package main import "fmt" func main(){ i := 0 for i <= 5 { fmt.Print(i)
dockerでGoファイルを実行する方法
### コンテナ内に入る
“`bash
docker exec -it hogehoge /bin/bash
“`
※`hogehoge`はコンテナ名#### 結果
“`bash
root@123456789:/app#
“`
※`123456789`はコンテナID—
### Goファイルを実行
実行したいファイルが格納されているディレクトリに移動し、以下を実行
“`bash
go run hogehoge.go
“`
Go入門 : Go(Gin)で簡単にWebサーバーを作ってみる
# はじめに
Go言語でWebサーバーを立てる方法について、学習のメモとしてまとめていきます。
・version : go 1.22.2
# Webサーバーを実装
まず初めに、下記のコマンドでmoduleの初期化を行います。
“`
go mod init モジュール名
“`go.modファイルが作成されます。
次に、下記のコマンドで`main.go`のファイルを作成します。
“`
touch main.go
“`最初に、`Hello Golang!!` を出力するcodeを`main.go`に記述してみましょう。
“`main.go
package mainimport “fmt”
func main() {
fmt.Println(“Hello Golang!!”)
}
“`記述後、下記のコマンドで `Hello Golang!!` が出力されるか確認しましょう。
“`
go run main.go
“`
`Hello Golang!!` が出力されればOKです。# Ginを導入する
下記の公式Docsを参考に、G
【Go言語学習】チャネルとミューテックス
# チャネル
ゴルーチン間でデータを安全にやり取りするための手段。
データの送受信が同期的に行われるため、データ競合を防ぐことができる。
チャネルはゴルーチンの同期にも使用でき、一つのゴルーチンが結果を計算し、その結果を別のゴルーチンに送信するといった場合に便利である。
→同期処理# ミューテックス
一つのゴルーチンだけが特定のリソース(例えば、共有データ構造)にアクセスできるようにするための手段。
複数のゴルーチンが同時に同じリソースにアクセスしようとしたときのデータ競合を防ぐために使用される。
→排他制御https://github.com/kabasunny/GoPractice/tree/main/channels
“`Go
package mainimport (
“fmt”
“sync”
“time”
)type SafeCounter struct {
v map[string]int
mux sync.Mutex
}func (c *SafeCounter) Inc(key string, ch chan int) {
c.mux
Goで2進数の0,1の数を数えたい
## 結論
`math/bits`パッケージの
– TrailingZeros()
– LeadingZeros()
– OnesCount()を使うと簡単に分かります。
https://pkg.go.dev/math/bits#LeadingZeros
## 背景
競技プログラミングで、2進数の末尾の0の数を求める問題を解いた際に
便利な公式パッケージがありましたので紹介します。## どう使うの?
“`go
var n uint16 = 16 // 10000(2進数)// お尻から0がいくつ続くか
fmt.Println(bits.TrailingZeros16(n))
// 頭から0がいくつ続くか
fmt.Println(bits.LeadingZeros16(n)) // 0000 0000 0001 0000(2進数)
// ビットが1の数を求めたい場合
fmt.Println(bits.OnesCount16(n))
“`
uint型のbit数に応じて関数名が変わります。
(uint型の場合、bits.Tr
【Go言語学習】チャネル( Channel )
# A Tour of Goでの説明
Channels
チャネル( Channel )型は、チャネルオペレータの <- を用いて値の送受信ができる通り道です。 https://go-tour-jp.appspot.com/concurrency/2 # ゴルーチン間で値のやり取り ゴルーチンは非同期だけど、チャネルを使って同期させる。 情報処理検定で出てくる、キュー(先入れ先出し、FIFO)の動作。最初にチャネルに送信したデータが最初に受信される。スタック(後入れ先出し、LIFO)ではないイメージ。 mainゴルーチンの最後にチャネル受信を用意しておくと、全終了を待たせることができる。 # デットロック チャネルへの送信操作は、そのデータが受信されるまでゴルーチンをブロックするため、同じゴルーチン内でチャネルの送受信を行うとデッドロックが発生する。→バッファ付きチャネルを使用すれば解消する。 # 試してみた ```go package main import ( "fmt" "time" ) func main() { ch1 := make(chan int)
【Golang】日付型を扱う時はsql-driverのparseTimeをTrueにしよう
## はじめに
タイトルの通り、Goでデータベースを使用する際にDSN(Data Source Name)のオプションを適切に設定していなかったため詰まったためメモとして残します。
sql-driverはmysqlを使用しています。## 結論
Date型を扱う時はparseTimeをTrueにしよう(誰でも知ってるかも笑)## 理由
Todoテーブルからsqlxのselectメソッドでデータを取得した時のこと
“`go
err := db.Select(&todos, “SELECT id,task,due_date, status,created_at,updated_at FROM todos”)
“`
sqlxのselectメソッドは構造体のフィールド名、もしくはタグ名と一致していれば自動的にマッピングしてくれます。“`go
type Todo struct {
Id int `json:”id” db:”id”`
Task string `json:”task” db:”task”`
DueDate tim
【Golang, PHP】PDFスライド画像変換&S3保存処理のパフォーマンス改善
大学の学部四年生でエンジニアをしている者です。
普段は業務委託でバックエンド開発をメインに行っています。
今回はPHPのプロダクト内で起きていた問題解消にGolangの機能(Go routine, channel)を使用して解消をしました。
その概要をまとめます。
コード自体はプロダクトに反映してしまったので載せるのは控えます。## プロダクト使用技術
– AWS EC2 (t3.medium)
– AWS S3
– PHP (Laravel)
– poppler-utils (pdftoppmコマンド) ⇒ PDFの画像変換処理で使用
– Golang ⇒ 改善のために使用## 開発機能詳細
ピッチ資料を生成する機能です。
https://www.hear.co.jp/recruit/saiyoupitch-100sen
機能の内部処理の流れとしては以下の通りです。(AS IS)
1️⃣ **ユーザーはPDFファイルをアップロード**
2️⃣ **アップロードされたファイルをローカルのディスクに一時保存**
3️⃣ **ローカルディスクに保存されているPDFスライドを画
Go未経験のバックエンドエンジニアがGoらしさに触れる(命名規則編)
## Go言語文化圏に踏み出す前に
Go言語ですが、「ただ一つのことをうまくやる(Do one thing and do it well)」という思想がある言語です。
つまり、かなり設計思想や原則を守った開発を求められることになります。
もし、Go言語文化圏について学ばずにGo言語のソフトウェアに足を踏み出してしまうとGo言語文化圏では厳しく罰せられるかもしれません。もし、Go言語の原則を知らないまま開発を進めてしまうと、待っているのはチームや自分自身の疲弊、保守性の悪いセンスのないソフトウェア、のような地獄になるかもしれません。
そんな地獄には足を踏み入れたくない。そんな私がGo言語文化圏について学んだことをシェアしようと思います。
## 対象の読者
– Go言語知らないけど、どんな特徴があるかは抑えたい人
– Go言語をこれから勉強しようと思っている人、初学者## この記事のゴール
– Go言語の命名規則をざっくりと把握する
– Go言語書いたことがなくても、「Go言語って、〜なところがある言語だよね」とドヤ顔で雑談ができる## 参考書籍
– [実用Go言
初心者視点で読むGoチュートリアル
## はじめに
個人開発でバックエンドにGoを使いたかったので、Goの勉強を始めました。
疑問をその都度解決していく勉強法なため、横道にそれまくりますが、Goを勉強し始目た時に同じ壁にぶつかった人の助けになればと思っております。コードは[本家様](https://go.dev/doc/tutorial/z)をご参照ください。## Goとは
Goとは、Googleがサポートするオープンソースのプログラミング言語です。
## 環境構築編
早速環境構築を始めます。
まず、[Go公式](https://go.dev/dl/)からGoのインストーラーをダウンロードします。[homebrew](https://brew.sh/ja/)を使わないのは`brew upgrade`で意図せずバージョンアップさせそうだからです。
インスターラーでのインストールが完了したら、[.zshrc](https://qiita.com/siakio/items/f9ab8a02d7b7fa6963ba)に下記(パス)を記述します。
“`
export PATH=$PATH:/usr/local/
【Go言語学習】goroutine (ゴルーチン)
# A Tour of Goでの説明
Goroutines
goroutine (ゴルーチン)は、Goのランタイムに管理される軽量なスレッドです…
https://go-tour-jp.appspot.com/concurrency/1# ザックリとした現状の理解
Goにおける並行処理の機能で、軽量、非同期的に複数のスレッドを容易に実行できる。
共有メモリへのアクセスは同期する必要がある。# 動作の現状の理解
main()が終了すると、ゴルーチンも終了する。
論理的なスレッドであるものの、並行処理(Concurrency)と並列処理(Parallelism)の概念がある様で、裏っ側ではCPUにも依存する部分もある模様。
非常に軽量で何百万ものスレッドを同時に使える。# ゴルーチン指向
https://github.com/kabasunny/GoPractice/tree/develop/goroutines
“`Go
package mainimport (
“fmt”
“sync”
“time”
)func say(s string, wg *syn
Golang+Echo+Postgresのコンテナ開発環境をDockerfileとdocker-compose.ymlを使って構築しよう!
## 概要
GolangのWebフレームワークであるEchoとPostgresのコンテナ開発環境を構築する方法について解説します## 前提
– Golangをインストール済み
– ホットリロードの際にAirを使用します## ディレクトリ構成
“`
├── .gitignore
├── application
│ ├── .air.toml
│ ├── go.mod
│ ├── go.sum
│ ├── main.go
├── containers
│ ├── go
│ │ └── Dockerfile
│ └── postgres
│ └── Dockerfile
└── docker-compose.yml
“`## 初期設定
applicationフォルダへ移行し、`go mod init`コマンドで初期設定を行います
“`
cd application
go mod init github.com/username/app_name
“`その後、echoをインストールします
“`
go get github.c
【Go言語学習】txtファイルをgoファイルへ変換
「エキスパートたちのGo言語」という書籍を購入し(2022年1月12日)、勉強をし出したところ(2024年5月1日)、サンプルコードがありダウンロードした。https://gihyo.jp/book/2022/978-4-297-12519-6/support
サンプルコードは、txtファイルであった。## txtファイルをgoファイルへ
せっかくならgoファイルに変換し、エディターを使っていじったり動かしたりしたかったので、取り急ぎ全ファイルを変換することに。
しかし、txtファイルのエンコードがまちまちで、そのまま変換すると文字化けするので、良い方法を探したが、結論から言うと見つからなかった。
一応、何をしたか備忘録をとることに。## やったこと
pythonで、各txtファイルからエンコーディングの種類を読み込み、各txtファイルを各エンコーディングで開き、UTF-8でエンコーディングし閉じる
Go言語で、ファイルの拡張子を txt → go へ変換
結果、Windows-1254 は UTF-8 にうまくエンコードできず、文字化けした## コード
https://
ttrpc tutorial – 1 –
# ttrpc
## 問題
無駄なリソースをさらに削減できる点では活用したいですが、公式のマニュアルなどが揃ってない、個人的にはわかりにくいサンプルコードから少しハードルを感じているかと思いました。実際やってみたところ想定以上時間がかかったため、手順など残しておきたいと考えてます。## ゴール
ttrpcのサンプルコードを変形してわかりやすく+すぐ動くようにチュートリアルを作りました。
動作確認と使っているライブラリなど確認できればと思います。## 開発環境・ライブラリ
go 1.21.0
github.com/containerd/ttrpc v1.2.3## ttrpcのprotoファイル生成(プラグイン)
`protoc-gen-go`と`protoc-gen-go-grpc`はインストール前提とします。
下記のコマンドから`rrtpc`生成のためのプラグインをインストールします。`go install github.com/containerd/ttrpc/cmd/protoc-gen-go-ttrpc@v1.2.3`
`go install github.c
RailsエンジニアがGolangでアプリ開発してみた
# 背景
今までRubyとRailsで開発をしていましたが、アプリ開発の解像度をあげるためにGolangでのアプリケーション開発を始めました。
RailsではMVCアーキテクチャにのっとりフロントでerbを使用する開発をしていましたが、Golangではアーキテクチャの設計からフロントエンドとAPI通信するプロダクトの開発も行いました。
この記事ではRubyを書いたことがあり、これからGolang開発の始める人へ、一つの踏み台として受け取ってもらえれば幸いです。# 目次
1. RubyとGolangの違い
1. 動的言語と静的言語
1. コンパイル型言語とインタプリタ型言語
1. フレームワーク
1. Golangの基本文法
1. ポインタ渡し
1. 多値返却
1. 配列とリスト# RubyとGolangの違い
### 1. 動的言語と静的言語
> **動的言語**: 実行時に変数の型を決定し、実行時に型チェックを行います。変数の型は実行時に決まるため、柔軟性が高いです。例えば、PythonやRubyは動的言語です。
**静的言語*
Go言語でMYSQLからデータを取得する手順
最も簡易的なやり方で、GO言語使用時にMYSQLかららデータを取得する手順はメモしておく
# 事前準備
・XAMPPをインストールして、ローカル環境でMYSQLを立ち上げ、『User』というテーブルを作成しておく
※カラムは『Name(名前)』『Age(年齢)』『Sex(性別)』『Deleted_flag(削除フラグ)』とかにしておく・go(バージョンは1.22.2)をインストールしておく
# ファイル構成
sampleapp/
├ go.mod
├ main.go
※go.modは下記コマンドで生成できる
“`
$ go mod init sampleapp(任意の文字列)
“`# 実行手順
以下のコマンドを実行して、mysql driverをインストールする
※go.modファイルがないとコマンド実行時にエラーになった
“`
$ go get -u github.com/go-sql-driver/mysqlgo: added filippo.io/edwards25519 v1.1.0
go: added github.com/go-sql-dri
GoとJenkinsをWindows11にインストール
# 概要
今回はGoとJenkinsをWindows11にインストールしたので、
その参考記事を取り上げることにしました。
なお、メモ書き程度に記載していますので、ご了承ください。随時、情報を追加していきます。# 実行環境
・windows:Windows11Pro 23H2# 参考記事【Go】
以下を参考にしました。
go.modファイルを作成していなかったので、
以下のエラーが発生しました。
その際参考にした記事も載せます。
“`
go: go.mod file not found in current directory or any parent directory
“`https://qiita.com/mochico_chicken/items/a37441813dc63dd87464
https://qiita.com/to3izo/items/f47bbc7b11ef6d2e24cd
# 参考記事【Jenkins】
以下を参考にしました。
なお、Jenkinsをダウンロードする前に、Javaをダウンロードしておく必要があります。
※必要とされるJav
Golangでtorを使う
## Torとは
Torは、`the onion router`の略称で、インターネット上での通信の匿名性を保つためのネットワークシステムであり、情報が玉ねぎのように多層構造になっており包まれて転送することから来ています。ダークウェブのイメージが強いですが、本来はユーザーのプライバシーを保護し、追跡や監視から逃れるための重要なツールです。
特徴としては以下のような特徴を持っています。
– 匿名性
ユーザーがwebサイトを訪問した際に、そのサイトがユーザーのIPアドレスを直接的に知ることができません。
– 分散ネットワーク
世界中に分散されたサーバー(ノード)から成るネットワークで、データがこれらのノードをランダムに経由して転送されるので、データの送受信元を特定することが難しくなります。(ただし、出入口のノードは通信内容を見ることが可能であるため、完全に特定できないわけではないです)
– E2E暗号化
データを複数の暗号化層で包み、各ノードで一層ずつ解読されるために、すべてのノードがデータの全体を見ることがなく、これによってデータの内容を保護しています。
– アクセ
Golang 基礎 – 環境設定からプロジェクト管理まで
### Golangのインストールと環境設定
Golang(通称Go)は、効率的なコンパイル言語で、並行処理やネットワークサービスの開発に適しています。まず、[Golangの公式サイト](https://golang.org/dl/)から対応するOSに合わせてインストーラをダウンロードし、インストールします。インストール後は、コマンドラインで`go version`を実行して、インストールが正しく完了したか確認しましょう。
Macユーザーの場合、Goのバイナリへのパスをシェルの設定ファイルに追加する必要があります:
“`bash
echo ‘export PATH=$PATH:/usr/local/go/bin’ >> ~/.bash_profile
echo ‘export PATH=$PATH:/usr/local/go/bin’ >> ~/.zshrc
“`### プロジェクトの初期設定
プロジェクトディレクトリを作成し、そこでGoのモジュールを初期化します:
“`bash
mkdir go-test
cd go-test
go mod init go-te