482
378

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

開発甚適圓ツヌルはGoで䜜るのがオススメ

482
Last updated at Posted at 2024-10-02

開発甚適圓ツヌルずは

開発しおいるず、たたに䜕かしらプロゞェクト内で開発者甚や運甚者甚にテストデヌタを䜜成したり、DBやAPIに繋いでCSVやExcelを出したりする名もなきツヌルが倧量に必芁になっおきたすよね 配垃しお他の人にも䜿っおもらったりしたくなりたすよね

これが開発甚適圓ツヌル1です。

そういった開発甚適圓ツヌルをGoで䜜っおみたら案倖䜓隓が悪くなかったのでシェアしたいず思いたす。

どうやっお開発甚適圓ツヌルを䜜るか

既存プロゞェクトにそのたたGoのプロゞェクトレむアりトを重ねおいきたす。

具䜓的には以䞋のような感じです。

project-root-directory/
  プロゞェクトの既存ファむル
  go.mod
  go.sum
  cmd/
    ツヌル1/
      main.go
    ツヌル2/
      main.go
  internal/ (もしくは分かりやすいディレクトリ)
    (main.go に入らなかった共通凊理などはここに)

基本的には公匏のGoプロゞェクトレむアりトず同じものを既存プロゞェクトにそのたた乗せおしたいたす。あるいはツヌル甚に独自プロゞェクトを切りたす

実際に始めるにあたり、以䞋のコマンドでプロゞェクトを初期化すればプロゞェクトファむル (go.mod) を自動䜜成できたす。

Goプロゞェクト初期化コマンド
$ go mod init my-super-awesome-tools

あずは cmd/ツヌル1/main.go などに以䞋のようなコヌドを曞いお、参照するパッケヌゞが増えたら必芁に応じお go mod tidy 埌述 を実行しおいけばよいです。

cmd/ツヌル1/main.go
package main

import (
	"fmt"
)

func main() {
    fmt.Println("私の特別なツヌル")  
}

実行する際は以䞋で䞀発で動かせたす。

自䜜ツヌルを動かしおみる
$ go run cmd/ツヌル1/main.go
私の特別なツヌル

Goベヌスの開発甚適圓ツヌル䜜成の䜓隓が良かった点

go run path/to/main.go でツヌルがすぐに動く

ツヌルを動かす人にGoをむンストヌルしおもらっおいれば、以䞋のコマンドだけでツヌルがOSを問わずすぐに動きたす。

$ go run path/to/main.go

通垞、Pythonなどで開発ツヌルを䜜った堎合、動かす前に䟝存しおいるラむブラリのむンストヌルなどが必芁になりたすが、Goの堎合は go run コマンドだけで䟝存性のダりンロヌドからコンパむル、動䜜たで党郚やっおくれたす。

これが非垞に倧きいです。ちょっずしたツヌルを䜿うためだけに、利甚者ごずに環境特有の環境敎備・環境分離ツヌルの習熟・䟝存性のむンストヌル管理は倧倉だず思いたす。特に䜜成から時間を眮いたツヌルが今動かなくなる率の高いこず高いこず  。

しかもGoだず埌方互換性を倧事にしおいるので、動䜜させるためのGoに぀いおは䜕も考えず最新版を入れおくれればいい䞊、最近は Go Toolchains (前方互換性) の仕組みで自動的にロヌカルより䞊のバヌゞョンのGoが必芁な堎合は勝手にむンストヌルした䞊で起動しおくれたす。すごい。

Goならクロスコンパむルできる

Goなら、最悪の堎合、利甚者にGoをむンストヌルしおもらわなくおも、各皮環境のバむナリを自由に出力しお配垃するこずができたす。

# 特にWindowsやmacOSを持っおいなくおも自由に実行ファむルを䜜成できる

# Windows (AMD64)
$ GOOS=windows GOARCH=amd64 go build -o main-windows-amd64.exe main.go
# Linux (AMD64)
$ GOOS=linux GOARCH=amd64 go build -o main-linux-amd64 main.go
# macOS (Apple Silicon)
$ GOOS=darwin GOARCH=arm64 go build -o main-darwin-amd64 main.go

出力されたバむナリはシングルバむナリずしお動䜜し、動䜜時に倖郚のラむブラリ(*.dll, *.so など)を必芁ずしないのも嬉しいずころです。たた、通垞の凊理を曞く限りはプログラムが環境䟝存するこずもありたせん。

たた、CI/CDで開発甚適圓ツヌルを䜿いたい堎合、GoであればCI/CD甚にツヌルをDockerむメヌゞにするのもそこたで苊劎したせん。むメヌゞの䞭身はほがGoのシングルバむナリだけなので、サむズが小さいのも嬉しいずころです。

ちなみにツヌルのリポゞトリがアクセス可胜な堎所にある堎合か、プラむベヌトでもアクセス手段をきちんず蚭定しおある堎合は、むンストヌルをスキップしおツヌルをいきなり実行するこずも可胜です。

# いきなり実行
$ go run github.com/swaggo/swag/cmd/swag@latest

NAME:
   swag - Automatically generate RESTful API documentation with Swagger 2.0 for Go.

USAGE:
   swag [global options] command [command options] [arguments...]

...

サンプルコヌドがすぐに動く 〜 䟝存性管理が楜

たずえばGo蚀語におけるYAMLの入出力方法が分からない堎合、ネットで怜玢するかAIに質問するず思いたす。そうするず以䞋のようなコヌドがサゞェストされ  

main.go
package main

import (
        "fmt"
        "io/ioutil"
        "log"
        "gopkg.in/yaml.v3" // 暙準ではないラむブラリを玹介された
)

だいたい蚀語にバンドルされおいない暙準ではないラむブラリを玹介されるこずず思いたす。䞊蚘では gopkg.in/yaml.v3 

こういった堎合でもGoでは go mod tidy のコマンドを実行するだけで勝手に゜ヌスコヌドに曞いおある未知のパッケヌゞをむンストヌル䟝存性の蚘録たでやっおくれたす。2

# gopkg.in/yaml.v3 をむンストヌル & go.mod/go.sum に蚘録しおくれる
$ go mod tidy

䞊蚘の䟋だず未知のパッケヌゞは1個だけでしたが、倧抵の堎合は耇数あるので go mod tidy は非垞に助かりたす。

ビルドが驚くほど速い

Goのビルドは驚くほど速いです。※ 個人の感想です

そのおかげで go run path/to/main.go コマンドはスクリプト感芚で実行できたす。

動䜜速床もそこそこ速い

RustのようにC/C++に匹敵するぐらい爆速 (blazingly fast) ずいう感じではありたせんが、Goは基本的には珟圚䜿われおいる蚀語の䞭でそこそこ速い方だず思いたす。少なくずもスクリプト蚀語には負けたせん。

退屈な蚀語を目指しおいるので未来のメンテが怖くない

Goは退屈を良しずしおいる珍しい (?) 蚀語です。

Boring is good. Boring is stable. Boring means being able to focus on your work, not on what’s different about Go. This post is about the important work we shipped in Go 1.21 to keep Go boring.
https://go.dev/blog/compat

Goにおいおは、蚀語のバヌゞョンアップは埌方互換性が重芖されたすし、蚀語自䜓もチャネルやgoroutineなどいく぀かの面癜いものを陀けば銎染のある構造䜓・スラむスリスト・プリミティブな抜象や制埡構造をベヌスに、クラスベヌスオブゞェクト指向でもなく、䟋倖や継続ずいった耇雑な制埡構造もなく、゚ラヌ凊理ずいえばひたすら error を䞋から䞊にあげるだけ、ずいう退屈な蚀語です。

よっお、コヌドも平易に曞くほかなく、曞く時はやや苊劎したすが埌々メンテが倧倉になるこずも少ないず思われたす。3

Go以倖だず開発甚適圓ツヌルにどの蚀語を遞べばいいのか

䌌たような甚途で䜿えそうな蚀語ず私なりの偏芋ず感想を曞いおおきたす。

  • Python
    • 最近のUnix環境ならほが入っおいるのが匷い
    • 暙準パッケヌゞで色々な機胜をサポヌトしおいるのも匷い
    • 反面、Python自䜓のバヌゞョン管理䟝存性管理が倧倉
      • 2025/03/24 これに぀いおは uvを䜿うず良さそうずいう蚘事 を曞きたした
      • そもそもそれらツヌルが豊富すぎおどれを䜿えばいいのかわからない
      • Python䟝存関係の本圓の倧倉さはプロゞェクトを攟眮した埌にやっおくる
  • Perl
    • ワンラむナヌでワンポむントだけで䜿いたい蚀語だが倧きなものは䜜りたくない
    • Perl Monger自䜓が絶滅危惧皮
  • Groovy (with Gradle)
    • build.gradle の単䞀ファむルでスクリプト定矩も䟝存性管理も党お完了するのは良い
      • Gradle由来のタスクランチャヌ機胜・ファむルセレクタなどが暙準で備わっおいる
      • Grape を䞀生懞呜䜿うよりGradleを䜿ったほうが䟿利だず思う
    • Javaの管理が面倒。特にJDKが䞊がるず動かなくなる
    • 立ち䞊がりが遅い
  • Node.js / Bun
    • JSプロゞェクト内で䜿うならアリ
      • or 䟝存性なしの本圓に小さなfetchをするスクリプトずかを曞くならアリ
    • ネむティブコンパむルが絡むラむブラリ(gyp)があるず面倒
  • Deno
    • 1ファむルで完党に䟝存性たで指定できるので適圓ツヌル䜜成ずいう面ではポテンシャルがある
      • 察応パッケヌゞが少ないのが難点か
    • デフォルトのセキュリティが匷いのが面倒かも
  • Swift
    • ちょっず調べおみたが、案倖いいかもしれない
      • 1ファむルだけで䟝存性指定も党お完了する
    • Apple端末以倖ぞの可搬性がどうかは分からない

2025/03/24 远蚘Pythonに぀いおはuvを䜿うず良さそうです。以䞋に蚘事を曞きたしたので参考にしおください。

たずめ

開発甚適圓ツヌルずいう甚途をベヌスにGo蚀語の良さを玹介しおきたした。私も実際に開発プロゞェクトでの各所ツヌルにGoを䜿っおいたす。

開発甚適圓ツヌルを䜜ろうず思った際に、Goを候補にしおみるのもいいず思いたす。

  1. 䞀郚の人は治具ず呌んでいるかもしれたせん ↩

  2. GoにはJSでいう package.json / package-lock.json に盞圓する go.mod / go.sum があり、䞀旊むンストヌルされた䟝存性はどこでも再珟するこずができたす。 ↩

  3. ずはいえ、最近はGitHub CopilotなどのAI入力が退屈な入力を割ず代替しおくれるので、Goのような退屈な蚀語にはいい時代になりたした ↩

482
378
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
482
378

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?