【Go實戰基礎】slice 切片為什麼更常用

来源:https://www.cnblogs.com/actions365/archive/2022/09/06/16660457.html
-Advertisement-
Play Games

數組元素固定,在 Go 語言中沒有那麼常用,更常用的數據結構是切片。什麼是切片呢? 切片就是動態的數組,它的長度不固定,可以隨意向切片中追加元素,而且切片會在容量不足的時候自動擴容。切片(slice)是對數組一個連續片段的引用,這個片段可以是整個數組,或者是由起始和終止索引標識的一些項的子集,需要註 ...


數組元素固定,在 Go 語言中沒有那麼常用,更常用的數據結構是切片。

什麼是切片呢? 切片就是動態的數組,它的長度不固定,可以隨意向切片中追加元素,而且切片會在容量不足的時候自動擴容。

切片(slice)是對數組一個連續片段的引用,這個片段可以是整個數組,或者是由起始和終止索引標識的一些項的子集,需要註意的是,終止索引標識的項不包括在切片內,切片提供了一個與指向數組的動態視窗。

切片的數據結構如下:

    type slice struct {
        // Pointer 是指向一個數組的指針
        array unsafe.Pointer
     
        // 當前切片的長度
        len   int
     
        // cap 是當前切片的容量。cap 總是大於等於 len 的。
        cap   int
    }

 

Pointer 作為一個指針指向的數組是一片連續的記憶體空間,這片記憶體空間可以用於存儲切片中保存的全部元素,底層存儲都是連續的,所以可以將切片理解為一片連續的記憶體空間加上長度與容量的標識。

    實戰需求: slice 切片的實現原理

馬上安排!

一、工程目錄

    cd go-003/

二、創建 g003.go

    /*
     * @Author: 菜鳥實戰
     * @FilePath: /go110/go-003/g003.go
     * @Description: slice 切片
     */
     
    package main
     
    import (
        "fmt"
        "runtime"
    )
     
    // 主函數
    func main() {
        // 使用內置函數列印
        println("Hello", "菜鳥實戰")
     
        //定義一個無初始長度的切片
        s := []string{}
     
        for i := 0; i < 6; i++ {
     
            // 拼接元素
            s = append(s, "eeeee")
     
            // 拼接後會動態擴容
            fmt.Printf("容量: %v, 長度 : %v \n", cap(s), len(s))
        }
     
        // 使用包函數列印
        fmt.Printf("版本: %s \n", runtime.Version())
    }

 

三、編譯和運行


    # 1、生成模塊依賴

    go mod init g003
    # 2、編譯
    go build g003.go 
 
    # 3、編譯後的目錄結構
     
    └── go-003
        ├── g003
        ├── g003.go
        └── go.mod
     
    # 4、運行
    go run g003

四、運行結果
    Hello 菜鳥實戰
    容量: 1, 長度 : 1
    容量: 2, 長度 : 2
    容量: 4, 長度 : 3
    容量: 4, 長度 : 4
    容量: 8, 長度 : 5
    容量: 8, 長度 : 6
    版本: go1.17.10

由輸出結果可以看到,Slice 的容量會自動擴容的起點是 2,當長度大於 2 時,slice 的容量會自動擴容為原來的 2 倍,每一次擴容都會重新開闢一塊記憶體空間,將舊的數據複製到新開闢的記憶體空間中,然後釋放舊的記憶體空間。

數組長度是固定的,而 Go 中使用的切片設計想法是由動態數組概念而來,可以用來管理數據集合,並可以自動增加和減少,但是切片本身並不是動態數據或者數組指針,與此同時,切片還具有可索引,可迭代的優秀特性,因此使用也更為廣範。

菜鳥實戰,持續學習!
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Swarm集群編排 什麼是Swarm ​ Swarm是Docker公司自研發的容器集群管理系統,Swarm在早期是作為一個獨立服務存在,在Docker Engine v1.12中集成了Swarm的集群管理,和編排功能。可以通過初始化Swarm或加入現有Swarm來啟用Docker引擎的Swarm模式 ...
  • Windows環境下 一、開啟 Imagick 擴展 1、安裝PHP擴展:Imagick,下載地址 https://pecl.php.net/package/imagick 註意和php版本保持一致; 2、將下載下來的文件解壓,把php_imagick.dll複製到php/ext下,即php的擴展目 ...
  • IP地址 = 網路地址 + 主機地址。 | 分類 | 信息 | 公有IP |私有地址 | 預設網關 | | : : | : : | : : | : : | : : | | A | 最高位為0,1位元組網路地址,3位元組主機地址 | 1.0.0.0 - 126.0.0.0 | 10.0.0.0 ~ 10. ...
  • 1.什麼是request對象 在django中,當一個頁面被請求時,Django就會創建一個包含本次請求原信息的HttpRequest對象;Django會將這個對象自動傳遞給響應的視圖函數,一般視圖函數約定俗成地使用 request 參數承接這個對象。 2.request對象的作用 request對 ...
  • “JVM 為什麼使用元空間替換了永久代?” 這是一個工作6年的同學去位元組第一面遇到的問題,很遺憾,他沒有回答出來 大家好,我是Mic,一個工作了14年的Java程式員。 關於這個問題,我們怎麼回答?面試官到底關註什麼呢? 面試解析 我們都知道Java8以及以後的版本中,JVM運行時數據區的結構都在慢 ...
  • C++ Primer學習筆記:string、vector、迭代器以及數組,只記錄不會或不熟悉的地方 博客小站:blog.smartdog.top 命名空間 std::cin 使用標準輸入輸出命名空間,:: 域操作符表示:編譯器應從操作符左側名字所示的作用域中尋找右側那個名字。 使用 using 可以 ...
  • 來源 | Info ,整理 | 鈺瑩、Tina 回擊就代表輸了?! 今年年中,一位前谷歌、前亞馬遜的工程師推出了他創作的開源記憶體數據緩存系統 Dragonfly,用 C/C++ 編寫,基於 BSL 許可(Business Source License)分發。 根據過往的基準測試結果來看, Drago ...
  • 項目中一個常見的場景,就是介面請求或者響應參數中會有一些欄位的取值會限定為固定幾個可選值,而在代碼中這些可選值會通過枚舉類來承載,本文探討下如何讓swagger介面文檔中自動加上欄位的取值含義說明,解放生產力。 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...