整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          GCTT 出品Go 中不定長度集合

          GCTT 出品Go 中不定長度集合

          發于:https://studygolang.com/articles/14132

          如果你在使用像 C# 或 Java 這樣的編程語言后來到 go,你發現的第一件事就是沒有像 List和 Dictionary 這樣的傳統集合類型。 這真讓我困惑了好幾個月。 我找到了一個名為container/list 的軟件包,并且幾乎用它做所有的東西。

          我腦后一直有一個聲音在嘮叨。語言設計者不應該不直接支持對未知長度的集合管理的功能。每個人都在討論切片是如何在語言中被廣泛使用,但我只是在有明確定義的容量或者它們通過函數返回時我才使用切片,這有點不對勁!!

          因此,我在本月早些時候寫了一篇文章,揭開了切片的蓋子,希望能找到一些我不知道的魔法。我現在知道切片是如何工作的,但最終我仍然需要一個不斷進行長度增長的數組。我在學校學過,使用鏈表更有效率,是存儲大量數據更好的方法。特別是當你需要的集合長度未知時。這對我來說很有意義。

          當我思考使用一個空切片時,我頭腦中有一張非常錯誤的圖片:

          slice-copy

          我一直在想 go 是如何創建大量新的切片值和底層數組做大量內存分配,并且不斷進行復制值。然后垃圾回收器會因為所有這些小變量被創建和銷毀而過度工作。

          我無法想象需要做數千次這種操作。其實有更好的方法或更效率的方式我沒有意識到。

          在研究并提出了很多問題之后,我得出的結論是,在大多數實際情況下,使用切片比使用鏈表更好。這就是為什么語言設計者花時間使切片盡可能高效工作,并且沒有引入集合類型的原因。

          我們可以連續幾天討論各種邊界情況和性能問題,但 go 希望我們使用切片。因此切片應該是我們的首選,除非代碼告訴我們存在問題。掌握切片就像學國際象棋游戲,易于學習但需要一輩子才能成為大師。因為底層數組可以共享,所以在使用中需要注意一些問題。

          在繼續閱讀之前,你最好看一下我的另一篇文章 Understanding Slices in Go Programming。

          本文的其余部分將解釋如何使用切片處理未知容量的問題以及切片的運行機制。

          以下是使用空切片來管理未知長度集合的示例:

           1package main
           2
           3import (
           4 "fmt"
           5 "math/rand"
           6 "time"
           7)
           8
           9type Record struct {
          10 ID int
          11 Name string
          12 Color string
          13}
          14
          15func main() {
          16 // Let’s keep things unknown
          17 random :=rand.New(rand.NewSource(time.Now().Unix()))
          18
          19 // Create a large slice pretending we retrieved data
          20 // from a database
          21 data :=make([]Record, 1000)
          22
          23 // Create the data set
          24 for record :=0; record < 1000; record++ {
          25 pick :=random.Intn(10)
          26 color :="Red"
          27
          28 if pick==2 {
          29 color="Blue"
          30 }
          31
          32 data[record]=Record{
          33 ID: record,
          34 Name: fmt.Sprintf("Rec: %d", record),
          35 Color: color,
          36 }
          37 }
          38
          39 // Split the records by color
          40 var red []Record
          41 var blue []Record
          42
          43 for _, record :=range data {
          44 if record.Color=="Red" {
          45 red=append(red, record)
          46 } else {
          47 blue=append(blue, record)
          48 }
          49 }
          50
          51 // Display the counts
          52 fmt.Printf("Red[%d] Blue[%d]\n", len(red), len(blue))
          53}
          

          當我們運行這個程序時,由于隨機數生成器,我們將得到不同長度的紅色和藍色切片。我們無法提前知道紅色或藍色切片的容量需要,這對我來說是一種典型的情況。

          讓我們分解出代碼中更重要的部分:

          這兩行代碼創建了空切片。

          1var red []Record
          2var blue []Record
          

          一個空切片長度和容量都是0,并且不存在底層數組。我們可以使用內置的 append 函數向切片中增加數據。

          1red=append(red, record)
          2blue=append(blue, record)
          

          append 函數功能非常酷,為我們做了很多東西。

          Kevin Gillette 在我的小組討論中進行了說明:

          (https://groups.google.com/forum/#!topic/golang-nuts/nXYuMX55b6c)

          在 go 語音規范中規定,前幾千個元素在容量增長的時候每次都將容量翻倍,然后以~1.25的速率進行容量增長。

          我不是學者,但我看到使用波浪號(~)相當多。有些人也許不知道這是什么意思,這里表示大約。因此,append 函數會增加底層數組的容量并為未來的增長預留空間。最終 append 函數將大約以1.25或25%的系數進行容量增長。

          讓我們證明 append 函數增長容量并高效運行:

           1package main
           2
           3import (
           4 "fmt"
           5 "reflect"
           6 "unsafe"
           7)
           8
           9func main() {
          10 var data []string
          11
          12 for record :=0; record < 1050; record++ {
          13 data=append(data, fmt.Sprintf("Rec: %d", record))
          14
          15 if record < 10 || record==256 || record==512 || record==1024 {
          16 sliceHeader :=(*reflect.SliceHeader)((unsafe.Pointer(&data)))
          17
          18 fmt.Printf("Index[%d] Len[%d] Cap[%d]\n",
          19 record,
          20 sliceHeader.Len,
          21 sliceHeader.Cap)
          22 }
          23 }
          24}
          

          輸出結果:

           1Index[0] Len[1] Cap[1]
           2Index[1] Len[2] Cap[2]
           3Index[2] Len[3] Cap[4] - Ran Out Of Room, Double Capacity
           4Index[3] Len[4] Cap[4]
           5Index[4] Len[5] Cap[8] - Ran Out Of Room, Double Capacity
           6Index[5] Len[6] Cap[8]
           7Index[6] Len[7] Cap[8]
           8Index[7] Len[8] Cap[8]
           9Index[8] Len[9] Cap[16] - Ran Out Of Room, Double Capacity
          10Index[9] Len[10] Cap[16]
          11Index[256] Len[257] Cap[512] - Ran Out Of Room, Double Capacity
          12Index[512] Len[513] Cap[1024] - Ran Out Of Room, Double Capacity
          13Index[1024] Len[1025] Cap[1280] - Ran Out Of Room, Grow by a factor of 1.25
          

          如果我們觀察容量值,我們可以看到 Kevin 是絕對正確的。容量正如他所說的那樣在增長。在前1千的元素中,容量增加了一倍。然后容量以1.25或25%的系數增長。這意味著以這種方式使用切片將滿足我們在大多數情況下所需的性能,并且內存不會成為問題。

          最初我認為會為每次調用 append 時都會創建一個新的切片值,但事實并非如此。當我們調用append 時,在棧中復制了 red 副本。然后當 append 返回時,會再進行一次復制操作,但使用的我們已有的內存。

          1red=append(red, record)
          


          在這種情況下,垃圾收集器沒有工作,所以我們根本沒有性能或內存問題。我的 C# 和引用類型的思想再次打擊了我。

          請坐好,因為下一個版本中的切片會有變化。

          Dominik Honnef 創建了一個博客,用簡明的英文(謝謝)解釋了 Go tip 中正在編寫的內容。這些是下一版本中的內容。這是他博客的和博客中關于切片部分的鏈接。這是一篇很棒博客,推薦閱讀。

          http://dominik.honnef.co/go-tip/

          http://dominik.honnef.co/go-tip/2013-08-23/#slicing

          你可以用切片做很多的事情,甚至可以寫一整本關于這個主題的書。就像我之前說的那樣,切片就像國際象棋一樣,易于學習但需要一輩子才能成為大師。如果您來自其他語言,如 C# 和 Java,那么請擁抱切片并使用它。這正是 go 中正確的方式。


          via:https://www.ardanlabs.com/blog/2013/08/collections-of-unknown-length-in-go.html

          作者:William Kennedy

          譯者:Alan

          校對:polaris1119

          本文由 GCTT 原創編譯,Go 中文網 榮譽推出

          愛好堅持,以收藏說事,學棋齋主是認真的!

          #中國象棋#

          棋家王首成

          王首成,男,1970年7月6日出生黑龍江,象棋圖書作家。癡迷江湖排局,曾對江湖排局投入了十余年的研究工作,尤其對“征西”局有著深入細致的研討。2005年在哈爾濱市,結識了慕名已久的著名的象棋排局家李中健老師,從此步入排局界。2010年開始出版了十幾部象棋排局書籍。

          本人收藏了王先生的兩部作品《街頭棋攤揭秘》、《江湖排局新作》和電子版《百花齊放象棋譜》。


          《百花齊放象棋譜》


          電子版《百花齊放象棋譜》

          江湖棋局的江湖

          江湖棋局也是有江湖的。比如幾大名譜棋局就是異同互見的,可惜少有人梳捋其來龍去脈。在現代隨著江湖棋攤發展、棋家的創新、在古譜的基礎上,不斷出現了更多的新作,他們和古譜的源流、隨時間的變遷,棋家的努力等等,值得愛好者關注和學習研究。

          王首成先生的《街頭棋攤揭秘》、《江湖排局新作》,正是這方面研究的成果集成,真是“首成”,也說不定,我不敢妄斷!

          江湖排局源出江湖,是經過多少江湖藝人精心提煉的結晶。江湖棋攤是江湖藝人每天設局謀生之處,隨著社會的發展進步,江湖棋攤也隨之進行了日新月異的改革和創新。復雜深奧、變幻莫測的江湖大局如七星聚會、野馬操田等已少見,關鍵是每天所選用的江湖排局要有好而多的陷阱,才可以使挑戰者在每一局棋上多下幾局。

          同時,一局棋局的同類局更多了,其中一個卒位置稍有差異,可能過程和結果,大相徑庭。攤主復原棋局時你稍微沒注意,可能就不是上一局面了。

          這兩本書,共收錄新舊排局274局。在寫法上分“江湖揭秘”、“棋局介紹”、“類局拾萃”、“名手介紹(江湖排局新作主要介紹了1949年前的國手)”四個部分。非常具有可讀性和藝術性。


          送炮成和局

          賽事: 天天象棋網頁(H5)版送炮成和局

          日期: 2022-05-31


          紅方: 木狐齋主

          黑方應該是有贏棋機會的,此著馬7進5,大誤,紅方送炮妙手,結果和棋。

          1. 馬7進5 炮一平五

          應該炮5進7?成馬炮士象全對炮雙高兵,顯然黑好走。

          2. 炮5進3 帥五進一


          紅方應對無誤,結果破雙士成和。經查,炮士象全也是贏不了雙高兵的吧?請高手指教!

          有指教,請留言,學習!

          | 邊策 安妮

          出處 | 量子位

          推薦 | 編程派公眾號ID:codingpy)

          GPT-2,一個來自OpenAI的逆天語言模型,現在能用來補全代碼了。

          一位來自加拿大的大四學霸,開發了一款”Deep TabNine“代碼補全工具,實現了這一大膽的想法。

          它支持23種編程語言、5種編輯器,使用簡單,效果驚艷。

          不少使用過的網友說:TabNine是他們用過的最好的代碼補全工具,這是屬于程序員的殺手級應用

          在VS Code的擴展商店里,TabNine已經被下載1.3萬次,獲得全5星好評。

          支持23種編程語言

          Deep TabNine支持Java

          Python

          C++

          Haskell

          不同于各種其他代碼補全插件,Deep TabNine是根據程序員過去的習慣自動補全,并在后面給出幾種選項的概率。

          如果有類似代碼出現在之前的項目里,TabNine還會在補全候選框中直接給出地址,方便用戶點擊進去查閱。

          除以上幾種語言之外,Deep TabNine還支持JavaScriptCPHPGoC#RubyObjective-CRustSwiftTypeScriptOCamlScalaKotlinPerlSQLHTMLCSSBash

          主流編程語言幾乎都囊括在內。

          支持5種編輯器

          TabNine支持VS CodeSublime TextAtomEmacsVim五種代碼編輯器。

          對于使用VS Code和Sublime來說,安裝TabNine非常方便,用自帶的擴展包管理工具即可。

          VS Code

          VS Code用戶按下Ctrl+P(Mac用戶按下?+P),粘貼以下命令,然后按回車鍵完成安裝。

          ext install TabNine.tabnine-vscode

          Sublime

          Sublime用戶安裝分為兩步:

          1、按下Ctrl+Shift+P(Mac用戶:?+Shift+P),選擇Install Package Control;

          2、再次按下Ctrl+Shift+P(Mac用戶:?+Shift+P),選擇Package Control:Install Package,然后選擇TabNine來安裝。

          Vim

          Vim使用Vundle插件管理器進行安裝:

          1、添加Plugin ‘zxqfl/tabnine-vim’.vimrc

          2、輸入:PluginInstall,按下回車完成安裝。

          其他編輯器的安裝方法就不一一贅述了,有需要的用戶可以參照文末的鏈接進行安裝。

          項目超過400kb需要購買許可證:個人用戶49美元,商業用戶99美元。

          由于Deep TabNine用到機器學習補全代碼,因此需要大量的算力(超過100億次浮點運算),在筆記本上運行模型,無法獲得低延遲的體驗。

          因此,軟件開發者推出了TabNine Cloud云服務器,用云端GPU加速。付費用戶不需要再加錢即可使用。

          所以聽起來很劃算吧?

          軟件開發者自己就說,這個價格其實不貴,有了TabNine,一分鐘就里能幫你節省一秒,咱們再算算程序員的時薪,每個小時能節約1.4美元,不到一年時間就能回本了。

          如果你對效果不滿意,TabNine開發者還提供30天退款保證。

          怎么做到的?

          TabNine是在GPT-2的基礎上構建的,這是一種Transformer架構,原產自OpenAI,是個“逆天”語言模型。

          GPT-2的參數高達15億個,數據量比一代擴大了10倍,使用了包含800萬個網頁的數據集,共有40GB。

          逆天之處就在于,GPT-2寫起文章來毫無違和感,無需針對性訓練就能橫掃各種特定領域的語言建模任務,還具備閱讀理解、問答、生成文章摘要、翻譯等等能力。

          就GPT-2而言,它的訓練目標很簡單:根據所有給定文本中前面的單詞,預測下一個單詞。雖然本來是解決NLP問題,看似與寫代碼沒什么關聯,但建模代碼也算是用一種獨有的方式在理解英文

          比如,可以讓模型用if/else語句否定單詞:

          項目主頁顯示,在大約經過GitHub中200萬個文件訓練后,TabNine具備了自動補全代碼的能力。

          在訓練這個模型期間,模型學習了例如動態類型語言中的類型推斷等復雜行為,用這樣的訓練方式預測token。

          作者表示,TabNine可以很好利用傳統代碼補全工具難以獲取的瑣碎細節。

          例如,假設app.get_user的返回類型是一個帶有setter方法的對象,而app.get_users的返回類型是一個列表,兩個名稱之間只有細微的差別:

          這個模型還能以自然語言編寫的文檔來推斷函數名稱、參數和返回類型:

          Deep TabNine加入了之前用戶強烈要求加入的功能:用預先存在的知識,解決在創建新項目時的代碼補全問題。

          例如,它知道當一個類擴展React.Component時,它的構造函數通常會調用一個名為props的參數,并且通常在其內部用this.state賦值:

          Deep TabNine甚至可以做不可能的事情,并記住C++可變參數轉發語法:

          “殺手級應用”

          TabNine問世后,不斷收獲好評,甚至還有程序員激動得爆粗口:

          臥槽,這種軟件多來點就好了。(Fuck yeah. This is the sort of software I want to see more often: TabNine )

          有網友表示, 沒有它都不知道該怎么面對寫代碼這件事了。

          還有人稱之為開發者應用中的第一個“殺手級應用程序”:

          “令人印象深刻”、“感到神奇”“太酷了”……推特上的評價,頗有電視廣告上“用了都說好”的畫風。

          在各大科技論壇上,也有網友提出了建議和改進的方向。

          有用戶反映,也有美中不足的地方,比如這個工具會干擾自動括號完成。

          作者表示,TabNine還在不斷更新完善中,正在改進這些bug。

          大四學霸的第一桶金

          想不到吧,這款好評如潮的代碼工具,出自一名大四學生之手。

          Jacob Jackson,加拿大人,目前在滑鐵盧大學主修計算機科學與組合優化專業,輔修數學。大四在讀,今年8月份畢業。

          Jackson此前在Reddit上發帖稱,這是自己在大學階段開發的第一款商業軟件產品。

          別人的大學,別人的第一桶金~

          但Jackson并非無名之輩,年少有為,曾在2014和2015連續兩年獲得IOI金牌

          因此,大學一入學,便成為加拿大Michael and Ophelia Lazaridis Olympiad Scholarship獎學金的獲得者,免除了8個學期學費書費和生活費。

          除了自動補全代碼的TabNine,Jackson還開發了很多有意思的應用,比如一個名為jellies的益智游戲,和使用蒙特卡羅樹搜索的國際象棋引擎Sashimi等。

          傳送門

          TabNine網站:https://tabnine.com/blog/deep

          Jackson GitHub主頁:https://github.com/zxqfl

          Jackson簡歷:http://jacobj.ca/resume.html

          題圖:pexels,CC0 授權。


          主站蜘蛛池模板: 久久免费区一区二区三波多野| 午夜在线视频一区二区三区| 精品少妇一区二区三区视频| 国产在线aaa片一区二区99| 精品国产一区二区22| 国产日韩精品一区二区三区在线 | 中日韩精品无码一区二区三区| 一区二区三区在线观看| 国产一区内射最近更新| 最美女人体内射精一区二区| 亚洲一区中文字幕久久| 国产在线一区观看| 国产精品一区二区av| 午夜影院一区二区| 爆乳熟妇一区二区三区霸乳 | 精品久久久久久无码中文字幕一区 | 午夜精品一区二区三区在线观看| 成人区精品一区二区不卡| 中文字幕一区二区三区久久网站| 日韩在线一区二区三区视频| 东京热人妻无码一区二区av| 亚洲AV无码一区二区三区电影| 久久99精品免费一区二区| 亚洲一区二区三区四区在线观看| 无码国产精品一区二区高潮| 高清一区二区三区免费视频| 日韩一区二区三区电影在线观看| 国产在线精品一区二区三区不卡 | 亚洲性无码一区二区三区| 精品国产日韩亚洲一区| 免费无码A片一区二三区| 国产日韩AV免费无码一区二区| 夜精品a一区二区三区| 国产AV午夜精品一区二区入口 | 无码人妻精品一区二区三区在线| 精品一区二区久久久久久久网精| 亚洲AV成人一区二区三区AV| 一本色道久久综合一区| 在线免费观看一区二区三区| 精品国产乱子伦一区二区三区 | 日日摸夜夜添一区|