go语言基础数据结构

我就是我 2022-05-08 02:42 406阅读 0赞

一.数组:

1.数组的定义

使用循环进行赋值;

  1. 使用循环进行for循环进行遍历。
  2. 使用for配合range对数组进行遍历。
  3. 使用println即可格式化输出数组元素。

    package main

    import “fmt”

    func main(){

    1. var a [10]int
    2. fmt.Println(len(a))
    3. //1.
    4. for i := 0; i < len(a); i++{
    5. a[i] = i+1
    6. fmt.Println(a[i])
    7. }
    8. //2.
    9. for _, data := range a {
    10. fmt.Println(data)
    11. }
    12. for i, _ := range a {
    13. fmt.Println(a[i])
    14. }
    15. //3.
    16. fmt.Println(a)

    }

2.数组元素默认初始值

int(整型):0

float64:0

string:空字符串

bool:false

  1. //int(整型):0
  2. var arr1[10] int
  3. for i, _ := range arr1 {
  4. fmt.Println(arr1[i])
  5. }
  6. //string:空字符串
  7. var arr2[10] string
  8. for i, _ := range arr2 {
  9. fmt.Println(arr2[i])
  10. }
  11. //float64:0
  12. var arr3[10] float64
  13. for i, _ := range arr3 {
  14. fmt.Println(arr3[i])
  15. }
  16. //bool:false
  17. var arr4[10] bool
  18. for i, _ := range arr4 {
  19. fmt.Println(arr4[i])
  20. }

3.数组的初始化

四种数组元素初始化方式:

  1. 全部初始化,使用var定义的数组
  2. 全部初始化,使用自动类型推导
  3. 部分元素初始化
  4. 指定元素初始化
  5. 通过初始化来确定数组的长度

    package main

    import “fmt”

    func main(){

    1. //1.全部初始化
    2. var a [5]int = [5]int{0, 1, 2, 3, 4}
    3. for _, data := range a {
    4. fmt.Println(data)
    5. }
    6. fmt.Println()
    7. //2.全部初始化:自动类型推导
    8. b := [5]int{0, 1, 2, 3, 4}
    9. fmt.Println(b)
    10. //3.部分初始化
    11. c := [5]int{0, 1, 2}
    12. fmt.Println(c)
    13. //4.指定元素初始化
    14. d := [5]int{0:5, 1:10}
    15. fmt.Println(d)
    16. //5.通过初始化来确定数组长度
    17. e := [...]int{1, 2, 3}
    18. fmt.Println(e)

    }

4.同类型数组之间的直接赋值与比较

注意,赋值与比较时需要使用同类型的数组,不同类型的数组是不允许这样操作的。

  1. package main
  2. import "fmt"
  3. func main(){
  4. //同类型的数组可以使用==、!=进行比较,以及使用=进行赋值
  5. arr := [3][4]int{
  6. {1}, {2}, {3}}
  7. fmt.Println(arr)
  8. var b [3][4]int = arr
  9. fmt.Println(b)
  10. //如果数组类型不同,那么IDE就会报错
  11. c := [3][4]int{
  12. {1}, {2}, {3}}
  13. fmt.Println(c == b)
  14. }

五.多维数组

有多少个[]就是多少维度;

多少维的数组就用多少个for循环进行遍历。

二.切片:

1.切片的定义

  1. var
  2. 自动类型推导
  3. make(类型, 长度, 容量),容量可以省略。
  4. 截取切片作为一个新的切片s[0 : 3 : 5],第二个参数可以理解为以一个参数+3,而是结束位置,及不包含结束位置元素。此时容量同样可以省略,但是截取后得到的切片容量有第一个参数决定:原切片的容量减去以一个参数,含义即从首元素跳过了多少个个位置。

    package main

    import “fmt”

    func main() {

    1. //1.切片的定义
    2. //1.
    3. a := []int{1, 2, 3}
    4. a = append(append(a, 4, 5), 6, 7)
    5. fmt.Println(a)
    6. fmt.Printf("%T", a)
    7. //2.
    8. var b []int = []int{1, 2, 3}
    9. fmt.Println(b)
    10. //3.切片类型 长度len() 容量cap()
    11. s := make([]int, 5, 10)
    12. for i := 0; i < len(s); i++ {
    13. s[i] = i + 1
    14. fmt.Println(s[i])
    15. }
    16. fmt.Println(s)
    17. fmt.Println(len(s))
    18. fmt.Println(cap(s))
    19. //4.切片的截取
    20. //5为切片的容量
    21. slice := s[0 : 3 : 5]
    22. fmt.Println(slice)

    }

需要注意make的容量问题,正如上面所提到的。










































操作

含义

s[n]

切片s中索引位置为n的项

s[:]

从切片s的索引位置0len(s)-1处所获得的切片

s[low:]

从切片s的索引位置lowlen(s)-1处所获得的切片

s[:high]

从切片s的索引位置0high处所获得的切片,len=high

s[low:high]

从切片s的索引位置lowhigh处所获得的切片,len=high-low

s[low:high:max]

从切片s的索引位置lowhigh处所获得的切片,len=high-lowcap=max-low

len(s)

切片s的长度,总是<=cap(s)

cap(s)

切片s的容量,总是>=len(s)

2.切片的追加和拷贝

1.追加:append()

append函数在容量1024之前容量不足时扩容一倍,容量在1024(当然也包括1024)之后则不按照此规律扩容。

  1. package main
  2. import "fmt"
  3. func main() {
  4. //1024之前扩容一倍
  5. slice := []int{1}
  6. old_cap := cap(slice)
  7. for i:=0;i<10000 ;i++ {
  8. slice = append(slice, i)
  9. if old_cap < cap(slice){
  10. old_cap = cap(slice)
  11. fmt.Println(old_cap)
  12. }
  13. }
  14. }

以上代码输出结果数值如下:

  1. 2 4 8 16
  2. 32 64 128 256
  3. 512 1024 1280 1696
  4. 2304 3072 4096 5120
  5. 7168 9216 12288

2.拷贝:copy(dest, src)

  1. package main
  2. import "fmt"
  3. func main() {
  4. src_slice := []int{1, 2, 3}
  5. dest_slice := []int{4, 5, 6, 7, 8, 9}
  6. //copy(dest_slice, src_slice)
  7. copy(src_slice, dest_slice)
  8. //fmt.Println(dest_slice)
  9. fmt.Println(src_slice)
  10. }

另外:

结构体作为函数参数是:值传递—->使用指针解决:数组指针,区别于指针数组
数组作为函数参数是:值传递—->使用指针解决:结构体指针
切片作为函数参数是:引用传递(传地址)
map作为函数参数是:引用传递(传地址)
指针作为函数参数是:值传递

发表评论

表情:
评论列表 (有 0 条评论,406人围观)

还没有评论,来说两句吧...

相关阅读