なんの記事?
golang でGithub copilot の基本機能を使ってみたログと所感
Github Copilot とは
関数名とコメントから、関数のコードを丸ごと自動補完するAIプログラミング機能
基本操作
-
Tab
で補完 -
Option+]
(orOption+[
) で次/前の候補 (Mac OS) -
Esc
で補完を消す -
ctrl + enter
で他の候補の一覧
実際にgo で触ってみる
環境:VSCode, Mac
vscode でインストール後やることはシンプルでコードを入力してタブで補完するだけ。
提案方法には
- 関数名から補完する方法
- コメントから補完する方法
があるようで、どちらも試してみた。
関数名で補完
func main() なんて書いてみると適当な加算のサンプルコードが提案された。
こんなふうに提案されるのか。
option + [
で次の提案を見てみるとhello world に
より実用的なコードをしようとstring のスライスからint のスライスに変換する関数名を入力してみた。
すごい、シンプルな内容ではあるが一瞬でやりたいコードの提案をしてくれた。
実際にTab
を押すことで一瞬でそのコードが書ける。
(でも、スライスの長さ決まってるならvar result []int
よりもresult := make([]int, 0, len(s))
のほうがいいよねなんて思ったり。もちろんすべてが真ではないし、もしかしたらバグコードが提案される可能性も否定できないことに留意したい)
さらにmain関数でこれをprintln でもしてみようかと思って書き始めようとすると
との提案。ここまでやってくれるのかと。
Github Copilot は単なる点での提案ではなくコードのコンテキストを考慮した提案をしてくれるようだ。
思ったよりもよく考えてくれている。
tab
を押して提案された記述をそのまま使い、次に行うのは出力。
ここまで来るとGithub Copilot先生も「やっぱりな」と思ったのだろうか、当然のようにfor と打つだけでインデックスを覗いたfor 文とprintが提案された。さすが。
こんな感じでスイスイとstring スライスをint スライスに変換して出力するサンプルができてしまった。
package main
import "strconv"
func main() {
println("Hello, world.")
s := stringSliceToIntSlice([]string{"1", "2", "3"})
for _, v := range s {
println(v)
}
}
func stringSliceToIntSlice(s []string) []int {
var result []int
for _, v := range s {
i, err := strconv.Atoi(v)
if err != nil {
panic(err)
}
result = append(result, i)
}
return result
}
提案の早さについても特に気になる時間はかからず、これくらいの簡単な関数であれば1秒もかからず提案してくれた。
おまけ
コメントを書いて補完
Github Copilot はコメントから文章を解釈してコードの提案をも行ってくれるようだ。
実践してみる。
たとえば上記のfibonacci 関数は再帰での記述になっていて、計算量がO(n^2)になってしまい重い処理になることが予想される。可能であれば再帰を使わずに書きたいことが多いものだ。
単にoption + [
で次の提案を探す方法もあるが、より具体的にコメントからより記述的に書く方法を試してみた。
再帰を使わないフィボナッチをgetする関数と書こうと入力していると…
ここから補完!ナイス! これがやりたかった!
実際に提案されたコード:
// get fibonacci number not to use recursion
func fibonacci2(n int) int {
if n == 0 {
return 0
}
if n == 1 {
return 1
}
a := 0
b := 1
for i := 2; i <= n; i++ {
a, b = b, a+b
}
return b
}
これで頭も再帰も使わずフィボナッチ数をゲットする関数を書くことができた。
また前述の通り、ctrl + enter
で他の候補の一覧も閲覧できる
なるほど。便利
こんな感じで、やりたいことがより具体的で複雑になりそうなときはコメントからの補完を使ったほうが提案の精度も高くなるように思えた。
おまけ
適当なコメントしてみて提案を見るのも面白い
まとめ
GitHub Copilot は思っていた以上に立体感があり、コードのコンテキストを考慮したより人間的な提案をしてくれていた。ただ注意したいのが書くコードが常にベストを出すとは限らない。
どんな感じだっけーって検索してコピペするような作業的なコードについてはCopilot の利用がかなり効きそうだなという印象。
基本的には実装の方針の確認のために粗く利用して多角的に判断して採用するような使い方がいいと思った。