<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Go 語言數組和切片的區別

      原文鏈接: Go 語言數組和切片的區別

      在 Go 語言中,數組和切片看起來很像,但其實它們又有很多的不同之處,這篇文章就來說說它們到底有哪些不同。

      另外,這個問題在面試中也經常會被問到,屬于入門級題目,看過文章之后,相信你會有一個很好的答案。

      數組

      數組是同一種數據類型元素的集合,數組在定義時需要指定長度和元素類型。

      例如:[4]int 表示一個包含四個整數的數組,數組的大小是固定的。并且長度是其類型的一部分([4]int[5]int 是不同的、不兼容的類型)。

      數組元素可以通過索引來訪問,比如表達式 s[n] 表示訪問第 n 個元素,索引從零開始。

      聲明以及初始化

      func main() {
          var nums [3]int   // 聲明并初始化為默認零值
          var nums1 = [4]int{1, 2, 3, 4}  // 聲明同時初始化
          var nums2 = [...]int{1, 2, 3, 4, 5} // ...可以表示后面初始化值的長度
          fmt.Println(nums)    // [0 0 0]
          fmt.Println(nums1)   // [1 2 3 4]
          fmt.Println(nums2)   // [1 2 3 4 5]
      }
      

      函數參數

      如果數組作為函數的參數,那么實際傳遞的是一份數組的拷貝,而不是數組的指針。這也就意味著,在函數中修改數組的元素是不會影響到原始數組的。

      package main
      
      import (
          "fmt"
      )
      
      func Add(numbers [5]int) {
          for i := 0; i < len(numbers); i++ {
              numbers[i] = numbers[i] + 1
          }
          fmt.Println("numbers in Add:", numbers) // [2 3 4 5 6]
      }
      
      func main() {
          // declare and initialize the array
          var numbers [5]int
          for i := 0; i < len(numbers); i++ {
              numbers[i] = i + 1
          }
      
          Add(numbers)
          fmt.Println("numbers in main:", numbers) // [1 2 3 4 5]
      }
      

      切片

      數組的使用場景相對有限,切片才更加常用。

      切片(Slice)是一個擁有相同類型元素的可變長度的序列。它是基于數組類型做的一層封裝。它非常靈活,支持自動擴容。

      切片是一種引用類型,它有三個屬性:指針長度容量

      1. 指針:指向 slice 可以訪問到的第一個元素。
      2. 長度:slice 中元素個數。
      3. 容量:slice 起始元素到底層數組最后一個元素間的元素個數。

      底層源碼定義如下:

      type slice struct {
          array unsafe.Pointer
          len   int
          cap   int
      }
      

      聲明以及初始化

      func main() {
          var nums []int  // 聲明切片
          fmt.Println(len(nums), cap(nums)) // 0 0
          nums = append(nums, 1)   // 初始化
          fmt.Println(len(nums), cap(nums)) // 1 1
      
          nums1 := []int{1,2,3,4}    // 聲明并初始化
          fmt.Println(len(nums1), cap(nums1))    // 4 4
      
          nums2 := make([]int,3,5)   // 使用make()函數構造切片
          fmt.Println(len(nums2), cap(nums2))    // 3 5
      }
      

      函數參數

      當切片作為函數參數時,和數組是不同的,如果一個函數接受一個切片參數,它對切片元素所做的更改將對調用者可見,類似于將指針傳遞給了底層數組。

      package main
      
      import (
          "fmt"
      )
      
      func Add(numbers []int) {
          for i := 0; i < len(numbers); i++ {
              numbers[i] = numbers[i] + 1
          }
          fmt.Println("numbers in Add:", numbers) // [2 3 4 5 6]
      }
      
      func main() {
          var numbers []int
          for i := 0; i < 5; i++ {
              numbers = append(numbers, i+1)
          }
      
          Add(numbers)
      
          fmt.Println("numbers in main:", numbers) // [2 3 4 5 6]
      }
      

      再看一下上面的例子,把參數由數組變成切片,Add 函數中的修改會影響到 main 函數。

      總結

      最后來總結一下,面試時也可以這么來回答:

      1. 數組是一個長度固定的數據類型,其長度在定義時就已經確定,不能動態改變;切片是一個長度可變的數據類型,其長度在定義時可以為空,也可以指定一個初始長度。
      2. 數組的內存空間是在定義時分配的,其大小是固定的;切片的內存空間是在運行時動態分配的,其大小是可變的。
      3. 當數組作為函數參數時,函數操作的是數組的一個副本,不會影響原始數組;當切片作為函數參數時,函數操作的是切片的引用,會影響原始切片。
      4. 切片還有容量的概念,它指的是分配的內存空間。

      以上就是本文的全部內容,如果覺得還不錯的話歡迎點贊轉發關注,感謝支持。


      參考文章:

      推薦閱讀:

      posted @ 2023-04-02 11:57  yongxinz  閱讀(170)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 九九热精品在线视频观看| 亚洲国产精品久久久久婷婷图片 | 东方av四虎在线观看| 在线精品国精品国产尤物| 在线中文一区字幕对白| 性欧美VIDEOFREE高清大喷水| 久久99精品久久久久久青青| 精品久久久久久无码中文字幕| 成年女性特黄午夜视频免费看 | 亚洲女同性同志熟女| 老熟妇性老熟妇性色| 国产熟女丝袜av一二区| 亚洲国产成人综合精品| 国产网友愉拍精品视频手机| 午夜视频免费试看| 国产真实乱人偷精品人妻| 精品久久久久久国产| 一区二区三区AV波多野结衣| 久热色视频精品在线观看| 商都县| a级黑人大硬长爽猛出猛进| 人妻少妇精品中文字幕| 加勒比无码人妻东京热| 亚洲大尺度一区二区av| 狠狠色丁香婷婷综合尤物| 亚洲欧美日本久久网站| 午夜福利视频| 国产一区二区三区四区五区加勒比 | 久久99精品国产麻豆婷婷| 免费人妻无码不卡中文18禁| 又爽又黄又无遮挡的激情视频| 亚洲深深色噜噜狠狠网站| 国产成人免费永久在线平台| 四虎国产精品久久免费精品 | 亚洲精中文字幕二区三区| 欧洲免费一区二区三区视频| 国自产拍偷拍精品啪啪模特| 国产二区三区不卡免费| 激情五月天一区二区三区| 69天堂人成无码免费视频| 国产在线精品国偷产拍|