golang内置数据结构

35 阅读3分钟

直接值型

数值类int int32 等

bool

string也是!

struct也是!

array


package main

import "fmt"

func main() {
	/* jason-comment
	   	[0]
	   [0]
		 函数内部修改不影响外部,说明array数组是值类型
	*/
	var arr1 [1]int
	fmt.Println(arr1)

	testArray(arr1)
	fmt.Println(arr1)

}

func testArray(arr [1]int) {
	arr[0] = 100
}

// package main

// import "fmt"

// func main() {
// 	/* jason-comment
// 	   	[99]
// 	   [100]
// 函数内部修改影响外部,说明slice是引用类型
// 	*/
// 	var arr1 = make([]int, 1)
// 	arr1[0] = 99
// 	fmt.Println(arr1)

// 	testSlice(arr1)
// 	fmt.Println(arr1)

// }

// func testSlice(arr []int) {
// 	arr[0] = 100
// }

间接值型

特点:

  1. 也叫pointer holder 类型,或者叫pointer wrapper类型
  2. 不像int bool 这种,人家变量对应的内存里,存储的是正儿八经的的、能直接用的、数据!而这种“间接值”类型,它变量对应的内存里,存储的是一个内存地址,顺着这个内存地址找过去,才能正儿八级的、能用的数据!

slice

map

chan管道

interface

指针类型

指针类型,它的值就是存储其他数据的内存地址,所以像slice等类型也就相当于一个特殊点的指针嘛,就是再多加了点其他描述信息,比如len,cap等

一些结论:

  1. golang中所有的变量赋值,和函数实参传入,都是值拷贝!
  2. 由于数据类型分为直接值型、和间接值型,所以两种数据的赋值和,函数传参会有2种不同的特征:
    1. 直接值型:
      1. 赋值是在内存中产生了一个新的拷贝,分处于不同的内存地址,修改一个不影响另一个!
      2. 函数实参传参,由于传入的是值拷贝,所以函数内部修改,对外部的“值类型”的变量不起作用(因为修改的是另一个内存地址的拷贝)如果要修改原值,一般要传入该值的地址*T 类型
    2. 间接值型:
      1. 赋值时:也是在内存中产生了一个新的拷贝,但是!这个去看这个拷贝的值发现,它的值:是一个内存地址,通过该内存地址可以找到原来的“间接值”的“值部”,所以赋值之后,如果操作其中一个变量,另一个变量也会发生变化,因为!它们的值部,是在同一个内存地址,是一份数据!
      2. 函数传参:如果想不影响函数外,原有的数据值,往往还需要,一个copy函数,对这个间接值变量,进行一份深拷贝!(内存中赋值一份,不同的内存地址,2份数据)

reference

  1. 如何判断一个数据类型在golang中是值类型,还是引用类型(from newbing)

在golang中,数据类型分为值类型和引用类型两种。值类型包括数值类型、bool、string、数组、struct 结构体等,变量直接存储值,存储在栈内存空间中。而引用类型包括指针、slice 切片、管道 chan、map、以及 interface 等,变量存储的是一个地址,这个地址指向的空间才是真正存储数据的空间,存储在堆内存空间中。123

值类型的数据存储在栈内存空间中,栈在函数调用时被创建,函数调用结束时被销毁。而引用类型的数据存储在堆内存空间中,由垃圾回收器回收。123

值类型的变量直接存储值,而引用类型的变量存储的是一个地址,这个地址指向的空间才是真正存储数据的空间。123

  1. golang101