文章目录

  • 定义
  • 数据类型
  • 修改
  • 声明, 初始化和赋值



定义

  • 值类型
    变量直接储存值
    值存在栈区中(栈中存放的是生命周期短的变量, 比如局部变量)
  • 引用类型
    变量储存地址, 地址储存最终的值
    存放在堆区(栈中存放的是生命周期长的变量, 比如全局变量)

数据类型

值类型

引用类型

int

slice

float

map

bool

channel

string

interface

array

struct


修改

  • 值类型赋值
package main

import "fmt"

func main() {
	// 值类型
	a := [3]int{1, 2, 3}
	
	// 直接赋值
	b := a
	
	b[0] = 100
	fmt.Println(a, b) // [1 2 3] [100 2 3]
}
  • 引用类型 - 深拷贝
package main

import "fmt"

func main() {
	// 引用类型
	c := []int{1, 2, 3}

	// 构造一个长度容量和 c 相同的切片
	d := make([]int, len(c), cap(c))

	// 深拷贝赋值
	copy(d, c)

	d[0] = 100
	fmt.Println(c, d)
}
  • 在函数中修改元素时
package main

// 函数传参使用, 实际上是将参数复制一份, 在函数内部修改	

import "fmt"

// 示例, 直接传值修改不生效
func a(a [2]int) {
	a[0] = 10
}

// 值类型,若需要修改,传进来的必须是指针
func b(a *[2]int) {
	a[0] = 10
}

// 引用类型直接传即可
func c(a []int) {
	a[0] = 10
}

func main() {
	x := [2]int{1, 2}
	a(x)

	y := [2]int{1, 2}
	b(&y)

	z := []int{1, 2}
	c(z)

	fmt.Println(x, y, z) // [1 2] [10 2] [10 2]
}

声明, 初始化和赋值

  • 值类型
package main

import "fmt"

// 需要声明 --> 赋值
func main() {
	// 声明
	var a [3]int // 此时的值为 [0 0 0]
	// 赋值
	a = [3]int{1, 2, 3}


	// 声明+赋值可简写为
	aa := [3]int{1,2,3} // 结果为[1 2 3]
}
  • 引用类型
package main

import "fmt"

// 需要声明 --> 初始化 --> 赋值
func main() {
	// 声明
	var b []int // 此时的值为nil
	// 初始化
	b = make([]int, 0, 10) // 此时的值为[], 因为长度为0
	// 赋值
	b = []int{1, 2, 3}


	// 声明+初始化可简写为
	bb := make([]int, 0, 10) // 此时的值为[], 因为长度为0

	
	// 声明+初始化+赋值可简写为
	bbb := []int{1, 2, 3}
}