詳解go語言的array和slice 【二】

  上一篇 ?詳解go語言的array和slice 【一】已經講解過,array和slice的一些基本用法,使用array和slice時需要注意的地方,特別是slice需要注意的地方比較多。上一篇的最后講解到創建新的slice時使用第三個索引來限制slice的容量,在操作新slice時,如果新slice的容量大于長度時,添加新元素依然后使源的相應元素改變。這一篇里我會講解到如何避免這些問題,以及迭代、和做為方法參數方面的知識點。

slice的長度和容量設置為同一個值

  如果在創建新的slice時我們把他的長度和容量的值設置為樣的值,那么在append新元素時,底層會創建一個新的array并把之前的值復制過去。這樣就不會影響之前共同的底層array了。

    // 創建一個容量和長度均為6的sliceslice1 := []int{5, 23, 10, 2, 61, 33}// 對slices1進行切片,長度為2容量為3slice2 := slice1[1:3:3]fmt.Println("cap", cap(slice2))fmt.Println("slice2", slice2)//修改一個共同指向的元素//兩個slice的值都會修改slice2[0] = 11111fmt.Println("slice1", slice1)fmt.Println("slice2", slice2)// 增加一個元素slice2 = append(slice2, 55555)fmt.Println("slice1: ", slice1)fmt.Println("slice2: ", slice2)

  輸出結果

cap 2
slice2 [23 10]
slice1 [5 11111 10 2 61 33]
slice2 [11111 10]
slice1:  [5 11111 10 2 61 33]
slice2:  [11111 10 55555]

  代碼中的長度和容量是一樣的,長度和容量的計算公式看我的上一篇博客。增加一個元素后,原來共同指向的底層數據是沒有變的。因為slice2的底層array被重新賦值了。

迭代slice

  go語言內置一個關鍵字range用于迭代集合,當然他也可以迭代slice,也可以使用? _? 來忽略我們不關心的元素,但是如果只關心index則不需這么寫 for index,_ := range slice1。下在給出完整代碼

    // 創建一個容量和長度均為6的sliceslice1 := []int{5, 23, 10, 2, 61, 33}for index, value := range slice1 {fmt.Println("index: ", index, " value: ", value)}// 可以忽略我們不關心的元素// 只關心valuefor _, value := range slice1 {fmt.Println("value ", value)}// 只關心index, 可以不用 _for index := range slice1 {fmt.Println("index: ", index)}

?

?  需要注意的是rang 迭代的value值并是一個復本,我們可以對比一下迭代的value和原slice內相應index下value的地址:

    // 創建一個容量和長度均為6的sliceslice1 := []int{5, 23, 10, 2, 61, 33}for index, value := range slice1 {fmt.Println("index: ", index, " value address : ", &value, " slice1 value address", &slice1[index])}

  輸出結果

index:  0  value address :  0xc04204e088  slice1 value address 0xc04206a030
index:  1  value address :  0xc04204e088  slice1 value address 0xc04206a038
index:  2  value address :  0xc04204e088  slice1 value address 0xc04206a040
index:  3  value address :  0xc04204e088  slice1 value address 0xc04206a048
index:  4  value address :  0xc04204e088  slice1 value address 0xc04206a050
index:  5  value address :  0xc04204e088  slice1 value address 0xc04206a058

  slice1中value的地址是不斷變化的。而迭代的value值的地址沒有變化,這是因為value是一個變量,為次迭代的時候賦不同的值。我們把代碼寫成下面這樣,你就清楚了

    var index, value intfor index, value = range slice1 {fmt.Println("index: ", index, &index, " value address : ", &value, " slice1 value address", &slice1[index])}

?  除了使用rang 也可以使用傳統的for循環來做迭代

    slice1 := []int{5, 23, 10, 2, 61, 33}for i, len := 1, len(slice1); i < len; i++ {fmt.Println("index: ", i, " value:", slice1[i])}

?

?slice作為方法參數

?  由于slice的特殊結構,有一個指針指向一個數組

    s := make([]int, 2, 5)fmt.Println("len: ", len(s))fmt.Println("cap: ", cap(s))s = append(s, 2)s[0] = 12

?

  所以,slice做為方法的參數傳遞時,只會復制slice本身而不會復制slice底層的array.如果我們創建一個int類型有100萬長度的slice ,把他傳遞給一個方法時,只需要復制24個字節就夠了。指針需要8個,長度和容量都是8個。

const size int = 1000 * 1000func main() {slice0 := make([]int, size)fmt.Println("slice0 len: ", len(slice0), " cap :", cap(slice0))doSomeThing(slice0)
}func doSomeThing(s []int) {fmt.Println(len(s))
}

?

?

轉載于:https://www.cnblogs.com/li-peng/p/7541554.html

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

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

相關文章

詳解Objective-C的meta-class

2019獨角獸企業重金招聘Python工程師標準>>> 比較簡單的一篇英文&#xff0c;重點是講解meta-class。翻譯下&#xff0c;加深理解。 原文標題&#xff1a;What is a meta-class in Objective-C? 原文地址&#xff1a;http://www.cocoawithlove.com/2010/01/what-is…

Nginx 模塊的使用

Nginx模塊的使用,就是在Nginx配置文件中的http、server、location中添加參數&#xff0c;進行多一項或幾項處理一、 實現響應內容替換 1、sub_module二、Nginx的請求限制 1、連接頻率限制 limit_conn_module 2、請求頻率限制 limit_req_module 注: HTTP請求建立在一次…

Question | 網站被黑客掃描撞庫該怎么應對防范?

本文來自網易云社區在安全領域向來是先知道如何攻&#xff0c;其次才是防。針對題主的問題&#xff0c;在介紹如何防范網站被黑客掃描撞庫之前&#xff0c;先簡單介紹一下什么是撞庫。撞庫是黑客通過收集互聯網已泄露的用戶和密碼信息&#xff0c;生成對于的字典表&#xff0c;…

十倍程序員 | 使用 Source Generator 將 JSON 轉換成 C# 類

前言有時候&#xff0c;我們需要將通過 WebAPI 接收 JSON 字符串轉換成 C# 代碼。Visual Studio 提供了一個功能菜單可以輕松實現&#xff1a;執行完成后&#xff0c;它會將生成的代碼放在打開的的代碼窗口中。但是&#xff0c;如果有多個 JSON 字符串需要轉換&#xff0c;這個…

Delphi對話框初始地址InitialDir

我的電腦&#xff1a;SaveDialog1.InitialDir : ::{20D04FE0-3AEA-1069-A2D8-08002B30309D};// My Computer {20D04FE0-3AEA-1069-A2D8-08002B30309D}// Network Neighborhood {208D2C60-3AEA-1069-A2D7-08002B30309D}// Recycled {645FF040-5081-101B-9F08-00AA002F954E} 另外…

[python] 解決pip install download速度過慢問題 更換豆瓣源

""" python建立pip.ini.py 2016年4月30日 03:35:11 codegay """import osini"""[global] index-url https://pypi.doubanio.com/simple/ [install] trusted-hostpypi.doubanio.com """ pippathos.environ["…

Maven組件通過命令上傳本地和私有倉庫

安裝本地包到本地倉庫&#xff1a;mvn install:install-file -DgroupIdcom.xxx -DartifactIdmqtt-server-client -Dversion1.0.1 -Dpackagingjar -DfileE:\__vdt\MVVP\mqtt-server-client-1.0.1.jar -DpomFileE:\__vdt\MVVP\pom.xml安裝本地包到私有倉庫&#xff1a;mvn deploy…

Nginx -靜態資源Web服務

一、靜態資源類型 注&#xff1a;非服務器動態生成的文件 1、瀏覽器端渲染 HTML、css、js 2、圖片 jpeg、gif、png 3、視頻 flv、MPEG 4、文件 TXT、等任意下載文件二、靜態資源服務配置1、配置語法-文件讀取 syntax&#xff1a;sendfile on|off default&#xff1a;sendfi…

微軟Microsoft Azure 機器學習工作室的案例之Image Classification using DenseNet

點擊上方藍字關注我們&#xff08;本文閱讀時間&#xff1a;10分鐘)Microsoft Azure Machine Learning Studio是微軟強大的機器學習平臺&#xff0c;在設計器中&#xff0c;微軟內置了15個場景案例&#xff0c;但網上似乎沒有對這15個案例深度刨析的分析資料&#xff0c;所以我…

java小基礎之instanceof運算符

instanceof主要用來判斷一個類是否實現了某個接口&#xff0c;或者判斷一個實例對象是否屬于一個類。 1. 判斷一個對象是否屬于一個類 boolean result p instanceof Student; 2. 對象類型強制轉換前的判斷 Person p new Student(); //判斷對象p是否為Student類的實例 if(p in…

音樂分類

代碼&#xff1a; 1 import numpy as np2 from scipy import fft3 from scipy.io import wavfile4 from sklearn.linear_model import LogisticRegression5 import random6 """7 使用logistic regression處理音樂數據&#xff0c;音樂數據訓練樣本的獲得是使…

Problem C: 類的初體驗(III)

Description 定義一個類Data&#xff0c;只有一個double類型的屬性和如下4個方法&#xff1a; 1. 缺省構造函數&#xff0c;將屬性初始化為0&#xff0c;并輸出“Initialize a data 0”。 2. 帶參構造函數&#xff0c;將屬性初始化為指定參數&#xff0c;并輸出“Initialize…

Nginx- 實現跨域訪問

一、什么是跨域 跨域&#xff1a;由于瀏覽器的同源策略&#xff0c;即屬于不同域的頁面之間不能相互訪問各自的頁面內容。詳細見下表&#xff1a; 注&#xff1a;同源策略&#xff0c;單說來就是同協議&#xff0c;同域名&#xff0c;同端口 URL說明是否允許通信http://www.a…

不管對不對,先把鬧鐘關了再說

小榆提前關閉早上鬧鐘&#xff0c;幾乎工作日的早晨都是被這魔怔的鈴聲給拉扯醒&#xff0c;無論有多么不愿還是痛苦&#xff0c;可對這鬧鐘也無可奈何&#xff0c;就算一時果斷掐掉接下來是另一回麻煩事。最后一天&#xff0c;已經顧不得多少&#xff0c;沒什么令人懼怕的人或…

pycharm(windows)安裝及其設置中文菜單

pycharm&#xff08;windows&#xff09;安裝及其設置中文菜單 1.下載 在官網&#xff08;http://www.jetbrains.com/pycharm/download/#sectionwindows&#xff09;進行下載 或者到百度云進行下載 專業版&#xff1a;鏈接&#xff1a;http://pan.baidu.com/s/1bSSRds 密碼&…

Tomcat定義虛擬主機案例

Tomcat定義虛擬主機案例 作者&#xff1a;尹正杰 版權聲明&#xff1a;原創作品&#xff0c;謝絕轉載&#xff01;否則將追究法律責任。 一.準備環境 1>.創建web程序的根目錄 [rootyinzhengjie ~]# mkdir -pv /home/yinzhengjie/data/www/webapps/ROOT mkdir: created direc…

node服務成長之路

我們的系統也從第一代平臺開始到現在第四代平臺更換中&#xff0c;對這四代平臺做一個簡單的介紹&#xff1a; 第一代平臺&#xff0c;主要是集中式&#xff0c;以快速上線為目的&#xff1b;第二代平臺主要是分布式改造&#xff0c;緩解各服務壓力&#xff1b;第三代平臺主要做…

將域名綁定到ip上,并實現訪問不同二級子域名對應不同目錄

一、將域名綁定到ip上1、環境介紹&#xff1a;阿里云服務器ESC&#xff08;美國硅谷&#xff09; 2、購買域名 3、備案 注&#xff1a;由于我買的是美國地區服務器&#xff0c;所以不用備案&#xff0c;如果買的國內服務器&#xff0c;這里需要添加一個備案操作。 4、域名實名認…

ABP vNext微服務架構詳細教程(補充篇)——單層模板(中)

框架搭建2聚合服務這里我們將聚合服務命名為Domain.Core和基礎服務層一致&#xff0c;我們先通過命令創建單層模板項目Domain.Core&#xff0c;這里我們刪除wwwroot、Data、Entities、Localization、ObjectMapping文件夾及其所有子文件&#xff0c;并刪除package.json文件和Ser…

談一談synchronized關鍵詞

1.使用 java中的每一個對象都可以作為synchronized的鎖進行代碼同步&#xff0c;常見的形式 同步代碼塊鎖是synchronized括號內的對象普通成員方法上&#xff0c;鎖是當前的對象&#xff0c;synchronized(this)靜態方法上&#xff0c;鎖是當前類的Class對象2. 原理 synchronize…