看如下代码
package main
import (
"fmt"
"unsafe"
)
func main() {
//make和new函数
//new函数用法
//a := 10
//默认值 int rune byte float bool string这些类型都有默认值
//指针,切片,map,接口这些默认值是nil类型
var a int
a = 10
fmt.Println(a)
//var p *int //声明一个变量,但是变量没有初始值,所以这样是不行的,只有一个占位符,而没有实际分配内存
//*p = 10
//对于指针来说,或者其他默认是nil的情况来说,如何一开始就分配内存
var p *int = new(int) //go的编译器就知道先申请一个内存空间,这里的内存空间的值全部设置为0
*p = 20
fmt.Println(*p)
//除了new函数可以申请内存以外,还有一个函数是make函数,更加常用的是make,make函数一般用于切片,map
var info map[string]string = make(map[string]string)
info["c"] = "wwj"
fmt.Println(info)
//new函数返回的是这个值的地址,指针make函数返回的是自定类型的实例
//nil的一些细节
//和python的none不完全相等
var info2 map[string]string
if info2 == nil {
fmt.Println("map的默认值是nil")
}
var slice []string
if slice == nil {
fmt.Println("slice的默认值是nil")
}
var err error
if err == nil {
fmt.Println("error是nil")
}
//python中的NONE和go语言的nil类型是不一样的,NONE是全局唯一的
//go语言中nil是唯一可以用来表示部分类型的零值标识符,他可以代表许多不同内存布局的值
fmt.Println(unsafe.Sizeof(slice))
fmt.Println(unsafe.Sizeof(info2))
}