Go的100天之旅-06數組和Slice

来源:https://www.cnblogs.com/pirate-hcc/archive/2020/07/16/13326499.html
-Advertisement-
Play Games

數組 Go的數組和其它語言基本上一樣,是長度固定的特定類型元素組成的序列,這基本上是所有語言數組的特性。和其它語言相比差異主要在聲明和初始化的寫法上,下麵是簡單聲明一個數組: var a [5]int fmt.Println(a[0]) fmt.Println(fmt.Println(a[len(a ...


目錄

數組

Go的數組和其它語言基本上一樣,是長度固定的特定類型元素組成的序列,這基本上是所有語言數組的特性。和其它語言相比差異主要在聲明和初始化的寫法上,下麵是簡單聲明一個數組:

var a [5]int 
fmt.Println(a[0]) 
fmt.Println(fmt.Println(a[len(a)-1])) 

上面的a是一個長度為5的整數數組,如果沒有給定初始值它裡面的元素預設值是0Go數組的下標是從0開始的,len函數返回數組中元素的個數。我們可以在聲明數組的時候初始化它的值:

var m [3]int = [3]int{1, 2, 3}
var n [3]int = [3]int{2, 3}

這裡的mn都是長度為3的數組,m對應的值是1, 2, 3而由於n初始化的時候只有2個值,因此它裡面的值是2, 3, 0
如果採用簡單聲明:=的方式聲明一個數組,可以指定數組的大小,也可以不指定大小這時它會根據初始化值的個數來確定:

a := [10]int{} //元素都為0
b := [...]int{1, 2} //長度為2

Go 也可以直接指定一個索引和值,來初始化,如果聲明的時候長度不指定,那最大的索引加1就是數組的長度:

a := [10]int{1:2} // 長度10,a[1] = 2 其它為0
b := [...]int{1:2, 10:1} //長度11,a[1] = 2 a[10] = 1其它為0

數組a長度聲明是10,只給了索引1的值為2,其餘都為0。數組b聲明的時候索引12101,它的長度是11

修改數組中某個索引的值方式和其它語言一樣:

a := [10]int{}
a[0] = 10

數組的類型是由元素的類型和長度共同決定的,[3]int[4]int是兩種不同的數組類型。因此:

a := [3]int{1, 2, 3}
a = [4]int{1, 2, 3, 4}

編譯的時候會報錯,而:

a := [3]int{1, 2, 3}
a = [3]int{4, 5, 6}

是正確的

Slice

上面說的數組長度是固定,使用的時候不是很靈活,slice的長度是可變,簡單聲明一個未初始化的slice

var a []int
print(len(a))
print(cap(a))

slice也可以利用len返回它的長度,剛纔聲明的slice長度為0。除了長度slice還有一個容量cap的概念,用cap可以返回它的容量。長度不能超過它的容量。slice的聲明也可以用make,用make聲明可以指定容量和可以不指定容量,這時容量和長度一致:

a := make([]int, 10) //長度為10,容量為10
a := make([]int, 10, 12) //長度為10 容量為12

slice可以進行切片操作slice[i:j],創建一個新的slice,新的slice範圍是原來slice下標ij-1,也可以不指定下標slice[:j]則是預設從0j-1,同理如果slice[i:]就是從i到最後一個元素,下麵是一個簡單的例子:

a := []int {1, 2, 3, 4, 5}
b = a[1:2]
c = a[:2]
d = a[1:]

需要註意的是切片操作slice[i:j]j可以大於slice的長度,只要它小於容量

剛纔一直講到容量,那它到底有什麼實際意義呢?開始slice的時候說過它長度是可變的,哪怎麼改變了?通過append就可以對slice追加元素,這時容量就有作用了,如果append的時候當前長度小於容量,那slice不會擴大容量,也不會申請新的空間,而是在原來的基礎上把長度加1就行了,如果容量等於長度,則會擴容,擴容會申請新的空間。

package main

func main() {
	a := make([]int, 10, 11)
	a = append(a, 1)
	println(len(a), cap(a)) // 11 11

	a = append(a, 1)
	println(len(a), cap(a)) // 12 12
}

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前端VUE頁面上的導出或者下載功能,一般是調用後端的一個介面,由介面生成excel,word這些文件的流信息,返回給vue,然後由vue去構建下載的動作,這邊整理了一下,封裝了一下,方便以後復用。 封裝一個download文件 使用年月日時分秒毫秒做為文件的名稱,下載為excel文件 /** * 下 ...
  • 對於前端入行現在大概有這麼幾種:1.大學里修前端課程,2.查資料看視頻自學前端,3.參加前端培訓。 對於這三種學習方式,自學前端是屬於最難的一種,咱們先簡單的說一下另外兩種方式, 然後我再著重說下自學前端。除了自學前端外,外兩種學習式稱為被動學習。大家可以看到,不管是大學里前端課程還是培訓學習,都有 ...
  • 作者:阿翔 如果你已經閱讀過 《京喜前端自動化測試之路(一)》,可跳過前言部分閱讀。 前言 京喜(原京東拼購)項目,作為京東戰略級業務,擁有千萬級別的流量入口。為了保障線上業務的穩定運行,每月例行開展前端容災演習,主要包含小程式及 H5 版本,要求各頁面各模塊在異常情況下進行適當的降級處理,不能出現 ...
  • 最近看見別人可以使用倉庫展現自己的靜態頁面 如:https://li_shang_shan.gitee.io/xiaomi/ 我想來到這裡來的小伙伴,都知道怎麼搭建自己的碼雲倉庫,以及上傳代碼到自己的倉庫。所以前面的東西就不贅述了。直接上正題 上傳的代碼最好有一個index,html的文件,代碼進入 ...
  • 不知不覺,在開發這條道路上摸爬打滾也有些年頭了,偶爾回頭看看以前寫的代碼,真可謂粗糙至極。當然了,那時候還是小白,代碼寫得難看些情有可原,不過現在可不能再用以前的標準去衡量自己了,因此掌握一些高級架構技巧是必須的,設計模式正是一個很好的敲門磚。 在我看來,設計模式不僅僅只是一套模板,要想掌握設計模式 ...
  • Pandas是一個基於Numpy的數據分析包,這個庫就是為數據分析而生的,你可以向操作Excel一樣操作Pandas,實現數據的選擇排序、篩選過濾、統計分析等功能,實際上,Pandas就是Python中的Excel,學習Pandas之後你會更加深刻的理解這句話是多麼的形象準確的。 為了簡化表示,本文 ...
  • 一、JDBC編程 1.JDBC簡介 JDBC(Java Database Connectivity)是一套用於執行SQL語句的Java API。 分為兩層: (1)上層是JDBC API,負責在Java應用程式和JDBC驅動程式管理器之間進行通信,負責發送程式中的SQL語句; (2)下層是JDBC驅 ...
  • 原文地址:https://www.cnblogs.com/Cloudcan/p/13326550.html 遵循兩條原則:1.某出棧元素之後出棧的各元素,若比其小(即在原隊列中先進棧),必須為從大到小排序(即倒序);2.最大的倒序數列,其元素數目不可以超過棧大小。例如5 6 4 3 7 2 1,最大 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...