最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺析Go語(yǔ)言容器之?dāng)?shù)組和切片的使用

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

在 Java 的核心庫(kù)中,集合框架可謂鼎鼎大名:Array 、List、Set、Queue、HashMap 等等,隨便拎一個(gè)出來(lái)都值得開(kāi)發(fā)者好好學(xué)習(xí)如何使用甚至是背后的設(shè)計(jì)源碼(這類文章也挺多,大家上網(wǎng)隨便一搜)。

雖然 Go 語(yǔ)言沒(méi)有如此豐富的容器類型,但也有一些基本的容器供開(kāi)發(fā)者使用,接下來(lái)讓我們一一認(rèn)識(shí)這些容器類型吧。

序列容器

序列容器存儲(chǔ)特定類型的數(shù)據(jù)元素。目前有 5 種序列容器的實(shí)現(xiàn):

  • array
  • vector
  • deque
  • list
  • forward_list

這些序列容易可以用順序的方式保存數(shù)據(jù),利用這些序列容易能夠編寫有效的代碼,重復(fù)使用標(biāo)準(zhǔn)庫(kù)的模塊化。

數(shù)組

Go 語(yǔ)言中的數(shù)組類型有點(diǎn)類似 C++ 中的數(shù)據(jù),Go 的數(shù)組初始化定義后,在編譯時(shí)就不會(huì)再變更。

定義數(shù)組的方式如下:

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

[n]T 類型就表示含有 n 個(gè)類型為 T 的數(shù)組,本例中就是 a 變量表示含有 10 個(gè) int 類型的整型數(shù)組;b 變量表示含有 5 個(gè) string 類型的字符串?dāng)?shù)組。 數(shù)組的長(zhǎng)度作為其類型的一部分,因此數(shù)組的長(zhǎng)度是無(wú)法調(diào)整的。

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)
}

運(yùn)行結(jié)果如下:

Vector

你可能會(huì)好奇,Go 語(yǔ)言又沒(méi)有 C++ 中的 Vector 類型,為什么會(huì)舉出這個(gè)例子。

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

一個(gè)數(shù)組有固定的大小,但切片是一個(gè)動(dòng)態(tài)、靈活的數(shù)組元素的視圖,在實(shí)際中,切片比數(shù)組更為常見(jiàn)。

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

切片通過(guò)指定兩個(gè)切點(diǎn) a[low : high],可以定義如下的 sliceExample 切片:

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

切片對(duì)比數(shù)組的最大優(yōu)點(diǎn)就是:可以隨著增加和刪除來(lái)增加或減少容器的大小。我們來(lái)看一個(gè)例子:

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)
}

運(yùn)行結(jié)果如下圖:

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

Deque

Deque,即雙端隊(duì)列,是一個(gè)可以擴(kuò)展的容器。擴(kuò)展可以發(fā)生在容器的前面或后面。當(dāng)隊(duì)列的頂部或尾部需要經(jīng)常被引用時(shí),經(jīng)常使用雙端隊(duì)列。

Go 官網(wǎng)有一個(gè)雙端隊(duì)列的實(shí)現(xiàn),官方地址點(diǎn)此處。

下面的代碼塊顯示了 Go 雙端隊(duì)列 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("隊(duì)列長(zhǎng)度為: ", q.Len())  // Prints: 4
	fmt.Println("隊(duì)首為元素:", q.Front()) // Prints: I
	fmt.Println("隊(duì)尾為元素: ", 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())
	}
}

運(yùn)行結(jié)果如圖:

List

List 在 Go 語(yǔ)言中有一個(gè)雙鏈表的實(shí)現(xiàn),它位于內(nèi)置標(biāo)準(zhǔn)庫(kù) container/list 包中,官網(wǎng)地址為:https://pkg.go.dev/container/list

我們可以直接使用這個(gè)鏈表的實(shí)現(xiàn):

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)
	}

}

運(yùn)行結(jié)果為:

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

單鏈表

最后介紹一下單鏈表,如果我們想實(shí)現(xiàn)的數(shù)據(jù)結(jié)構(gòu)并沒(méi)有標(biāo)準(zhǔn)的容器集成,此時(shí)我們就可以通過(guò)自己根據(jù)要求來(lái)寫一個(gè)自己想要的容器類型,這里以頭插法的單鏈表舉例:

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)
	}
}

運(yùn)行結(jié)果如圖:

當(dāng)然,還有更多的容器方法可以等著自己去擴(kuò)充,這一部分讀者感興趣可以在算法和數(shù)據(jù)結(jié)構(gòu)的知識(shí)點(diǎn)中進(jìn)行學(xué)習(xí)。

總結(jié)

本文介紹了 Go 語(yǔ)言的數(shù)組和切片類型,接著介紹了 Go 標(biāo)準(zhǔn)包 container 中的 list,最后實(shí)現(xiàn)了一個(gè)頭插法的單鏈表。如果在日常開(kāi)發(fā)過(guò)程中,有什么容器需要使用,可以從 pkg.go.dev/ 進(jìn)行搜索,會(huì)有很多開(kāi)源的 Go 優(yōu)秀開(kāi)源包,無(wú)論是學(xué)習(xí)還是使用,都能收獲滿滿。

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

相關(guān)文章

  • Go語(yǔ)言使用Redis和Etcd實(shí)現(xiàn)高性能分布式鎖

    Go語(yǔ)言使用Redis和Etcd實(shí)現(xiàn)高性能分布式鎖

    這篇文章主要為大家介紹了Go語(yǔ)言使用Redis實(shí)現(xiàn)高性能分布式鎖示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • Go?mod包管理工具詳解

    Go?mod包管理工具詳解

    Go?mod作為Go語(yǔ)言的官方包管理工具,可以幫助開(kāi)發(fā)者更好地管理包和依賴,提高開(kāi)發(fā)效率和項(xiàng)目可維護(hù)性,本文將介紹Go語(yǔ)言的包和依賴管理,以及Go?mod的作用和優(yōu)勢(shì),需要的朋友可以參考下
    2023-05-05
  • Go語(yǔ)言超時(shí)退出的三種實(shí)現(xiàn)方式總結(jié)

    Go語(yǔ)言超時(shí)退出的三種實(shí)現(xiàn)方式總結(jié)

    這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言中超時(shí)退出的三種實(shí)現(xiàn)方式,文中的示例代碼簡(jiǎn)潔易懂,對(duì)我們深入了解Go語(yǔ)言有一定的幫助,需要的可以了解一下
    2023-06-06
  • 夯實(shí)Golang基礎(chǔ)之?dāng)?shù)據(jù)類型梳理匯總

    夯實(shí)Golang基礎(chǔ)之?dāng)?shù)據(jù)類型梳理匯總

    這篇文章主要8為大家介紹了夯實(shí)Golang基礎(chǔ)之?dāng)?shù)據(jù)類型梳理匯總,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2023-10-10
  • ???????Golang實(shí)現(xiàn)RabbitMQ中死信隊(duì)列幾種情況

    ???????Golang實(shí)現(xiàn)RabbitMQ中死信隊(duì)列幾種情況

    本文主要介紹了???????Golang實(shí)現(xiàn)RabbitMQ中死信隊(duì)列幾種情況,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • golang中defer的使用規(guī)則詳解

    golang中defer的使用規(guī)則詳解

    大家應(yīng)該都知道在golang當(dāng)中,defer代碼塊會(huì)在函數(shù)調(diào)用鏈表中增加一個(gè)函數(shù)調(diào)用。下面這篇文章主要給大家介紹了關(guān)于golang中defer的使用規(guī)則,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。
    2017-07-07
  • go語(yǔ)言中嵌套結(jié)構(gòu)體的實(shí)現(xiàn)

    go語(yǔ)言中嵌套結(jié)構(gòu)體的實(shí)現(xiàn)

    在Go語(yǔ)言中,嵌套結(jié)構(gòu)體可定義為一個(gè)結(jié)構(gòu)體內(nèi)包含另一個(gè)結(jié)構(gòu)體,嵌套可以是值嵌套或指針嵌套,兩者在內(nèi)存分配和修改影響上有顯著區(qū)別,本文就來(lái)詳細(xì)的介紹一下,感興趣的可以了解一下
    2024-09-09
  • 如何編寫Go語(yǔ)言中間件的實(shí)例教程

    如何編寫Go語(yǔ)言中間件的實(shí)例教程

    不知道大家有沒(méi)有寫過(guò)中間件呢,它是怎么寫的呢?下面這篇文中就來(lái)給大家分享一下使用Go,如何編寫中間件,文中通過(guò)示例代碼介紹的非常詳細(xì),供大家參考學(xué)習(xí),下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-04-04
  • grpc-go如何通過(guò)context傳遞額外數(shù)據(jù)

    grpc-go如何通過(guò)context傳遞額外數(shù)據(jù)

    metadata是grpc內(nèi)置的,用RPC服務(wù)傳遞http頭數(shù)據(jù),分in和out兩種,對(duì)應(yīng)的key都為一個(gè)空struct,這篇文章主要介紹了grpc-go通過(guò)context傳遞額外數(shù)據(jù),需要的朋友可以參考下
    2024-02-02
  • golang簡(jiǎn)單位運(yùn)算示例

    golang簡(jiǎn)單位運(yùn)算示例

    這篇文章主要介紹了golang簡(jiǎn)單位運(yùn)算,包括位移運(yùn)算、取反及位與位或等運(yùn)算,需要的朋友可以參考下
    2016-07-07

最新評(píng)論

涞源县| 合江县| 正宁县| 隆林| 延长县| 库伦旗| 西昌市| 富锦市| 南充市| 娄烦县| 固安县| 保康县| 日土县| 开鲁县| 黄大仙区| 兴义市| 木里| 芷江| 四子王旗| 昆山市| 郑州市| 辰溪县| 景洪市| 赫章县| 宜川县| 海原县| 红河县| 凤庆县| 留坝县| 茂名市| 新泰市| 方正县| 化德县| 衡山县| 固镇县| 大丰市| 深水埗区| 邵东县| 晋州市| 德格县| 安阳市|