go语言中var

SSSR · · 6515 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

go语言中定义变量使用关键字var,如:var x int=4

也可以写成x:=4;

在函数中,:= 简洁赋值语句在明确类型的地方,可以用于替代 var 定义。

:= 结构不能使用在函数外,函数外的每个语法块都必须以关键字开始。)


package main
import (   
    "fmt"
)
func main() {

    var x int = 4
    fmt.Println(x)//输出4
    fmt.Println(&x)//输出指针
    //fmt.Println(*x) //错误
    y := 4
    
    fmt.Println(y)//输出4
    fmt.Println(&y)//输出指针
    //fmt.Println(*y) //错误

   var v *int = new(int)//返回值为指针
    fmt.Println(*v)//输出为0,它只是将内存清零,而不是初始化内存
*v = 4//赋值
    fmt.Println(v)//输出指针
    fmt.Println(*v)//输出4
    z := new(int)//代替var v *int = new(int)
    *z = 3
    fmt.Println(z)//输出指针
    fmt.Println(*z)//输出3
}
总结go语言的变量定义返回值中隐含了指针,可以进行取指针操作,不嫩进行取值操作。
new和make的区别(转)

内存分配

new 是一个分配内存的内建函数,但不同于其他语言中同名的new所作的工作,它只是将内存清零,而不是初始化内存。new(T)为一个类型为T的新项目分配了值为零的存储空间并返回其地址,也就是一个类型为*T的值。用Go的术语来说,就是它返回了一个指向新分配的类型为T的零值的指针

make(T, args)函数的目的与new(T)不同。它仅用于创建切片、map和chan(消息管道),并返回类型T(不是*T)的一个被初始化了的(不是)实例。这种差别的出现是由于这三种类型实质上是对在使用前必须进行初始化的数据结构的引用。例如,切片是一个具有三项内容的描述符,包括指向数据(在一个数组内部)的指针、长度以及容量,在这三项内容被初始化之前,切片值为nil。对于切片、映射和信道,make初始化了其内部的数据结构并准备了将要使用的值。如:

下面的代码分配了一个整型数组,长度为10,容量为100,并返回前10个数组的切片


make([]int, 10, 100)

以下示例说明了newmake的不同。


var p *[]int = new([]int)   // 为切片结构分配内存;*p == nil;很少使用
var v  []int = make([]int, 10) // 切片v现在是对一个新的有10个整数的数组的引用
 
// 不必要地使问题复杂化:
var p *[]int = new([]int)
fmt.Println(p) //输出:&[]
*p = make([]int, 10, 10)
fmt.Println(p) //输出:&[0 0 0 0 0 0 0 0 0 0]
fmt.Println((*p)[2]) //输出: 0
 
// 习惯用法:
v := make([]int, 10)
fmt.Println(v) //输出:[0 0 0 0 0 0 0 0 0 0]

有疑问加站长微信联系(非本文作者)

本文来自:博客园

感谢作者:SSSR

查看原文:go语言中var

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

6515 次点击  
加入收藏 微博
上一篇:go语言入门
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传