go数组、切片

数组

数组属于值类型,在默认情况下是值传递

下标越界会报panic

数组的定义和内存布局
package main

import "fmt"

func main() {
	//字符数组定义
	var str [2]string
	str[0] = "world"
	str[1] = "hello"
	fmt.Println(str)
	//赋值数组的第二种方法
	str1 := [2]string{"12", "safas"}
	fmt.Println(str1)

	//int数组定义
	var data [10]int
	for i := 0; i < 10; i++ {
		data[i] = (i + 1) * 2

	}
	fmt.Println(data)
	//数组赋值第二种方式
	data = [10]int{1, 2, 3, 4, 5}
	fmt.Println(data)
}
内存布局
  1. 数组的地址可以通过数组名来获取 &intArr
  2. 数组第一个元素的地址,就是数组的首地址
  3. 数组的各个元素的地址间隔是依据数据的类型决定,如:int64-8个字节-64比特,int32-4个字节-32比特
数组初始化的四种方法
var numArr01 [3]int = [3]int{1,2,3}
var numArr02 = [3]int{5,6,7}
var numArr03 = [...]int{8,9,10}
var numArr04 = [...]int{1:900,2:600,3:546}

// 类型推导
strArr05 := [...]string{1:"tom",2:"jack",3:"marry"}
数组的遍历 for range
for index,value :range array01{
	遍历体
}
数组的使用步骤
  1. 声明数组并开辟空间
  2. 给数组各个元素赋值
  3. 使用数组

切片

1.切片定义
package main

import "fmt"

func main() {
	// 第一种方式
	var intArr [5]int = [...]int{1, 2, 3, 4, 5}
	slice := intArr[1:4]
	fmt.Println("slice的元素是:", slice)
	fmt.Println("slice的元素个数是:", len(slice))
	fmt.Println("slice的容量是:", cap(slice)) // 切片的容量可以动态变化

	/*
		slice从底层来说,其实就是一个数据结构(struct结构体)
		type slice struct {
			ptr *[2]int
			len int
			cap int
		}
	*/

	// 通过make创建的切片,对应的数组由make底层维护,对外不可见
	// var 切片名 []type = make([]type,len,[cap])   type:类型 len:大小 cap:切片容量,如果分配了cap,则要求cap>=len
	var slice2 []float64 = make([]float64, 5, 10) // make可以指定切片的大小、容量
	slice2[0] = 0.2
	slice2[1] = 0.6
	fmt.Println(slice2)
	slice2 = append(slice2, 6.6, 3.2, 35.5)
	fmt.Println(slice2)
}
2.使用切片
3.切片的遍历
package main

import (
	"fmt"
)

func main() {
	// 第一种方式
	var intArr [5]int = [...]int{1, 2, 3, 4, 5}
	slice := intArr[1:4]
	fmt.Println("slice的元素是:", slice)
	fmt.Println("slice的元素个数是:", len(slice))
	fmt.Println("slice的容量是:", cap(slice)) // 切片的容量可以动态变化

	// 常规遍历
	for i := 0; i < len(slice); i++ {
		fmt.Printf("sclie[%v]=%v \n", i, slice[i])
	}
	/*
		slice从底层来说,其实就是一个数据结构(struct结构体)
		type slice struct {
			ptr *[2]int
			len int
			cap int
		}
	*/

	// 通过make创建的切片,对应的数组由make底层维护,对外不可见
	// var 切片名 []type = make([]type,len,[cap])   type:类型 len:大小 cap:切片容量,如果分配了cap,则要求cap>=len
	var slice2 []float64 = make([]float64, 5, 10) // make可以指定切片的大小、容量
	slice2[0] = 0.2
	slice2[1] = 0.6
	fmt.Println(slice2)
  
  // 动态追加 切片长度
	slice2 = append(slice2, 6.6, 3.2, 35.5)

	// for range 遍历
	for i, v := range slice2 {
		fmt.Printf("i=%v v=%v \n", i, v)
	}
	fmt.Println(slice2)
}
4.修改string
  1. 先转为[]byte 或者[]rune

  2. 修改

二维数组

1.声明

var 数组名 [大小][大小]类型

2.使用方式
  1. 先定义再赋值

    var arr2 [2][3]int
    arr2[1][1] = 10
    
  2. 直接初始化

    var arr3 [2][3]int = [2][3]int{{1,2,3},{4,5,6}}
    
  3. 二维数组的遍历

    1. 双层for循环
    2. 双层for range
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值