BLOG

ブログ

ChatGPTにGoで掲示板作る方法教えてもらった

はじめに

今回は新しい言語に挑戦したいということでGoに触れてみます。

せっかくなので書籍やブログを頼るのではなく、ChatGPTに全面的に教えてもらうことにしました。

今回はこんな感じで、掲示板アプリを作りたい旨をChatGPTにぶつけてみました。

プロジェクト作成

ご丁寧にリンクまで用意して、Goのインストールから教えてくれました。

手順通りにインストールします。

ちなみに、MacOSには2種類パッケージが用意されており、おそらく、どのチップを使っているかの違いだろうと推測できますが、一応聞いてみました。

丁寧に返してくれます。しかも絵文字付き、かわいい。今回はApple シリコン用のパッケージをダウンロードします。

ダウンロード後のインストールは手順に従うとすぐにできます。

ここまでは順調です。

次にターミナルで、提供されたコードをコピペで実行します。

mkdir go-bbs && cd go-bbs
go mod init github.com/yourusername/go-bbs
go get -u github.com/gin-gonic/gin gorm.io/gorm gorm.io/driver/sqlite github.com/golang-jwt/jwt/v4

さらにmain.go(おそらく中核になるであろうファイル)を指示通り作成し、コードをコピペします。

package main

import (
	"github.com/gin-gonic/gin"
	"gorm.io/driver/sqlite"
	"gorm.io/gorm"
	"net/http"
)

// モデル定義
type Post struct {
	gorm.Model
	Username string `json:"username"`
	Message  string `json:"message"`
}

var db *gorm.DB

func main() {
	// データベース接続
	var err error
	db, err = gorm.Open(sqlite.Open("bbs.db"), &gorm.Config{})
	if err != nil {
		panic("failed to connect database")
	}

	db.AutoMigrate(&Post{})

	// ルーティング
	r := gin.Default()
	r.GET("/posts", getPosts)
	r.POST("/posts", createPost)

	r.Run(":8080")
}

// 投稿一覧取得
func getPosts(c *gin.Context) {
	var posts []Post
	db.Find(&posts)
	c.JSON(http.StatusOK, posts)
}

// 投稿作成
func createPost(c *gin.Context) {
	var post Post
	if err := c.ShouldBindJSON(&post); err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}
	db.Create(&post)
	c.JSON(http.StatusCreated, post)
}

そして言われた手順通り、サーバーを起動します。

go run main.go

起動できた…! ご丁寧にPOSTとGETのサンプルコードまで用意してくれているので、curlでAPIを叩きます。

curl -X POST http://localhost:8080/posts -H "Content-Type: application/json" -d '{"username":"Alice","message":"Hello, Go!"}'
curl -X GET http://localhost:8080/posts

上手くいってる…!サーバ立ち上げる時って開発してる感じがあってめちゃ好きです。

言語にもよるのかもしれませんが、こんなにすんなりできるものとは正直思っていなかったです。

画面に表示する

API自体は問題なくできましたが、画面から操作したいです。ChatGPTに教えを請いましょう。

上記で使ったコードをベースに新たにコードを提供してくれました。templatesディレクトリを作成し、index.htmlを作成します。htmlは提供されたものをコピペです。

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Go掲示板</title>
    <style>
        body { font-family: Arial, sans-serif; }
        .container { max-width: 600px; margin: auto; }
        .post { border-bottom: 1px solid #ddd; padding: 10px; }
    </style>
</head>
<body>
    <div class="container">
        <h1>掲示板</h1>
        <form action="/posts" method="POST">
            <input type="text" name="username" placeholder="名前" required>
            <textarea name="message" placeholder="メッセージ" required></textarea>
            <button type="submit">投稿</button>
        </form>
        <h2>投稿一覧</h2>
        {{range .}}
        <div class="post">
            <strong>{{.Username}}</strong>: {{.Message}}
        </div>
        {{end}}
    </div>
</body>
</html>

次にmain.goのコードを書き換えます。こちらも上記をもとにChatGPTが提供してくれます。

package main

import (
	"html/template"
	"net/http"

	"github.com/gin-gonic/gin"
	"gorm.io/driver/sqlite"
	"gorm.io/gorm"
)

type Post struct {
	gorm.Model
	Username string `form:"username"`
	Message  string `form:"message"`
}

var db *gorm.DB

func main() {
	var err error
	db, err = gorm.Open(sqlite.Open("bbs.db"), &gorm.Config{})
	if err != nil {
		panic("failed to connect database")
	}

	db.AutoMigrate(&Post{})

	r := gin.Default()
	r.LoadHTMLFiles("templates/index.html")

	r.GET("/", func(c *gin.Context) {
		var posts []Post
		db.Find(&posts)
		c.HTML(http.StatusOK, "index.html", posts)
	})

	r.POST("/posts", func(c *gin.Context) {
		var post Post
		if err := c.ShouldBind(&post); err == nil {
			db.Create(&post)
		}
		c.Redirect(http.StatusFound, "/")
	})

	r.Run(":8080")
}

おや???エラーが出ていますね。ChatGPTをに確認してみます。

どうやら余計なコードが混ざっていたようです。ですが、余計だということもしっかり説明した上で訂正案をくれました。この辺はいろんな情報を飲み込んでるので混ざるのも仕方のないことだと思いますが、そう遠くない未来に完璧な回答をしてくるんでしょうね。

見た目はちょっとアレですが、修正後ローカルで確認すると無事に動作していました!!

細かく聞いてみるのも大事

ここからはお勉強してみた感想です。どのようなことを聞いたなど具体的なことは長くなるので割愛しますが、参考までに下記画像のような質問をしまくりました。

私はGoの基礎から何から知りませんでしたが、ChatGPTの返答だけでおおよその疑問は解消できました。

Go自体がわかりやすい書き方だなとも思いますが、それでも不思議な部分はそこそこありました。しかし、思ってた以上にChatGPTの返答がわかりやすく、レイアウトも非常に綺麗にまとまっていたので読みやすかったです。すごいぞ、ChatGPT。

今回特にいいな!と思ったのは、従来のようによくわからないコードを書いて、エラーでハマり動かない、悲しい!!みたいな体験が一切なかったことです。題材や扱う言語にもよりますが、私個人としてはChatGPTにそしてGoに大満足です。

でも、ただ聞くだけでは人類はAIの奴隷になります。聞いて、わからないところを明確にして、知識を補っていく、そのためにAIを使う、そういう人間でありたい。

感想

今回はChatGPTだけを教材とし、Goを学んでみる取り組みでした。

結果的にいうと、とてもわかりやすく学ぶことができたなという印象です。題材が簡単だったというのもあるかもれませんが、新しい言語試す時はChatGPTもしくはそれに変わるAIに全面的に協力をお願いすると、いろんなハードルが下がるなあと思いました。

まずは動かしてみて、わからないところは具体的に聞いて…みたいなメンターとのやりとりの模倣を無料でできるのはかなりありがたいです。しかも質問したい放題、最高です。

しかし、上記でも例にありましたが、まだ完全に正しい回答をしてくれるレベルではありません。その辺は疑う目を養う気持ちで向き合うといいのだと思います。また、聞きっぱなしでは学びになりません。疑問を明確にして、知識を補い、能動的に学ぶのを忘れず心がけたいです。

今回のことを通して、自己学習はもちろん、何かを教えるための教材や課題作りなど、基礎的なことはAIがやってくれる世界になっていくのだと実感しました。

AIを使いこなすことが今後仕事の要となることを改めて実感しました。

みなさんもChatGPTと仲良くしてみてください。

では!!!

おまけ