📕
Go 語言程式設計入門
  • 最新消息
  • 中文版更新日誌
  • 譯者誌謝
  • 01-起步走
    • 01.01-檔案與資料夾
    • 01.02-終端機(Terminal)
    • 01.03-文字編輯器
    • 01.04-Go 的工具
  • 02-你的第一個程式
    • 02.01-如何讀 Go 程式
    • 02.02-問題
  • 03-型別
    • 03.01-數字
    • 03.02-字串
    • 03.03-問題
  • 04-變數
    • 04.01-如何命名變數
    • 04.02-Scope(變數的作用範圍)
    • 04.03-常數(Constant)
    • 04.04-定義多個變數
    • 04.05-範例程式
    • 04.06-問題
  • 05-控制結構
    • 05.01-For
    • 05.02-If
    • 05.03-switch
    • 05.04-問題
  • 06-Array、Slice 與 Map
    • 06.01-陣列(Array)
    • 06.02-Slice
    • 06.03-Map
    • 06.04-問題
  • 07-函式
    • 07.01-你的第二個函式
    • 07.02-回傳多個值
    • 07.03-參數個數可變的函式(Variadic Function)
    • 07.04-Closure
    • 07.05-遞迴(Recursive)
    • 07.06-Defer, Panic & Recover
    • 07.07-Panic & Recover
    • 07.08-問題
  • 08-指標
    • 08.01-「*」與「&」運算符號
    • 08.02-new
    • 08.03-問題
  • 09-Struct 與 Interface
    • 09.01-struct
    • 09.02-Method
    • 09.03-Interface
    • 09.04-問題
  • 10-Concurrency(平行處理)
    • 10.01-Goroutine
    • 10.02-Channel
    • 10.03-問題
  • 11-Packages
    • 11.01-建立 Package
    • 11.02-文件
    • 11.03-問題
  • 12-測試
  • 13-The Core Packages
    • 13.01-字串
    • 13.02-輸入與輸出
    • 13.03-檔案與資料夾
    • 13.04-錯誤訊息
    • 13.05-Container 與 Sort
    • 13.06-雜湊&加解密
    • 13.07-伺服器
    • 13.08-解析命令列參數
    • 13.09-Synchronization Primitives(同步處理原始物件)
  • 14-下一步
    • 14.01-閱讀大師作品
    • 14.02-動手實作
    • 14.03-團隊合作
  • 15. 附錄-額外資源
Powered by GitBook
On this page
Edit on GitHub
  1. 13-The Core Packages

13.05-Container 與 Sort

Previous13.04-錯誤訊息Next13.06-雜湊&加解密

Last updated 2 years ago

在 Go 語言中,除了 list 與 map,在 container package 中還有幾個可用的套件。我們會先以 container/list 為例進行探討。

List

container/list package 實做了一個雙向鏈結串列(doubly-linked list),一個鏈結串列是一種如下所示的資料結構:

串列中的每個節點都會包含一個值(此例為1、2或3)以及一個指向下一個節點的指標。因為這是一個雙向鏈結串列,所以每一個節點還會使用一個指標來指向前一個節點,可使用下列的程式建立一個這樣的串列:

package main

import ("fmt" ; "container/list")

func main() {
    var x list.List
    x.PushBack(1)
    x.PushBack(2)
    x.PushBack(3)

    for e := x.Front(); e != nil; e=e.Next() {
        fmt.Println(e.Value.(int))
    }
}

數值為零的 List 是一個空的串列(而 *List 也能使用 list.New 來建立)。可以使用 PushBack 將值附加到串列後方,我們使用迴圈從串列的第一個元素(element)開始,依序取得串列中的每個節點值,直到遇到結尾的 nil 為止。

Sort

Sort package 有一些能夠排序任意資料的函式。有幾個預先定義好的排序函式(供 int 與 float 的 slice 使用),此處有一個範例,示範如何排序你自的資料:

package main

import ("fmt" ; "sort")

type Person struct { 
    Name string
    Age int
}

type ByName []Person

func (this ByName) Len() int {
    return len(this)
}
func (this ByName) Less(i, j int) bool {
    return this[i].Name < this[j].Name
}
func (this ByName) Swap(i, j int) {
    this[i], this[j] = this[j], this[i]
}

func main() {
    kids := []Person{
        {"Jill",9},
        {"Jack",10},
    }
    sort.Sort(ByName(kids))
    fmt.Println(kids)
}

在 sort 中的 Sort 函式接收一個 sort.Interface,並對它進行排序,sort.Interface 需要三個 methods:分別是 Len、Less 與 Swap。為了定義我們自己的排序,我們會建立一個新的型別(ByName),並且讓它等於我們想要排序的一個 slice。接著我們定義這三個 methods。

接著要將我們的 people 串列進行排序就如同要將串列強制轉型為我們的新型別一樣簡單,我們可以這樣來依據年齡(age)進行排序:

type ByAge []Person
func (this ByAge) Len() int {
    return len(this)
}
func (this ByAge) Less(i, j int) bool {
    return this[i].Age < this[j].Age
}
func (this ByAge) Swap(i, j int) {
    this[i], this[j] = this[j], this[i]
}