五、golang基礎之slice和map

文章目錄

  • 一、slice
    • (一)含義
    • (二)定義切片
    • (三)切片初始化
    • (四)len() 和 cap() 函數
    • (五)空(nil)切片
    • (六)切片截取
    • (七)append() 和 copy() 函數
  • 二、map

一、slice

(一)含義

Go 語言切片是對數組的抽象。

Go 數組的長度不可改變,在特定場景中這樣的集合就不太適用,Go中提供了一種靈活,功能強悍的內置類型切片(“動態數組”),與數組相比切片的長度是不固定的,可以追加元素,在追加時可能使切片的容量增大。

(二)定義切片

你可以聲明一個未指定大小的數組來定義切片:

var identifier []type;

切片不需要說明長度。

或使用make()函數來創建切片:

var slice1 []type = make([]type,len);
也可以簡寫為
slice1 := make([]type, len)

也可以指定容量,其中capacity為可選參數。

make([]T,length,capacity);

這里 len 是數組的長度并且也是切片的初始長度。

(三)切片初始化

s :=[] int {1,2,3 }

直接初始化切片,[]表示是切片類型,{1,2,3}初始化值依次是1,2,3.其cap=len=3

s := arr[:]

初始化切片s,是數組arr的引用

s := arr[startIndex:endIndex]

將arr中從下標startIndex到endIndex-1 下的元素創建為一個新的切片

s := arr[startIndex:]

缺省endIndex時將表示一直到arr的最后一個元素

s := arr[:endIndex]

缺省startIndex時將表示從arr的第一個元素開始

s1 := s[startIndex:endIndex]

通過切片s初始化切片s1

s :=make([]int,len,cap)

通過內置函數make()初始化切片s,[]int 標識為其元素類型為int的切片

(四)len() 和 cap() 函數

切片是可索引的,并且可以由 len() 方法獲取長度。

切片提供了計算容量的方法 cap() 可以測量切片最長可以達到多少。

以下為具體實例:

package mainimport "fmt"func main() {var numbers = make([]int,3,5)printSlice(numbers)
}func printSlice(x []int){fmt.Printf("len=%d cap=%d slice=%v\n",len(x),cap(x),x)
}

len=3 cap=5 slice=[0 0 0]

(五)空(nil)切片

一個切片在未初始化之前默認為 nil,長度為 0,實例如下:

package mainimport "fmt"func main() {var numbers []intprintSlice(numbers)if(numbers == nil){fmt.Printf("切片是空的")}
}func printSlice(x []int){fmt.Printf("len=%d cap=%d slice=%v\n",len(x),cap(x),x)
}

len=0 cap=0 slice=[]
切片是空的

(六)切片截取

可以通過設置下限及上限來設置截取切片[lower-bound:upper-bound],實例如下:

package mainimport "fmt"func main() {/* 創建切片 */numbers := []int{0,1,2,3,4,5,6,7,8}   printSlice(numbers)/* 打印原始切片 */fmt.Println("numbers ==", numbers)/* 打印子切片從索引1(包含) 到索引4(不包含)*/fmt.Println("numbers[1:4] ==", numbers[1:4])/* 默認下限為 0*/fmt.Println("numbers[:3] ==", numbers[:3])/* 默認上限為 len(s)*/fmt.Println("numbers[4:] ==", numbers[4:])numbers1 := make([]int,0,5)printSlice(numbers1)/* 打印子切片從索引  0(包含) 到索引 2(不包含) */number2 := numbers[:2]printSlice(number2)/* 打印子切片從索引 2(包含) 到索引 5(不包含) */number3 := numbers[2:5]printSlice(number3)}func printSlice(x []int){fmt.Printf("len=%d cap=%d slice=%v\n",len(x),cap(x),x)
}

執行以上代碼輸出結果為:

len=9 cap=9 slice=[0 1 2 3 4 5 6 7 8]
numbers == [0 1 2 3 4 5 6 7 8]
numbers[1:4] == [1 2 3]
numbers[:3] == [0 1 2]
numbers[4:] == [4 5 6 7 8]
len=0 cap=5 slice=[]
len=2 cap=9 slice=[0 1]
len=3 cap=7 slice=[2 3 4]

(七)append() 和 copy() 函數

如果想增加切片的容量,我們必須創建一個新的更大的切片并把原分片的內容都拷貝過來。

下面的代碼描述了從拷貝切片的 copy 方法和向切片追加新元素的 append 方法。

package mainimport "fmt"func main() {var numbers []intprintSlice(numbers)/* 允許追加空切片 */numbers = append(numbers, 0)printSlice(numbers)/* 向切片添加一個元素 */numbers = append(numbers, 1)printSlice(numbers)/* 同時添加多個元素 */numbers = append(numbers, 2,3,4)printSlice(numbers)/* 創建切片 numbers1 是之前切片的兩倍容量*/numbers1 := make([]int, len(numbers), (cap(numbers))*2)/* 拷貝 numbers 的內容到 numbers1 */copy(numbers1,numbers)printSlice(numbers1)   
}
func printSlice(x []int){fmt.Printf("len=%d cap=%d slice=%v\n",len(x),cap(x),x)
}
len=0 cap=0 slice=[]
len=1 cap=1 slice=[0]
len=2 cap=2 slice=[0 1]
len=5 cap=6 slice=[0 1 2 3 4]
len=5 cap=12 slice=[0 1 2 3 4]

二、map

map和slice類似,只不過是數據結構不同,下面是map的一些聲明方式。

package main
import ("fmt"
)func main() {//第一種聲明var test1 map[string]string//在使用map前,需要先make,make的作用就是給map分配數據空間test1 = make(map[string]string, 10) test1["one"] = "php"test1["two"] = "golang"test1["three"] = "java"fmt.Println(test1) //map[two:golang three:java one:php]//第二種聲明test2 := make(map[string]string)test2["one"] = "php"test2["two"] = "golang"test2["three"] = "java"fmt.Println(test2) //map[one:php two:golang three:java]//第三種聲明test3 := map[string]string{"one" : "php","two" : "golang","three" : "java",}fmt.Println(test3) //map[one:php two:golang three:java]language := make(map[string]map[string]string)language["php"] = make(map[string]string, 2)language["php"]["id"] = "1"language["php"]["desc"] = "php是世界上最美的語言"language["golang"] = make(map[string]string, 2)language["golang"]["id"] = "2"language["golang"]["desc"] = "golang抗并發非常good"fmt.Println(language) //map[php:map[id:1 desc:php是世界上最美的語言] golang:map[id:2 desc:golang抗并發非常good]]//增刪改查// val, key := language["php"]  //查找是否有php這個子元素// if key {//     fmt.Printf("%v", val)// } else {//     fmt.Printf("no");// }//language["php"]["id"] = "3" //修改了php子元素的id值//language["php"]["nickname"] = "啪啪啪" //增加php元素里的nickname值//delete(language, "php")  //刪除了php子元素fmt.Println(language)
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/37525.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/37525.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/37525.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2024HVV最新POC/EXP,目前有8000+個POC/EXP

點擊"仙網攻城獅”關注我們哦~ 不當想研發的滲透人不是好運維 讓我們每天進步一點點 簡介 都是網上收集的POC和EXP,最新收集時間是2024年五月,需要的自取。 表里沒有的可以翻翻之前的文章,資源比較零散沒有整合起來。 文件鏈接&#xff…

hexo博客搭建

系列文章目錄 文章目錄 系列文章目錄前言1. 環境配置2. 打包并發布到github倉庫3. 生成ssh秘鑰4.vscode配置本地與遠端相對路徑不一致問題總結 前言 本文主要介紹了hexo博客怎么搭建 1. 環境配置 安裝git、nodejs、npm創建博客文件夾blogcmd輸入命令npm install -g hexo初始化…

10波形震蕩原因及采集設備安裝視頻

10波形震蕩原因及采集設備安裝視頻 排查過程算法軟件后臺解碼計算嵌入式采集設備準備視頻 結語其他以下是廢話 之前說過:“解決不了的真的就不是我這邊能解決的了”,這是因為我們充分排查了自身,那么問題出在哪里呢? 不愿溝通、不…

Spring Boot 全面解析:從入門到實踐案例

引言: Spring Boot 是由 Pivotal 團隊提供的全新框架,旨在簡化 Spring 應用的初始搭建以及開發過程。它基于 Spring 平臺,通過“約定優于配置”的原則,盡可能自動化配置,減少XML配置,使得開發者能夠快速啟…

矢量數據庫:概念、歷史、現狀與展望?

矢量數據庫:概念、歷史、現狀與展望? 李升偉 概念:矢量數據庫是一種專門用于存儲、檢索和搜索矢量的數據庫。在數據科學和機器學習中,矢量是表示數據的有序列表或數字序列,可以表示各種類型的數據,如文本…

阿里云智能編程助手的安裝使用

https://help.aliyun.com/document_detail/2590613.html 通義靈碼,是阿里云出品的一款基于通義大模型的智能編碼輔助工具,提供行級/函數級實時續寫、自然語言生成代碼、單元測試生成、代碼優化、注釋生成、代碼解釋、研發智能問答、異常報錯排查等能力&a…

前后端防重復提交

數據重復提交是一個大忌,會帶來無效數據,應該在前端和后端都建議檢測防范。 前端一般是按鈕按下觸發數據提交,如果用戶鼠標操作習慣不好,或者鼠標或系統設置問題會導致鼠標連擊,如果前端不做相關處理,可能會…

洞察數據資產的奧秘:深入剖析數據資產在企業運營中的核心作用,提出一套全面、系統的數據資產解決方案,幫助企業實現數據資產的最大化利用和增值

一、引言 在數字化浪潮洶涌的今天,數據已成為企業最寶貴的資產之一。數據資產不僅記錄了企業的歷史運營軌跡,更蘊含著指導未來決策的智慧。然而,如何有效管理、利用這些數據資產,使其轉化為企業的競爭優勢和利潤增長點&#xff0…

Vue3-04_組件基礎_下

props驗證 指的是在封裝組件時對外界傳遞過來的 props 數據進行合法性的校驗,從而防止數據不合法的問題。 使用數組類型的 props 節點的缺點是無法為每個 prop 指定具體的數據類型。 使用對象類型的 props 節點,可以對每個 prop 進行數據類型的校驗&am…

【云服務-5】Elasticsearch

Elasticsearch是什么?和大數據的關系? Elasticsearch 是一個分布式、開源的搜索和分析引擎,建立在 Apache Lucene 庫之上。它的主要特點包括: (1)快速、可擴展的搜索和分析能力 (2)支持多租戶和高可用性 …

python--基礎篇--正則表達式--py腳本--題目解答

文章目錄 驗證輸入用戶名和QQ號是否有效并給出對應的提示信息從一段文字中提取出國內手機號碼替換字符串中的不良內容拆分長字符串 驗證輸入用戶名和QQ號是否有效并給出對應的提示信息 """ 驗證輸入用戶名和QQ號是否有效并給出對應的提示信息要求:用…

常用數據庫簡單介紹

1. MySQL 優勢: 開源和免費:MySQL 是一個開源數據庫,擁有龐大的社區支持,易于獲取和使用。性能優秀:對于中小型項目,MySQL 提供了高效的性能和響應速度。跨平臺支持:MySQL 可以在各種操作系統…

扎克伯格抨擊閉源人工智能競爭對手試圖“創造上帝”

Meta 首席執行官馬克-扎克伯格(Mark Zuckerberg)在周四發表的一篇訪談中談到了他對人工智能未來的看法,他深信"不會只有一種人工智能"。扎克伯格強調了開源的價值,即把人工智能工具交到許多人手中,他還不忘貶…

抖音微短劇小程序源碼搭建:實現巨量廣告數據高效回傳

在數字化營銷日益盛行的今天,抖音微短劇小程序已成為品牌與觀眾互動的新渠道。這些短小精悍的劇目不僅能迅速抓住用戶的注意力,還能有效提升品牌的知名度和用戶黏性。然而,想要充分利用這一營銷工具,關鍵在于如何高效地追蹤廣告數…

堆的 shift down

堆的 shift down 堆(Heap)是一種特殊的完全二叉樹,它通常用于實現優先隊列。在堆中,每個節點的值都大于或等于(在最大堆中)或小于或等于(在最小堆中)其子節點的值。堆的操作包括插入元素(shift up)和刪除元素(shift down 或 bubble down)。 本文將重點介紹堆的 s…

HDFS EC文件損壞恢復方法

HDFS EC低版本存在許多bug,導致文件損壞,這些bug是在一定的條件下才有機率性的錯誤重構。 我們當前版本是3.1.1,使用前已修復部署EC patch了,但還是損壞了文件,而且這些文件是無任何提示異常的。是在進行讀數據的時候…

從0開始學習pyspark--pyspark的啟動模式[第1節]

PySpark是Apache Spark的Python API,它能夠在分布式計算環境中處理大規模數據。PySpark可以在幾種不同的模式下運行,主要包括以下三種: 本地模式(Local Mode)集群模式(Cluster Mode)客戶端模式…

springboot中使用springboot cache

前言&#xff1a;SpringBoot中使用Cache緩存可以提高對緩存的開發效率 此圖片是SpringBootCache常用注解 Springboot Cache中常用注解 第一步&#xff1a;引入依賴 <!--緩存--><dependency><groupId>org.springframework.boot</groupId><artifactId…

使用ExpandableListView創建可擴展列表

使用ExpandableListView創建可擴展列表 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01;今天我們將深入探討如何使用Android中的ExpandableListView創建可擴展列…

【linux】gcc快速入門教程

目錄 一.gcc簡介 二.gcc常用命令 一.gcc簡介 gcc 是GNU Compiler Collection&#xff08;GNU編譯器套件&#xff09;。就是一個編譯器。編譯一個源文件的時候可以直接使用&#xff0c;但是源文件數量太多時&#xff0c;就很不方便&#xff0c;于是就出現了make 工具 二.gcc…