网站运营目标,安亭公司网站建设,南昌室内设计学校,请描述网站开发的一般流程图文章收录在网站#xff1a;http://hardyfish.top/
文章收录在网站#xff1a;http://hardyfish.top/
文章收录在网站#xff1a;http://hardyfish.top/
文章收录在网站#xff1a;http://hardyfish.top/ Go 语言程序所管理的虚拟内存空间会被分为两部分#xff1a;堆内…文章收录在网站http://hardyfish.top/
文章收录在网站http://hardyfish.top/
文章收录在网站http://hardyfish.top/
文章收录在网站http://hardyfish.top/ Go 语言程序所管理的虚拟内存空间会被分为两部分堆内存和栈内存。 栈内存主要由 Go 语言来管理开发者无法干涉太多堆内存才是我们开发者发挥能力的舞台因为程序的数据大部分分配在堆内存上一个程序的大部分内存占用也是在堆内存上。 小提示我们常说的 Go 语言的内存垃圾回收是针对堆内存的垃圾回收。 变量的声明、初始化就涉及内存的分配比如声明变量会用到 var 关键字如果要对变量初始化就会用到 赋值运算符。 new 函数只用于分配内存并且把内存清零也就是返回一个指向对应类型零值的指针。 new 函数一般用于需要显式地返回指针的情况不是太常用。 make 函数只用于 slice、chan 和 map 这三种内置类型的创建和初始化因为这三种类型的结构比较复杂比如 slice 要提前初始化好内部元素的类型slice 的长度和容量等这样才可以更好地使用它们。 make 函数 在使用 make 函数创建 map 的时候其实调用的是 makemap 函数如下所示 // makemap implements Go map creation for make(map[k]v, hint).func makemap(t *maptype, hint int, h *hmap) *hmap{//省略无关代码}makemap 函数返回的是 *hmap 类型而 hmap 是一个结构体它的定义如下面的代码所示 // A header for a Go map.type hmap struct {// Note: the format of the hmap is also encoded in cmd/compile/internal/gc/reflect.go.// Make sure this stays in sync with the compilers definition.count int // # live cells size of map. Must be first (used by len() builtin)flags uint8B uint8 // log_2 of # of buckets (can hold up to loadFactor * 2^B items)noverflow uint16 // approximate number of overflow buckets; see incrnoverflow for detailshash0 uint32 // hash seedbuckets unsafe.Pointer // array of 2^B Buckets. may be nil if count0.oldbuckets unsafe.Pointer // previous bucket array of half the size, non-nil only when growingnevacuate uintptr // progress counter for evacuation (buckets less than this have been evacuated)extra *mapextra // optional fields}可以看到我们平时使用的 map 关键字其实非常复杂它包含 map 的大小 count、存储桶 buckets 等。 要想使用这样的 hmap不是简单地通过 new 函数返回一个 *hmap 就可以还需要对其进行初始化这就是 make 函数要做的事情如下所示 m:make(map[string]int,10)是不是发现 make 函数和上一小节中自定义的 NewPerson 函数很像 其实 make 函数就是 map 类型的工厂函数它可以根据传递它的 K-V 键值对类型创建不同类型的 map同时可以初始化 map 的大小。 小提示make 函数不只是 map 类型的工厂函数还是 chan、slice 的工厂函数。 它同时可以用于 slice、chan 和 map 这三种类型的初始化。 new 函数
func main() {var sp *stringsp new(string)//关键点*sp 飞雪无情fmt.Println(*sp)}以上代码的关键点在于通过内置的 new 函数生成了一个 *string并赋值给了变量 sp。现在再运行程序就正常了。 内置函数 new 的作用是什么呢可以通过它的源代码定义分析如下所示 // The new built-in function allocates memory. The first argument is a type,// not a value, and the value returned is a pointer to a newly// allocated zero value of that type.func new(Type) *Type它的作用就是根据传入的类型申请一块内存然后返回指向这块内存的指针指针指向的数据就是该类型的零值。 比如传入的类型是 string那么返回的就是 string 指针这个 string 指针指向的数据就是空字符串如下所示 sp1 new(string)fmt.Println(*sp1)//打印空字符串,也就是string的零值。通过 new 函数分配内存并返回指向该内存的指针后就可以通过该指针对这块内存进行赋值、取值等操作。