LoginSignup
4
2

More than 1 year has passed since last update.

go でGithub Copilot を軽く触ってみた

Last updated at Posted at 2021-10-28

なんの記事?

golang でGithub copilot の基本機能を使ってみたログと所感

Github Copilot とは

関数名とコメントから、関数のコードを丸ごと自動補完するAIプログラミング機能

基本操作

  • Tabで補完
  • Option+] (or Option+[) で次/前の候補 (Mac OS)
  • Esc で補完を消す
  • ctrl + enter で他の候補の一覧

実際にgo で触ってみる

環境:VSCode, Mac

vscode でインストール後やることはシンプルでコードを入力してタブで補完するだけ。
提案方法には

  • 関数名から補完する方法
  • コメントから補完する方法

があるようで、どちらも試してみた。

関数名で補完

func main() なんて書いてみると適当な加算のサンプルコードが提案された。
こんなふうに提案されるのか。
スクリーンショット 2021-10-27 23.18.38.png

option + [ で次の提案を見てみるとhello world に
スクリーンショット 2021-10-27 23.18.48.png

再度押すと小文字のworld になったり。
スクリーンショット 2021-10-27 23.18.57.png


より実用的なコードをしようとstring のスライスからint のスライスに変換する関数名を入力してみた。

スクリーンショット 2021-10-27 23.20.40.png

すごい、シンプルな内容ではあるが一瞬でやりたいコードの提案をしてくれた。
実際にTabを押すことで一瞬でそのコードが書ける。

(でも、スライスの長さ決まってるならvar result []int よりもresult := make([]int, 0, len(s)) のほうがいいよねなんて思ったり。もちろんすべてが真ではないし、もしかしたらバグコードが提案される可能性も否定できないことに留意したい)

さらにmain関数でこれをprintln でもしてみようかと思って書き始めようとすると
スクリーンショット 2021-10-27 23.21.13.png

との提案。ここまでやってくれるのかと。
Github Copilot は単なる点での提案ではなくコードのコンテキストを考慮した提案をしてくれるようだ。
思ったよりもよく考えてくれている。

tab を押して提案された記述をそのまま使い、次に行うのは出力。
ここまで来るとGithub Copilot先生も「やっぱりな」と思ったのだろうか、当然のようにfor と打つだけでインデックスを覗いたfor 文とprintが提案された。さすが。

スクリーンショット 2021-10-27 23.22.00.png
スクリーンショット 2021-10-27 23.22.08.png

こんな感じでスイスイと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秒もかからず提案してくれた。

おまけ

有名なアルゴリズムとかは当然のように補完されるようだ
スクリーンショット 2021-10-27 23.25.45.png
スクリーンショット 2021-10-27 23.25.08.png

コメントを書いて補完

Github Copilot はコメントから文章を解釈してコードの提案をも行ってくれるようだ。
実践してみる。

たとえば上記のfibonacci 関数は再帰での記述になっていて、計算量がO(n^2)になってしまい重い処理になることが予想される。可能であれば再帰を使わずに書きたいことが多いものだ。
単にoption + [ で次の提案を探す方法もあるが、より具体的にコメントからより記述的に書く方法を試してみた。

再帰を使わないフィボナッチをgetする関数と書こうと入力していると…
スクリーンショット 2021-10-28 11.04.51.png
ここから補完!ナイス! これがやりたかった!

実際に提案されたコード:

// 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 で他の候補の一覧も閲覧できる

image.png

なるほど。便利

こんな感じで、やりたいことがより具体的で複雑になりそうなときはコメントからの補完を使ったほうが提案の精度も高くなるように思えた。

おまけ

適当なコメントしてみて提案を見るのも面白い

// pizza
image.png

まとめ

GitHub Copilot は思っていた以上に立体感があり、コードのコンテキストを考慮したより人間的な提案をしてくれていた。ただ注意したいのが書くコードが常にベストを出すとは限らない。
どんな感じだっけーって検索してコピペするような作業的なコードについてはCopilot の利用がかなり効きそうだなという印象。
基本的には実装の方針の確認のために粗く利用して多角的に判断して採用するような使い方がいいと思った。

4
2
0

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
4
2