Go語言學習筆記(五):切片操作

2021-03-02 娜驛站
前言前面幾篇文章主要對Go中一些數據類型的實現原理進行了思考,這一篇來研究一下切片的一些實際操作方法。當然,在探討這些操作方法之前,要來看一下,Go是否有類似於IPython一樣的交互界面。交互gomacro第三方庫gomacro為Go語言提供了一個可以實時交互的界面,這種命令窗口的實現,對於我們測試一些代碼而言,是非常方便的。
go get -u github.com/cosmos72/gomacro

安裝完成後,在$HOME/go/bin目錄下,就生成了可執行文件gomacro,當然你可以將它加在路徑中:
export PATH=$PATH:$HOME/go/bin

為了永久使用它,將其寫入$HOME/.bashrc中即可。

在該命令窗口可以輸出各種Go的命令進行測試,有點讓人遺憾的是,它的語法沒有彩色顯示,要退出gomacro,輸入:q回車即可。
不過,有一些高手也基於這個包做出了另一個可以嵌入Jupyter的插件,在那裡面,可以實現彩色顯示,更重要的是,可以利用Jupyter lab的許多功能。關於Jupyter lab這個工具,在本公眾號之前的文章中有介紹過。gophernotes的安裝和使用gophernotes是一個Jupyter的插件,它將gomacro嵌入其中,可以呈現出我們熟悉的操作樣式,它的安裝如下:
go get github.com/gopherdata/gophernotesmkdir -p ~/.local/share/jupyter/kernels/gophernotescd ~/.local/share/jupyter/kernels/gophernotescp "$(go env GOPATH)"/pkg/mod/github.com/gopherdata/gophernotes@v0.7.1/kernel/* "."chmod +w ./kernel.jsonsed "s|gophernotes|$(go env GOPATH)/bin/gophernotes|" < kernel.json.in > kernel.json

以上代碼來自於gophernotes的官方介紹,複製粘貼幾下即可安裝成功,當然它主要是將gophernotes當成一個插件進行安裝,之後再將其複製到Jupyter的內核位置。在命令行運行jupyter lab即可得到以下界面:

新建一個notebook文件,在其中輸入Go代碼,如下所示:

然而,有一點需要注意,儘管在Jupyter lab中調用Go語言的常規庫是沒有問題的,但由於某種現在我還不知道的原因,調用第三方庫還是有一些問題,官方網站對此的介紹是說,這是由於Go新包管理機制的變更造成的,可以通過設置%go111module off回到舊的包管理邏輯中,但我測試時還是無法調用,需要繼續查閱來解決。也就是說,當前這個第三方包對於Go的這種新老包管理機制的問題解決的不夠完美。切片的一些操作方法在前面文章中分析過Go語言採用切片後所具備的靈活性,現在來具體看看它的一些常用操作方法。追加

複製

利用copy函數也可以實現:

不知什麼原因,在Jupyter lab中無法使用copy函數。剪切

刪除

剪切和刪除時會有內存洩露嗎?上述的剪切和刪除方法都是利用append來實現的,很明顯有一些值雖然沒有被使用,但它們仍然被從切片中剪除了,據一些文章介紹說,這樣可以造成內存永久洩露。我感覺很奇怪,就寫了一段代碼來檢查一下,示例如下:

從上圖可以看出,當切除了變量a的兩個元素後,它的長度變為6,但容量是8,可是切片本身就是對數組的切除,有必要再去將剩餘兩個位置設置為nil嗎?我認為是不必要的,因為那兩個位置已經成了切片的容量空間,保留它並沒有任何不妥的地方。插入一個元素

倒序

小結本文介紹了如何使用go語言的REPL命令窗口來測試一些代碼,並利用Jupyter lab的插件練習了一下切片類型的增刪和排序功能,記此備忘。

相關焦點

  • Go語言聖經-學習筆記01
    go語言的變量全部會進行初始化,未人為初始化的全部由系統進行初始化。go語言允許強制轉換類型2.6包和文件一個文件夾即為一個包,用關鍵字package引用,項目最外層文件夾為main包,一個名字是大寫字母,則該名字是導出的。如果想在包外使用該變量或函數,則必須使用首字母大寫方式命名,否則只能在包內使用。
  • Go語言的學習筆記(第二章)
    變量的初始化Go語言在聲明變量的時候,會自動對變量對應的內存區域進行初始化操作。切片、函數、指針變量的默認為nil。當然我們也可在聲明變量的時候為其指定初始值。iotaiota是go語言的常量計數器,只能在常量的表達式中使用。
  • Go語言進階之路(一):變量、類型、數組、切片、字典和結構體
    const ( i = iota j = iota _ k)fmt.Println(i) fmt.Println(j) fmt.Println(k) iota值可以跳過,需要使用Go語言中的跳過操作符(也稱為垃圾操作符),即「_」。
  • 《Go語言實戰》筆記(二) | Go開發工具
    Go平衡了底層系統語言的能力,以及在現代語言中所見到的高級特性。你可以依靠Go語言來構建一個非常快捷、高性能且有足夠控制力的編程環境。使用Go語言,可以寫得更少,做得更多。《Go 語言實戰》一書是Go語言領域極具聲望的技術展專家力作,以下為本書讀者精彩的讀書筆記。
  • go 的數組還是切片都沒有什麼不一樣
    語言中文網」關注我們,設個星標,每天學習Go語言上篇文章中詳細介紹了 Go 的基礎語言,指出了 Go 和其他主流的程式語言的差異性,比較側重於語法細節,相信只要稍加記憶就能輕鬆從已有的程式語言切換到 Go 語言的編程習慣中,儘管這種切換可能並不是特別順暢,但多加練習尤其是多多試錯,總是可以慢慢感受 Go 語言之美!
  • Go語言學習筆記之字符串一
    Go語言是一個年輕人,身上擁有c++,java,python等語言的特點。在網絡通信、並發和並行編程擁有極好的體驗,當然不僅僅在這上上面,還有網絡編程,web應用,應用下載等有著非常大的潛力。這裡列舉一些 Go 語言的特點: 簡化問題,易於學習 內存管理,簡潔語法,易於使用 快速編譯,高效開發 高效執行 並發支持,輕鬆駕馭, 靜態類型 標準類庫,規範統一 易於部署 文檔全面 免費開源學習go語言有幾天了,今天突然想到把學的寫成筆記,記錄一下。如有不正確的請指教。
  • Python3 量化分析筆記小白到破產-列表進階 切片組合
    文:藍兔子讀難NOTES圖: 配圖 來源於網絡Python3 量化分析從小白到破產筆記列表的進階 切片與組合編碼:0009在前面的內容中,我們說人人都愛列表,老闆也動不動就讓你列個表。我們講了如何列出一個表,如何對表中的元素進行:增、刪、改等操作。這篇文章的內容,我們將進行更高階一點的操作。
  • 一文搞定Go語言語法
    優點Go很容易學習如果你了解任何一種程式語言,那麼通常在學習幾個小時就能夠掌握 Go 的大部分語法,並在幾天後寫出你的第一個真正的程序。閱讀並理解實效 Go 編程,瀏覽一下包文檔,玩一玩 Gorilla 或者 Go Kit 這樣的網絡工具包,然後你將成為一個相當不錯的 Go 開發者。
  • [GO語言基礎] 一.為什麼我要學習Golang以及GO語言入門普及
    Let’s go!!!二.什麼是Go語言本文詳細學習了韓順平老師的視頻和柴樹杉老師的《GO高級編程》,在此表示感謝,真的感謝這些大神讓我們不斷進步。不要這樣學習:只看書,不上機只運行,不調試只收藏,不實踐,半途而廢只做課後練習,不做工程項目應該這樣學習:Golang語言的基本學習方法和其他程式語言類似,需要注意以下幾點:高效愉快地學習先建立一個整體框架,然後細節在實際工作中,要培養用到什麼,能夠快速學習什麼能力
  • 入門教程:花 5 分鐘學習 Go 語言
    main.go 文件,輸入如下代碼,並將文件保存在上面創建的 hello 目錄下。不像其他語言,Go 語言不支持繼承也沒有類(我們可以通過結構體嵌套實現「繼承」)。3, 4}slice 也可以通過 append() 函數創建:xs := []int{}xs = append(xs, 1)xs = append(xs, 2)xs = append(xs, 3)可以通過索引範圍 slice:xs[1]  // 2你還可以通過「切片
  • Go語言常見語法錯誤
    }    println(num)    println(str)}10、偶然的變量隱藏短式變量聲明的語法如此的方便(尤其對於那些使用過動態語言的開發者而言),很容易讓人把它當成一個正常的分配操作。默認情況下, vet不會執行這樣的檢查,你需要設置-shadow參數: 命令:go tool vet -shadow your_file.gogo tool vet -shadow main.gomain.go:10: declaration of "x" shadows declaration at main.go:611、不使用顯式類型
  • GO語言入門(第一個go程序)
    為了簡化設計,不支持函數重載和操作符重載為了避免在 C/C++ 開發中的一些 Bug 和混亂,不支持隱式轉換Go 語言通過另一種途徑實現面向對象設計(第 10-11 章)來放棄類和類型的繼承小結這裡列舉一些 Go 語言的必殺技:簡化問題,易於學習內存管理,簡潔語法,易於使用快速編譯,高效開發
  • 你能一口說出go中字符串轉字節切片的容量嘛?
    神奇的現象切片,切片,又是切片!前一篇文章講的是切片, 今天遇到的神奇問題還是和切片有關, 具體怎麼個神奇法, 讓我們來看看下面幾個現象現象一現象二現象三現象四現象五分析32的byte數組, 因此在現象二中生成了一個容量為32的切片根據對stringtoslicebyte的源碼分析, 我們知道現象一調用了rawbyteslice函數由上面的代碼知道, 切片的容量通過runtime/msize.go中的roundupsize函數計算得出,
  • 60分鐘快速了解Go語言
    }// Decorator在一些語言中很常見,在go語言中,// 接受參數作為其定義的一部分的函數是修飾符的替代品func sentenceFactory(mystring string) func(before, after string) string {return func(before, after string) string
  • 深度解密Go語言之unsafe
    個人認為,學習本身並不是一件輕鬆愉快的事情,寓教於樂是個美好的願望。想要深刻地領悟,就得付出別人看不見的努力。學習從來都不會是一件輕鬆的事情,枯燥是正常的。耐住性子,深入研究某個問題,讀書、看文章、寫博客都可以,浮躁時代做個專注的人!不多說,貼上本文的目錄:
  • 超詳細go入門筆記
    package mainimport "fmt"func main() { fmt.Println("hello word")}第2章 Go基本語法2.1變量2.1.1. go語言中變量分為局部變量和全局變量•局部變量,是定義在打括號{}內部的變量,打括號內部也是局部變量的作用域•全局變量,是定義在函數和打括號外部{}的變量
  • go 學習筆記之解讀什麼是defer延遲函數
    >[4]go 語言 defer 你不知道的秘密![5]Go 語言中 defer 的一些坑[6]go defer (go 延遲函數)[7]參考資料[1]Deferstatements: https://golang.google.cn/ref/spec#Defer_statements[2]Defer_statements: https://golang.google.cn/ref/spec#Defer_statements[3]go語言的defer語句
  • 「語言學習」Go語言之slice特性
    Go語言學習slice介紹和說明golang的數據結構也很多,如List,array,map等,但是有個很特別的數據結構是slice,也叫切片經常看到很多和數組的定義有關的操作是 make([]string, 10)。那麼什麼是slice呢?其實slice也算是golang語言特有的數據結構,底層是以數組作為支撐;啥概念呢,就是說在申請一塊內存進行數組的存放的時候,slice就像數組對外開放的一扇窗口,讓你看到想給你看到的內容。
  • 深入理解 Go 語言 defer
    MOVQ $0x1, 0x8(SP) bar.go:6 0x104ea79 48c744241002000000 MOVQ $0x2, 0x10(SP) bar.go:6 0x104ea82 c3 RET也就是說 return 語句不是原子操作,而是被拆成了兩步而 defer 語句就是在這兩條語句之間執行,也就是另外在
  • go 學習筆記之值得特別關注的基礎語法有哪些
    語言中文網」關注我們,設個星標,每天學習Go語言在上篇文章中,我們動手親自編寫了第一個 Go 語言版本的 HelloWorld,並且認識了 Go 語言中有意思的變量和不安分的常量.相信通過上篇文章的斐波那契數列,你已經初步掌握了 Go 語言的變量和常量與其他主要的程式語言的異同,為了接下來更好的學習和掌握 Go 的基礎語法,下面先簡單回顧一下變量和常量相關知識.