ch。 5片
#初学者 #编程 #书 #go
Golang中的

切片与动态阵列相同。阵列是您在与学习编程语言有关的任何书中可能会学习的第一个数据结构。切片可以包含任何数据类型,包括切片本身,使编排数据更简单。
在本章中,我们将介绍切片的基础知识,我将教您一些最有用的方法。

切片数据类型

切片类型的上限和下限由结肠隔开,但不包含,这意味着未使用上限值。
例如

package main

import "fmt"

func main() {
    evens := [5]int{2, 4, 6, 8, 10 }
    var s []int = evens[1:4]
    fmt.Println(s)

}

将输出
“ 4 6 8”

用索引访问切片中的值

像GO中的许多其他语言一样,从切片中获得单个值。假设它不使用evens [1:4],而是读取evens [0]只会输出“ 2”。
切片
切片可能包含任何类型,包括其他切片,在使用时可以将其视为网格。一个不进入数学的人的熟悉示例是tic-tac-toe而不是x,y坐标平面。

package main

import (
    "fmt"
    "strings"
)

func main() {
    // Create a tic-tac-toe board.
    board := [][]string{
        []string{"_", "_", "_"},
        []string{"_", "_", "_"},
        []string{"_", "_", "_"},
    }

    // The players take turns.
    board[0][0] = "X"
    board[2][2] = "O"
    board[1][2] = "X"
    board[1][0] = "O"
    board[0][2] = "X"

    for i := 0; i < len(board); i++ {
        fmt.Printf("%s\n", strings.Join(board[i], " "))
    }
}

将输出,

X _ X
O _ X
_ _ O

使用空切片

当您不知道其中有多少个元素时,一个空尺寸的切片会有所帮助,但您确实计划使用它。所以你会这样声明。

package main

import "fmt"

func main() {
    a := []int{}
    fmt.Println(a)

}

将输出'[]',表明它是一个空的切片,等待填充。

附加到切片

使用切片时,通常有必要在切片中添加新元素,而在Go中这样做的适当方法是使用“附加”方法。

package main

import "fmt"

func main() {
    var s []int
    printSlice(s)

    // append works on nil slices.
    s = append(s, 0)
    printSlice(s)

    // The slice grows as needed.
    s = append(s, 1)
    printSlice(s)

    // We can add more than one element at a time.
    s = append(s, 2, 3, 4)
    printSlice(s)
}

func printSlice(s []int) {
    fmt.Printf("len=%d cap=%d %v\n", len(s), cap(s), s)
}

使用Len()func获得切片的长度。

同样,要在切片中添加元素,通常必须知道切片内有多少个功能。

package main

import "fmt"

func main() {
    s := []int{2, 3, 5, 7, 11, 13}
    fmt.Println(len(s))


}

用索引在切片中更改值

有时,您还需要在切片中更新特定值而不更改其他值。

package main

import "fmt"

func main() {
    s := []int{2, 3, 5, 7, 11, 13}
    s[1] = 234234
    fmt.Println(s)


}

将输出[2 234234 5 7 11 13]

使用切片

好吧,既然切片的基础知识已经下降了,让我们看看我们如何以及为什么使用切片来自动化我们的平凡任务。

用于循环

循环和切片像牛奶和饼干一样一起融合在一起,并进行独特的范围语法,以通过元素和值按值进行切片。

假设您有有关所出售纸张价格的数据,需要更新它们以考虑通货膨胀。

package main

import "fmt"



func main() {
    paperPrices := []float32{1.00, 2.00, 4.00, 8.00, 16.00, 32.00, 64.00, 128.00}
    inflatedPaperPrices := make([]float32, len(paperPrices))
    for i, v := range paperPrices {
        inflatedPaperPrices[i] = (v * 0.08) + v
    }
    fmt.Println(inflatedPaperPrices)
}

请注意,在声明AptratedPaperprices切片时使用了“制造”关键字。 Make语句用于创建具有预定长度和类型的变量。这通常是最佳实践,在这种情况下,必须完成。

让我们将其分解为“ i”和“ v” - 这些是仅存在的循环中的for循环变量,可以命名任何东西,但通常使用'i'和'v'按照传统。因为“我”可以被认为是“索引”和“ v”为“值”。

因此,范围可让我们迭代(遍历)切片并访问值或索引或两者兼而有之。范围语法是在GO中编写for loop的快捷方式。以上代码可以以更长的形式编写。

package main

import "fmt"



func main() {
    paperPrices := []float32{1.00, 2.00, 4.00, 8.00, 16.00, 32.00, 64.00, 128.00}
    inflatedPaperPrices := make([]float32, len(paperPrices))
    for i:=0; i < len(paperPrices); i++ {
        inflatedPaperPrices[i] = (paperPrices[i] * 0.08) + paperPrices[i]
    }
    fmt.Println(inflatedPaperPrices)
}

结论

现在已经涵盖了切片的基础知识,让我们继续前进。