欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺析Go語言容器之數組和切片的使用

 更新時間:2022年11月01日 15:56:21   作者:宇宙之一粟  
在?Java?的核心庫中,集合框架可謂鼎鼎大名:Array?、List、Set等等,隨便拎一個出來都值得開發(fā)者好好學習如何使用甚至是背后的設計源碼。雖然Go語言沒有如此豐富的容器類型,但也有一些基本的容器供開發(fā)者使用,接下來讓我們認識一下這些容器類型吧

在 Java 的核心庫中,集合框架可謂鼎鼎大名:ArrayList、SetQueue、HashMap 等等,隨便拎一個出來都值得開發(fā)者好好學習如何使用甚至是背后的設計源碼(這類文章也挺多,大家上網隨便一搜)。

雖然 Go 語言沒有如此豐富的容器類型,但也有一些基本的容器供開發(fā)者使用,接下來讓我們一一認識這些容器類型吧。

序列容器

序列容器存儲特定類型的數據元素。目前有 5 種序列容器的實現:

  • array
  • vector
  • deque
  • list
  • forward_list

這些序列容易可以用順序的方式保存數據,利用這些序列容易能夠編寫有效的代碼,重復使用標準庫的模塊化。

數組

Go 語言中的數組類型有點類似 C++ 中的數據,Go 的數組初始化定義后,在編譯時就不會再變更。

定義數組的方式如下:

var a [10]int
b := [5]string {"H", "e", "l", "l", "o"}

[n]T 類型就表示含有 n 個類型為 T 的數組,本例中就是 a 變量表示含有 10 個 int 類型的整型數組;b 變量表示含有 5 個 string 類型的字符串數組。 數組的長度作為其類型的一部分,因此數組的長度是無法調整的。

package main

import "fmt"

func main() {
	var a [10]int
	a[0] = 2022
	a[1] = 2023
	
	fmt.Println(a[0], a[1])
	fmt.Println(a)

	b := [5]string {"H", "e", "l", "l", "o"}
	
	fmt.Println(b)
}

運行結果如下:

Vector

你可能會好奇,Go 語言又沒有 C++ 中的 Vector 類型,為什么會舉出這個例子。

其實 Go 最初有一個 Vector 類型的實現,但在 2011 年 10 月 11 日,在 Go 語言的開發(fā)階段被刪除了。保留了現在的切片,而切片就變成了實際上更好的 Vector 實現。

一個數組有固定的大小,但切片是一個動態(tài)、靈活的數組元素的視圖,在實際中,切片比數組更為常見。

[]T 表示是一個具有類型 T 的元素切片,[]byte 是 byte slice,指元素為 byte 的 slice;[]string 是 string slice,指元素為 string 的 slice。

切片通過指定兩個切點 a[low : high],可以定義如下的 sliceExample 切片:

sliceExample := []string{"Say", "Hello", "to", "you"}

切片對比數組的最大優(yōu)點就是:可以隨著增加和刪除來增加或減少容器的大小。我們來看一個例子:

package main

import "fmt"

// remove i indexed item in a slice
func remove(s []string, i int) []string {
	copy(s[i:], s[i+1:])
	return s[:len(s)-1]
}

func main() {
	primes := [6]int{2, 3, 5, 7, 11, 13}

	var s []int = primes[1:4]
	fmt.Println(s)

	sliceExample := []string{"Say", "Hello", "to", "you"}
	sliceExample = append(sliceExample, ",My Gopher Friends~")

	fmt.Println("Append Slice: ", sliceExample)

	sliceExample = remove(sliceExample, 0)

	fmt.Println("After Removed Item: ", sliceExample)
}

運行結果如下圖:

我們分享了 Go 語言提供的容器中的數組和切片,不管是數據還是切片,它們內部的數據類型必須是一致的(要么都是整型、要么都是字符串類型)。但數據的大小是固定,而切片可以根據元素的添加和減少動態(tài)調整容器大小。

Deque

Deque,即雙端隊列,是一個可以擴展的容器。擴展可以發(fā)生在容器的前面或后面。當隊列的頂部或尾部需要經常被引用時,經常使用雙端隊列。

Go 官網有一個雙端隊列的實現,官方地址點此處

下面的代碼塊顯示了 Go 雙端隊列 deque 的使用:

package main

import (
	"fmt"

	"github.com/gammazero/deque"
)

func main() {
	var q deque.Deque[string]
	q.PushBack("I")
	q.PushBack("love")
	q.PushBack("learning")
	q.PushBack("Go")

	fmt.Println("隊列長度為: ", q.Len())  // Prints: 4
	fmt.Println("隊首為元素:", q.Front()) // Prints: I
	fmt.Println("隊尾為元素: ", q.Back()) // Prints: Go

	q.PopFront() // remove "I"
	q.PopBack()  // remove "Go"

	q.PushFront("Hello")
	q.PushBack("World")

	// Consume deque and print elements.
	for q.Len() != 0 {
		fmt.Println(q.PopFront())
	}
}

運行結果如圖:

List

List 在 Go 語言中有一個雙鏈表的實現,它位于內置標準庫 container/list 包中,官網地址為:https://pkg.go.dev/container/list

我們可以直接使用這個鏈表的實現:

package main

import (
	"container/list"
	"fmt"
)

func main() {
	// Create a new list and put some numbers in it.
	l1 := list.New()

	e4 := l1.PushBack(4)
	e1 := l1.PushFront(1)
	l1.InsertBefore(3, e4)
	l1.InsertAfter(2, e1) // now l1 is [1 2 3 4]

	// Iterate through list and print its contents.
	for e := l1.Front(); e != nil; e = e.Next() {
		fmt.Println(e.Value)
	}

	l1.MoveToBack(e1) // now l1 is [4 2 3 1]
	listLength := l1.Len() // length is 4

	fmt.Printf("l1 type: %T\n", l1)
	fmt.Println("l1 length : :", listLength)
	for e := l1.Front(); e != nil; e = e.Next() {
		fmt.Println(e.Value)
	}

}

運行結果為:

1
2
3
4
l1 type: *list.List
l1 length : : 4
2
3
4
1

單鏈表

最后介紹一下單鏈表,如果我們想實現的數據結構并沒有標準的容器集成,此時我們就可以通過自己根據要求來寫一個自己想要的容器類型,這里以頭插法的單鏈表舉例:

package main

import "fmt"

type SinglyLinkedList struct {
	head *LinkedListNode
}

type LinkedListNode struct {
	data string
	next *LinkedListNode
}

func (ll *SinglyLinkedList) Append(node *LinkedListNode) {

	if ll.head == nil {
		ll.head = node
		return
	}

	currentNode := ll.head
	for currentNode.next != nil {
		currentNode = currentNode.next
	}
	currentNode.next = node
}

func main() {
	ll := &SinglyLinkedList{}

	ll.Append(&LinkedListNode{data: "Hello"})
	ll.Append(&LinkedListNode{data: "Gopher"})

	for e := ll.head; e != nil; e = e.next {
		fmt.Println(e.data)
	}
}

運行結果如圖:

當然,還有更多的容器方法可以等著自己去擴充,這一部分讀者感興趣可以在算法和數據結構的知識點中進行學習。

總結

本文介紹了 Go 語言的數組和切片類型,接著介紹了 Go 標準包 container 中的 list,最后實現了一個頭插法的單鏈表。如果在日常開發(fā)過程中,有什么容器需要使用,可以從 pkg.go.dev/ 進行搜索,會有很多開源的 Go 優(yōu)秀開源包,無論是學習還是使用,都能收獲滿滿。

到此這篇關于淺析Go語言容器之數組和切片的使用的文章就介紹到這了,更多相關Go語言數組 切片內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • go程序執(zhí)行交叉編譯的流程步驟

    go程序執(zhí)行交叉編譯的流程步驟

    go程序可用通過交叉編譯的方式在一個平臺輸出多個平臺可運行的二進制包,本文給大家詳細介紹了go程序執(zhí)行交叉編譯的流程步驟,文中有詳細的代碼示例供大家參考,需要的朋友可以參考下
    2024-07-07
  • 加速開發(fā):使用Go語言和Gin框架構建Web項目的利器

    加速開發(fā):使用Go語言和Gin框架構建Web項目的利器

    Go語言和Gin框架是構建高性能Web項目的利器,Go語言的簡潔性和并發(fā)性,以及Gin框架的輕量級和快速路由能力,使開發(fā)者能夠快速構建可靠的Web應用程序,需要的朋友可以參考下
    2023-09-09
  • golang并發(fā)編程中Goroutine 協程的實現

    golang并發(fā)編程中Goroutine 協程的實現

    Go語言中的協程是一種輕量級線程,通過在函數前加go關鍵字來并發(fā)執(zhí)行,具有動態(tài)棧、快速啟動和低內存使用等特點,本文就來詳細的介紹一下,感興趣的可以了解一下
    2024-10-10
  • Golang使用crypto/ed25519實現數字簽名和驗證

    Golang使用crypto/ed25519實現數字簽名和驗證

    本文將深入探討如何在?Golang?中使用?crypto/ed25519?進行數字簽名和驗證,我們將從基本原理開始,逐步引導讀者了解生成密鑰對、進行數字簽名,以及驗證簽名的具體過程,希望對大家有所幫助
    2024-02-02
  • golang修改結構體中的切片值方法

    golang修改結構體中的切片值方法

    這篇文章主要介紹了golang修改結構體中的切片值方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-01-01
  • 解決Go gorm踩過的坑

    解決Go gorm踩過的坑

    這篇文章主要介紹了解決Go gorm踩過的坑,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • Go語言Handler詳細說明

    Go語言Handler詳細說明

    這篇文章主要介紹了Go語言Handler詳細說明,Handler用于處理請求并給予響應。更嚴格地說,用來讀取請求體、并將請求對應的響應字段(respones header)寫入ResponseWriter中,需要的朋友可以參考下
    2022-04-04
  • GoLang語法之標準庫fmt.Printf的使用

    GoLang語法之標準庫fmt.Printf的使用

    fmt包實現了類似C語言printf和scanf的格式化I/O,主要分為向外輸出內容和獲取輸入內容兩大部分,本文就來介紹一下GoLang語法之標準庫fmt.Printf的使用,感興趣的可以了解下
    2023-10-10
  • golang并發(fā)ping主機的方法

    golang并發(fā)ping主機的方法

    今天小編就為大家分享一篇golang并發(fā)ping主機的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • Golang使用Swagger文檔教程詳解

    Golang使用Swagger文檔教程詳解

    這篇文章主要為大家詳細介紹Golang使用Swagger文檔教程的相關知識,文中通過示例代碼講解詳細,具有一定的借鑒價值,感興趣的小伙伴可以學習一下
    2023-12-12

最新評論