目錄
切片" >切片
开始使用切片" >开始使用切片
声明切片" >声明切片
方式一(声明变量方式)" >方式一(声明变量方式)
方式二(make方式)" >方式二(make方式)
由数组得到的切片
" >由数组得到的切片
向切片中追加元素(增)" >向切片中追加元素(增)
一次性增加多个" >一次性增加多个
修改切片中的元素(改)" >修改切片中的元素(改)
删除切片中的元素(删)
" >删除切片中的元素(删)
切片遍历(查)" >切片遍历(查)
首頁 後端開發 Golang 一篇文章帶你了解Go語言基礎之切片

一篇文章帶你了解Go語言基礎之切片

Jul 20, 2023 pm 02:59 PM
go語言

為什麼需要切片

在原來的時候,我們學過##陣列,我們知道陣列是可以儲存很多東西的。

程式碼

package main

import "fmt"

func main() {
    var student_list = [4]string{"张三", "李四", "王五,", "小刘"}
    fmt.Println(student_list)
}
登入後複製

#上述程式碼定義了一個數組,並且存了4個值,但是如果存5個值或更多呢。

package main

import "fmt"

func main() {
    //方式一,在创建的时候就多加一个值
    // 只能存4个,多了会报错,array index 4 out of bounds [0:4]
    //var student_list = [4]string{"张三", "李四", "王五,", "小刘","小七"}

    //方式二,通过索引方式添加值
    var student_list = [4]string{"张三", "李四", "王五,", "小刘"}
    //还是会报错,invalid array index 4 (out of bounds for 4-element array)
    //student_list[4] = "小七"
    fmt.Println(student_list)
}
登入後複製

#陣列只能儲存固定長度,不能追加值,如果追加值會報錯。

所以,就引出了以下的一個鍊式儲存結構。


切片

切片,在其他语言中,在Python中叫列表,Java中好像也是列表,PHP中也叫列表,只是在Go中叫切片(slice)

切片(列表)在每个编程语言中,都是一个非常通用的存储结构。

属于堆内存存储,其内存分布图如下。

一篇文章帶你了解Go語言基礎之切片

如何验证。

package main

import "fmt"

func main() {
    var student_list = []string{"张三", "李四"}         //[]里面没有加长度是切片
    var student_list2 = [3]string{"张三", "李四", "王五"} //[]里面加长度是数组
    fmt.Printf("%p\n", student_list)                //结果:0xc000096440
    fmt.Printf("%p\n", student_list2)               //结果:%!p([3]string=[张三 李四 王五]),表示不是地址
}
/*
    %p表示直接打印的是变量地址
    如果是栈中存储的,是打印不出来地址的,显示%!p,表示不是地址
    如果是堆中存储,打印的就直接是地址
*/
登入後複製

ps:默认打印,赋值等操作,操作的是栈上面的值,所以堆存储直接打印的就是堆的地址,赋值等其他操作同理。


开始使用切片

官话

切片(Slice)是一个拥有相同类型元素的可变长度的序列。它是基于数组类型做的一层封装。它非常灵活,支持自动扩容。

切片是一个引用类型(堆存储),它的内部结构包含地址长度容量。切片一般用于快速地操作一块数据集合。


声明切片

语法如下。

方式一(声明变量方式)

语法
var 变量名 []存储类型
例如:
package main


/*
    和数组操作方式非常像,[]不加数字,就是切片
*/
func main() {
    var student_list []string
    var student_list2 []int
    var student_list3 []float64
    
    //类型推断方式,后面必须带{},数组同理
    var student_list4 = []string{}
}
登入後複製

方式二(make方式)

语法:
var 变量名 = make([]存储类型, 切片中元素数量, 切片的容量)
变量名 := make([]int, 10, 20)
/*
    切片容量不写等于切片元素数量
*/

例如:
package main

import "fmt"

func main() {
    var student_list4 = make([]int, 10, 20)
    fmt.Println(student_list4)//结果:[0 0 0 0 0 0 0 0 0 0]
}
登入後複製


由数组得到的切片

注:数组得到的,只能是切片

package main

import "fmt"

func main() {
    var name_array = [5]int{1, 2, 3, 4, 5}
    var name_slice = name_array[1:3] //name_array[1:3]切完值以后,结果只能是切片
    fmt.Printf("%T %T\n", name_array, name_slice)
}
登入後複製

ps:数组通过下标范围([开始下标:结束下标])的方式获取的值,只能是列表,取值包含左下标,不包含右下标

简称顾左不顾右。


向切片中追加元素(增)

终于到了每个语言的必学的环节了,切片的增加操作。

在Go中,向切片中追加值,需要用到append。

package main

import "fmt"

func main() {
    var student_list []string
    //append追加之后,必须使用student_list再接收
    student_list = append(student_list, "张三")
    student_list = append(student_list, "李四")
    student_list = append(student_list, "王五")
    fmt.Println(student_list)
}
登入後複製

ps:apppend之后,必须使用原来的变量再接受一次


一次性增加多个

如果一个列表,需要增加另外一个列表怎么办呢???

package main

import "fmt"

func main() {
    //var student_list []string
    var student_list1 = []string{"张三", "李四", "王五", "小刘"}
    var student_list2 = make([]string, 10)
    student_list2 = append(student_list2, "八神")       //添加一个值
    student_list2 = append(student_list2, "八神", "九尾") //可以添加多个值
    student_list2 = append(student_list2, student_list1...)
    //下面这种写法,就是上面...所包含的意思,专业叫法叫做打散,
    //student_list2 = append(student_list2,"张三", "李四", "王五", "小刘")

    fmt.Println(student_list2) //[          八神 张三 李四 王五 小刘]
}
登入後複製

注:可能有人会注意到,八神前面会有很多空格,这个先别着急,后面揭晓。


修改切片中的元素(改)

修改就简单了,同数组。

package main

import "fmt"

func main() {
    var names = []string{"张三", "李四"}
    names[1] = "李四666" //修改下标为1的值
    fmt.Println(names) //[张三 李四666]
}
登入後複製


删除切片中的元素(删)

比较尴尬的是,Go中的切片,在做删除这个操作,不是太友好。

下面举个例子,希望能看懂,看不懂会用就行。

package main

import "fmt"

func main() {
    var names = []string{"张三", "李四", "王五", "小刘", "七阿"}
    //删除索引为2的元素
    names = append(names[:2], names[3:]...) //删除王五
    fmt.Println(names)                      //[张三 李四 小刘 七阿]
}
登入後複製

如果看不懂,没关系,下章会好好捋捋这个。


切片遍历(查)

切片的遍历同数组一样。

package main

import "fmt"

func main() {
    var names = []string{"张三", "李四", "王五", "小刘", "七阿"}
    //方式一,标准for循环
    for i := 0; i < len(names); i++ {
        fmt.Println(names[i])
}
    //方式二,for range
    for index, value := range names {
        //index为下标,value为值
        fmt.Println(index, value)
  }
}
登入後複製

以上是一篇文章帶你了解Go語言基礎之切片的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
威爾R.E.P.O.有交叉遊戲嗎?
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Go語言中用於浮點數運算的庫有哪些? Go語言中用於浮點數運算的庫有哪些? Apr 02, 2025 pm 02:06 PM

Go語言中用於浮點數運算的庫介紹在Go語言(也稱為Golang)中,進行浮點數的加減乘除運算時,如何確保精度是�...

Go的爬蟲Colly中Queue線程的問題是什麼? Go的爬蟲Colly中Queue線程的問題是什麼? Apr 02, 2025 pm 02:09 PM

Go爬蟲Colly中的Queue線程問題探討在使用Go語言的Colly爬蟲庫時,開發者常常會遇到關於線程和請求隊列的問題。 �...

在Go語言中使用Redis Stream實現消息隊列時,如何解決user_id類型轉換問題? 在Go語言中使用Redis Stream實現消息隊列時,如何解決user_id類型轉換問題? Apr 02, 2025 pm 04:54 PM

Go語言中使用RedisStream實現消息隊列時類型轉換問題在使用Go語言與Redis...

在 Go 語言中,為什麼使用 Println 和 string() 函數打印字符串會出現不同的效果? 在 Go 語言中,為什麼使用 Println 和 string() 函數打印字符串會出現不同的效果? Apr 02, 2025 pm 02:03 PM

Go語言中字符串打印的區別:使用Println與string()函數的效果差異在Go...

GoLand中自定義結構體標籤不顯示怎麼辦? GoLand中自定義結構體標籤不顯示怎麼辦? Apr 02, 2025 pm 05:09 PM

GoLand中自定義結構體標籤不顯示怎麼辦?在使用GoLand進行Go語言開發時,很多開發者會遇到自定義結構體標籤在�...

Go語言中哪些庫是由大公司開發或知名的開源項目提供的? Go語言中哪些庫是由大公司開發或知名的開源項目提供的? Apr 02, 2025 pm 04:12 PM

Go語言中哪些庫是大公司開發或知名開源項目?在使用Go語言進行編程時,開發者常常會遇到一些常見的需求,�...

Go語言中`var`和`type`關鍵字定義結構體的區別是什麼? Go語言中`var`和`type`關鍵字定義結構體的區別是什麼? Apr 02, 2025 pm 12:57 PM

Go語言中結構體定義的兩種方式:var與type關鍵字的差異Go語言在定義結構體時,經常會看到兩種不同的寫法:一�...

使用 sql.Open 時,DSN 傳空為什麼不報錯? 使用 sql.Open 時,DSN 傳空為什麼不報錯? Apr 02, 2025 pm 12:54 PM

使用sql.Open時,DSN傳空為什麼不報錯?在Go語言中,sql.Open...

See all articles