让 AI 为你写代码 - 体验 Github Copilot
前幾天在群里看到有大神分享 Copoilot AI 寫代碼,看了幾個(gè)截圖有點(diǎn)不敢相信自己的眼睛。今天趕緊自己也來(lái)體驗(yàn)一下 Copoilot AI 寫代碼到底有多神奇。
申請(qǐng)
現(xiàn)在 Copoilot 還處在預(yù)覽階段,想要體驗(yàn)需要先申請(qǐng)。等待大概一晚會(huì)收到郵件提示申請(qǐng)?jiān)囉贸晒?#xff0c;然后就可以安裝 copilot 的插件進(jìn)行體驗(yàn)了。
申請(qǐng)的地址為 https://copilot.github.com/ 。
安裝插件
打開 VSCode 的擴(kuò)展面板,搜 copilot 找到插件點(diǎn)擊安裝。
安裝完成后會(huì)提示你需要登錄 github 進(jìn)行授權(quán)。這一步在國(guó)內(nèi)可能會(huì)校驗(yàn)失敗,多嘗試幾次就會(huì)成功。
開始體驗(yàn)
安裝完插件后就可以開始體驗(yàn)了。使用其實(shí)來(lái)也非常簡(jiǎn)單,你只需要寫下注釋比如 // 比較兩個(gè)數(shù)的大小 ,然后回車,稍等一會(huì)就 copilot 就會(huì)把建議代碼給列出來(lái)。或者直接寫下方法名,比如 function compareDate () { 寫下第一個(gè) { 的時(shí)候按下回車,稍等一會(huì) copilot 就會(huì)給出建議代碼,按一次 tab 就會(huì)生成代碼。
copilot 可能會(huì)給出多種建議的代碼,使用 alt + [ 或者 alt + ] 可以進(jìn)行切換。
下面讓我們來(lái)測(cè)試一下 copilot 生成的代碼到底怎么樣。
測(cè)試JavaScript
新建一個(gè)名為 copilottest.js 的文件。
先來(lái)一個(gè)簡(jiǎn)單的,實(shí)現(xiàn)一個(gè)快速排序,這種標(biāo)準(zhǔn)的算法生成起來(lái)應(yīng)該沒(méi)啥難度。直接 // 快排 回車就生成出來(lái)了,看了下代碼,還不錯(cuò)哈。
再來(lái)一個(gè)比較常用的字符串轉(zhuǎn)時(shí)間,并且順便生成一個(gè)測(cè)試方法。
//把格式為"yyyy-MM-dd"的字符串轉(zhuǎn)換為Date類型 function?stringToDate(str)?{var?date?=?eval('new?Date('?+?str.replace(/\d+(?=-[^-]+$)/,function?(a)?{?return?parseInt(a,?10)?-?1;?}).match(/\d+/g)?+?')');return?date; } //測(cè)試?stringToDate?方法是否正確 function?testStringToDate()?{var?str?=?"2017-01-01";var?date?=?stringToDate(str);alert(date); }再來(lái)帶判斷邏輯的:比較兩個(gè)數(shù)字,如果第一個(gè)數(shù)字大于第二個(gè)數(shù)字,則返回“微信”否則返回"qq"。
這個(gè)考驗(yàn)一下 copilot 對(duì)中文的理解。
再來(lái)一個(gè)判斷時(shí)間是星期幾的函數(shù)
//根據(jù)時(shí)間判斷星期幾 function?getWeek(date)?{var?week;switch?(date.getDay())?{case?0:week?=?"星期日";break;case?1:week?=?"星期一";break;case?2:week?=?"星期二";break;case?3:week?=?"星期三";break;case?4:week?=?"星期四";break;case?5:week?=?"星期五";break;case?6:week?=?"星期六";break;}return?week; }再來(lái)試試 http 請(qǐng)求寫的怎么樣,訪問(wèn)一下百度把html返回。
//返回baidu.com的html function?getBaiduHtml()?{var?url?=?"http://www.baidu.com";var?xhr?=?new?XMLHttpRequest();xhr.open("GET",?url,?false);xhr.send();var?html?=?xhr.responseText;return?html; }JavaScript 操作 html 也很常見(jiàn),那么試試查找元素怎么樣
//查找頁(yè)面上所有的div function?findAllDiv()?{var?divs?=?document.getElementsByTagName("div");return?divs; }//查找所有頁(yè)面上class=user的input元素 function?findAllUserInput()?{var?inputs?=?document.getElementsByClassName("user");return?inputs; }再來(lái)試試 http 提交對(duì)象怎么樣
//請(qǐng)求一個(gè)url,post一個(gè)json對(duì)象 function?postJson(url,?json)?{var?xhr?=?new?XMLHttpRequest();xhr.open("POST",?url,?false);xhr.setRequestHeader("Content-Type",?"application/json");xhr.send(JSON.stringify(json));var?response?=?xhr.responseText;return?response; }來(lái)個(gè)有點(diǎn)難度的,爬取博客園首頁(yè)的文章的標(biāo)題
//爬取cnblogs.com所有文章的標(biāo)題 function?getAllArticleTitle()?{var?url?=?"http://www.cnblogs.com/";var?xhr?=?new?XMLHttpRequest();xhr.open("GET",?url,?false);xhr.send();var?html?=?xhr.responseText;var?reg?=?/<a?href="(.*?)"?target="_blank">(.*?)<\/a>/g;var?result?=?html.match(reg);return?result; }測(cè)試一下使用某個(gè)類庫(kù)來(lái)完成一些操作
//?使用hls.js播放視頻 function?playVideo(video)?{var?hls?=?new?Hls();hls.loadSource("http://www.w3school.com.cn/i/movie.mp4");hls.attachMedia(video);hls.on(Hls.Events.MANIFEST_PARSED,?function?()?{video.play();}); }看到這里有沒(méi)有被震驚到?以上代碼全部是 copilot 自動(dòng)生成的,我僅僅是寫下了幾行注釋。可以看到注釋其實(shí)寫的也很簡(jiǎn)單,copilot 生成的代碼基本上都符合注釋的內(nèi)容,可以說(shuō) copilot 對(duì)中文注釋的理解非常到位。如果你的注釋寫的更加詳細(xì),那么代碼就會(huì)更加符合你的要求。
測(cè)試.NET C#
讓我們?cè)趤?lái)試試 C# 代碼的提示功能怎么樣。新建一個(gè)文件名為 copilottest.cs 的文件。
先來(lái)一個(gè)簡(jiǎn)單的,比較兩個(gè)時(shí)間的大小。
做為 CRUD boy 自然要測(cè)試下數(shù)據(jù)庫(kù)操作。
先來(lái)試試使用EF來(lái)查找用戶
再來(lái)試試使用 dapper 的寫法
//使用dapper查詢用戶????public?static?List<User>?GetUserListDapper()?{using?(IDbConnection?db?=?new?SqlConnection("server=.;database=copilote;uid=sa;pwd=123456"))?{return?db.Query<User>("select?*?from?user").ToList();}}讓我們加大難度,來(lái)個(gè)連接跟分組統(tǒng)計(jì)人數(shù)
//查詢2020年每個(gè)班級(jí)學(xué)生的人數(shù)public?static?void?GetClassStudentCount()?{using?(IDbConnection?db?=?new?SqlConnection("server=.;database=copilote;uid=sa;pwd=123456"))?{db.Query<ClassStudentCount>("select?class.name?as?classname,count(student.id)?as?studentcount?from?student?left?join?class?on?student.classid=class.id?where?class.year=2020?group?by?class.name").ToList();}}讓它自動(dòng)生成改刪查操作
class?student?{public?int?id?{?get;?set;?}public?string?name?{?get;?set;?}public?int?classid?{?get;?set;?}}//student的新增操作public?static?void?AddStudent(student?s)?{using?(IDbConnection?db?=?new?SqlConnection("server=.;database=copilote;uid=sa;pwd=123456"))?{db.Execute("insert?into?student(name,classid)?values(@name,@classid)",?s);}}//student的更新操作public?static?void?UpdateStudent(student?s)?{using?(IDbConnection?db?=?new?SqlConnection("server=.;database=copilote;uid=sa;pwd=123456"))?{db.Execute("update?student?set?name=@name,classid=@classid?where?id=@id",?s);}}//student的刪除操作public?static?void?DeleteStudent(int?id)?{using?(IDbConnection?db?=?new?SqlConnection("server=.;database=copilote;uid=sa;pwd=123456"))?{db.Execute("delete?from?student?where?id=@id",?new?{?id?=?id?});}}再來(lái)試試生成 ASP.NET MVC 的 action 方法。
class?UserController?:?Controller?{//從?request?獲取?name?參數(shù)查詢用戶,如果查到就返回否則返回狀態(tài)404public?ActionResult?GetUser(string?name)?{User?user?=?UserService.GetUser(name);if?(user?!=?null)?{return?Json(user);}?else?{return?HttpNotFound();}}//使用[FromBody]映射成user對(duì)象,并保存到數(shù)據(jù)庫(kù)public?ActionResult?AddUser([FromBody]User?user)?{UserService.AddUser(user);return?Json(user);} }其實(shí)我還試驗(yàn)了一下 JAVA 的代碼,也是毫無(wú)壓力,這里就不貼出來(lái)了。
總結(jié)
到這里我已經(jīng)有點(diǎn)無(wú)話可說(shuō)了。copilot 深深的震撼了我,感覺(jué) copilot 對(duì)注釋的理解根據(jù)人類無(wú)差別,生成的代碼基本是符合要求的,即使有一點(diǎn)問(wèn)題那也是因?yàn)闆](méi)有上下文的原因, copilot 只能生成最常用的語(yǔ)句。copilot 雖然只是生成一個(gè)個(gè)短小的函數(shù),但是再?gòu)?fù)雜的系統(tǒng)不都是由無(wú)數(shù)個(gè)簡(jiǎn)單的函數(shù)組成的嗎?況且 copilot 還只是預(yù)覽版,如果再迭代幾個(gè)版本,AI 再訓(xùn)練幾年那么是不是可以有無(wú)限可能。到這里心里略有一點(diǎn)憂傷,以后一些低級(jí)代碼工作很可能被 AI 代替,程序員的入門門檻進(jìn)一步降低,這到底是好事還是壞事呢?
關(guān)注我的公眾號(hào)一起玩轉(zhuǎn)技術(shù)
總結(jié)
以上是生活随笔為你收集整理的让 AI 为你写代码 - 体验 Github Copilot的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 有趣分享:国内产业图谱
- 下一篇: 基于PaddleOCR实现AI发票识别的