直接值型
数值类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
// }
间接值型
特点:
- 也叫pointer holder 类型,或者叫pointer wrapper类型
- 不像int bool 这种,人家变量对应的内存里,存储的是正儿八经的的、能直接用的、数据!而这种“间接值”类型,它变量对应的内存里,存储的是一个内存地址,顺着这个内存地址找过去,才能正儿八级的、能用的数据!
slice
map
chan管道
interface
指针类型
指针类型,它的值就是存储其他数据的内存地址,所以像slice等类型也就相当于一个特殊点的指针嘛,就是再多加了点其他描述信息,比如len,cap等
一些结论:
- golang中所有的变量赋值,和函数实参传入,都是值拷贝!
- 由于数据类型分为直接值型、和间接值型,所以两种数据的赋值和,函数传参会有2种不同的特征:
- 直接值型:
- 赋值是在内存中产生了一个新的拷贝,分处于不同的内存地址,修改一个不影响另一个!
- 函数实参传参,由于传入的是值拷贝,所以函数内部修改,对外部的“值类型”的变量不起作用(因为修改的是另一个内存地址的拷贝)如果要修改原值,一般要传入该值的地址*T 类型
- 间接值型:
- 赋值时:也是在内存中产生了一个新的拷贝,但是!这个去看这个拷贝的值发现,它的值:是一个内存地址,通过该内存地址可以找到原来的“间接值”的“值部”,所以赋值之后,如果操作其中一个变量,另一个变量也会发生变化,因为!它们的值部,是在同一个内存地址,是一份数据!
- 函数传参:如果想不影响函数外,原有的数据值,往往还需要,一个copy函数,对这个间接值变量,进行一份深拷贝!(内存中赋值一份,不同的内存地址,2份数据)
- 直接值型:
reference
- 如何判断一个数据类型在golang中是值类型,还是引用类型(from newbing)
在golang中,数据类型分为值类型和引用类型两种。值类型包括数值类型、bool、string、数组、struct 结构体等,变量直接存储值,存储在栈内存空间中。而引用类型包括指针、slice 切片、管道 chan、map、以及 interface 等,变量存储的是一个地址,这个地址指向的空间才是真正存储数据的空间,存储在堆内存空间中。123
值类型的数据存储在栈内存空间中,栈在函数调用时被创建,函数调用结束时被销毁。而引用类型的数据存储在堆内存空间中,由垃圾回收器回收。123
- golang101