Go言語はじめた
環境構築からチュートリアルまで色々やったのでメモを一旦放出する.
環境構築
公式サイト:https://go.dev/
Windowsでは,Go言語のインストールはインストーラを使って行う.この記事を書いている時点での最新版は v1.26.2.
公式サイト上のチュートリアル (https://go.dev/doc/) がかなり充実してるので,とりあえずそれらを参考にするのがよさそう.自分は前述のURL内の “Getting Started” というセクション内のチュートリアルを片っ端から追った.
Goプログラムの記述
Hello World
以下のように,適当な作業ディレクトリ内でhelloというディレクトリを作り,初期化用のコマンドでモジュールを初期化すると,go.mod というファイルが作成される.
mkdir hello
cd hello
go mod init example/hello
main.go という名前でテキストファイルを作成し,以下のように記述する.
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}
以下のコマンドでプログラムを実行すると,コンソール上に Hello, World! と表示される.
go run .
実行可能なバイナリファイルをを作成するときは,
go build
を実行する.
外部パッケージのインポート
外部のパッケージを利用する際は,まず,以下のようにパッケージのインポートを書く.
package main
import "fmt"
import "rsc.io/quote"
func main() {
fmt.Println("Hello, World!")
fmt.Println(quote.Go())
}
その後,go mod tidy というコマンドを実行し,quoteモジュールを依存モジュールに追加する (go.modファイルの内容が更新される).
go run . でプログラムを実行すると,以下のような出力が得られる:
Hello, World!
Don't communicate by sharing memory, share memory by communicating.
Goプログラム例
RESTful API
gin-gonic/gin というWebフレームワークでRESTful APIを書いた例.詳しくは公式チュートリアル (https://go.dev/doc/tutorial/web-service-gin) を参照.
package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
type album struct {
ID string `json:"id"`
Title string `json:"title"`
Artist string `json:"artist"`
Price float64 `json:"price"`
}
var albums = []album{
{ID: "1", Title: "Blue Train", Artist: "John Coltrane", Price: 56.99},
{ID: "2", Title: "Jeru", Artist: "Gerry Mulligan", Price: 17.99},
{ID: "3", Title: "Sarah Vaughan and Clifford Brown", Artist: "Sarah Vaughan", Price: 39.99},
}
func Index(c *gin.Context) {
c.Writer.WriteString(`<h1>It works!</h1>`)
}
func getAlbums(c *gin.Context) {
c.IndentedJSON(http.StatusOK, albums)
}
func getAlbumByID(c *gin.Context) {
id := c.Param("id")
for _, a := range albums {
if a.ID == id {
c.IndentedJSON(http.StatusOK, a)
return
}
}
c.IndentedJSON(http.StatusNotFound, gin.H{"message": "album not found"})
}
func postAlbums(c *gin.Context) {
var newAlbum album
if err := c.BindJSON(&newAlbum); err != nil {
return
}
albums = append(albums, newAlbum)
c.IndentedJSON(http.StatusCreated, newAlbum)
}
func main() {
router := gin.Default()
router.GET("/", Index)
router.GET("/albums", getAlbums)
router.GET("/albums/:id", getAlbumByID)
router.POST("/albums", postAlbums)
router.Run("localhost:8080")
}
ゲーム
hajimehoshi/ebitengine モジュールを使うとゲーム開発も可能.以下はウインドウを表示して,“Hello, World!” という文字列を描画する例.
package main
import (
"log"
"github.com/hajimehoshi/ebiten/v2"
"github.com/hajimehoshi/ebiten/v2/ebitenutil"
)
type Game struct{}
func (g *Game) Update() error {
return nil
}
func (g *Game) Draw(screen *ebiten.Image) {
ebitenutil.DebugPrint(screen, "Hello, World!")
}
func (g *Game) Layout(outsideWidth, outsideHeight int) (screenWidth, screenHeight int) {
return 320, 240
}
func main() {
ebiten.SetWindowSize(640, 480)
ebiten.SetWindowTitle("Hello, World!")
if err := ebiten.RunGame(&Game{}); err != nil {
log.Fatal(err)
}
}
NeovimのLSPを設定
golangの公式がgopls ( https://go.dev/gopls/ ) というLSPを提供している.前述のURLに各エディタ向けの案内もある.
自分はcoc.nvimやvim-lspなどの拡張機能ではなく,Neovim v0.5以降に搭載されているNeovimネイティブのLSPを使うことにした.
Neovimの設定は大体以下の通り.人によってファイルの配置は違うと思うので各々チューニングすること.
- Neovimの設定ファイルである
init.vimと同じ階層にlspという名前のディレクトリを作り,LSP設定用の空のスクリプトlsp/init.luaを配置する init.vimからlsp/init.luaを以下のように呼び出すruntime lsp/init.luaneovim/nvim-lspconfigリポジトリのlsp/gopls.luaをコピーしてきてlspディレクトリ内に配置するlsp/init.vimに以下の内容を記述する(キーマップは環境にあわせて変えること)vim.lsp.enable('gopls') vim.keymap.set('n', '<C-Tab>', '<cmd>lua vim.lsp.buf.hover()<CR>') vim.keymap.set('n', '<C-W>', '<cmd>lua vim.diagnostic.open_float()<CR>')
おわり