一个服务器可以放几个网站,互联网行业还能支撑多久,微信公众号申请注册官网,网站建设美词原创文章目录 指针Go语言中的指针与C语言的区别Go语言中的指针—newGo语言中的指针—makenew与make的区别 参考资料 指针
Go语言中的指针与C语言的区别
区别于C/C中的指针#xff0c;Go语言中的指针不能进行偏移和运算#xff0c;是安全指针。
C语言
#include stdio.h中的指针Go语言中的指针不能进行偏移和运算是安全指针。
C语言
#include stdio.hint main()
{int arr[] {1, 2, 3, 4, 5};// ptr 是一个指针为 arr 数组的第一个元素地址int *ptr arr;printf(%p %d\n, ptr, *ptr);// ptr 指针向高位移动一个单位移向到 arr 数组第二个元素地址ptr;printf(%p %d\n, ptr, *ptr);return (0);
}// 输出结果
// 0061FF08 1
// 0061FF0C 2GO语言
package mainimport fmtfunc main() {arr : [5]uint32{1, 2, 3, 4, 5}// ptr 是一个指针为 arr 数组的第一个元素地址ptr : arr[0]fmt.Println(ptr, *ptr)// ptr 指针向高位移动一个单位移向到 arr 数组第二个元素地址ptrfmt.Println(ptr, *ptr)
}// 输出结果
// 编译报错
// .\main.go:13:5: invalid operation: ptr (non-numeric type *uint32)Go语言中的指针—new
new是一个内置的函数它的函数签名如下 func new(Type) *Type其中 1.Type表示类型new函数只接受一个参数这个参数是一个类型2.*Type表示类型指针new函数返回一个指向该类型内存地址的指针。new函数不太常用使用new函数得到的是一个类型的指针并且该指针对应的值为该类型的零值。举个例子
func main() {a : new(int)b : new(bool)fmt.Printf(%T\n, a) // *intfmt.Printf(%T\n, b) // *boolfmt.Println(*a) // 0fmt.Println(*b) // false
} 本节开始的示例代码中var a *int只是声明了一个指针变量a但是没有初始化指针作为引用类型需要初始化后才会拥有内存空间才可以给它赋值。应该按照如下方式使用内置的new函数对a进行初始化之后就可以正常对其赋值了
func main() {var a *inta new(int)*a 10fmt.Println(*a)
}Go语言中的指针—make
make也是用于内存分配的区别于new它只用于slice、map以及chan的内存创建而且它返回的类型就是这三个类型本身而不是他们的指针类型因为这三种类型就是引用类型所以就没有必要返回他们的指针了。make函数的函数签名如下
func make(t Type, size ...IntegerType) Typemake函数是无可替代的我们在使用slice、map以及channel的时候都需要使用make进行初始化然后才可以对它们进行操作。这个我们在上一章中都有说明关于channel我们会在后续的章节详细说明。
本节开始的示例中var b map[string]int只是声明变量b是一个map类型的变量需要像下面的示例代码一样使用make函数进行初始化操作之后才能对其进行键值对赋值
func main() {var b map[string]intb make(map[string]int, 10)b[测试] 100fmt.Println(b)
}new与make的区别 1.二者都是用来做内存分配的。2.make只用于slice、map以及channel的初始化返回的还是这三个引用类型本身3.而new用于类型的内存分配并且内存对应的值为类型零值返回的是指向类型的指针。参考资料
Go语言中的指针 go的指针跟c的指针区别