[golang] 变量声明和初始化 var, :=, new() 和 make()

说明

go语言中,提供了多种变量声明和初始化的方法。这里着重一一说明。并提供一个简单的指南。

指南

  • 使用make(),来初始化slicemapchannel
  • 大多数场合,类型明确的场合下,使用短变量声明方式:=
  • 当使用文字方式初始化一个变量,并且需要指明类型时,使用var变量声明方式。
  • 避免使用new(),除非你需要一个指针变量。

变量声明方式

go语言可以使用 var 来声明一个变量,并指明变量的数据类型。

  1. // 初始化整数变量,值为10。
  2. var v int = 10
  3. fmt.Println(v)
  4. // 输出: 10
  5. // 变量声明: 一个slice变量
  6. var vSlice []int = []int{1, 2, 3, 4}
  7. fmt.Println(vSlice, "type: ", reflect.TypeOf(vSlice).Kind())
  8. // 输出: [1 2 3 4] type: slice
  9. // 短变量声明: 一个map变量,指向的值为[]
  10. var vMap map[string]int = map[string]int{
  11. "a": 1,
  12. "b": 2,
  13. }
  14. fmt.Println(vMap)
  15. // 输出: map[a:1 b:2]

短变量声明方式

short variable declarations 符号: :=

短变量声明时,变量的默认类型是: bool, rune, int, float64, complex128 or string

  1. // 短变量声明: 一个整数变量。
  2. sdvInt := 10
  3. fmt.Println(sdvInt, "type: ", reflect.TypeOf(sdvInt).Kind())
  4. // 输出: 10 type: int
  5. // 短变量声明: 一个slice变量
  6. sdvSlice := []int{1, 2, 3, 4}
  7. fmt.Println(sdvSlice, "type: ", reflect.TypeOf(sdvSlice).Kind())
  8. // 输出: [1 2 3 4] type: slice
  9. // 短变量声明: 一个map变量,指向的值为[]
  10. sdvMap := map[string]int{
  11. "a": 1,
  12. "b": 2,
  13. }
  14. fmt.Println(sdvMap)
  15. // 输出: map[a:1 b:2]

new(T)

new(T)的特点:

  • 根据类型T分配内存
  • 设置内存为0
  • 返回内存的指针
  1. // 初始化一个整数指针变量,指向的值为0
  2. var i3 *int = new(int)
  3. fmt.Println(*i3)
  4. // 初始化一个slice指针变量
  5. var i4 = new([10]int)[0:5]
  6. fmt.Println(i4, "type: ", reflect.TypeOf(i4).Kind())
  7. // 输出: [0 0 0 0 0] type: slice
  8. // 初始化一个map指针变量,指向的值为[]
  9. var i5 *map[string]int = new(map[string]int)
  10. fmt.Println(*i5)
  11. // 输出: map[]
  12. // 初始化一个chan指针变量,指向的值为nil
  13. var i6 *chan int = new(chan int)
  14. fmt.Println(*i6)
  15. // 输出: nil

make()

make只用于初始化 slicemapchannel

  1. // make只能用于创建slice, map, channel
  2. // 切片类型(slice)
  3. makeSlice := make([]int, 5, 10)
  4. fmt.Println(makeSlice)
  5. // 输出: [0 0 0 0 0]
  6. // Map 类型
  7. var makeMap map[string]int = make(map[string]int)
  8. fmt.Println(makeMap)
  9. // 输出: map[]
  10. // Channel 类型
  11. var makeChan chan int32 = make(chan int32, 100)
  12. fmt.Println(makeChan)
  13. // 输出: 0xc000112000

完整源码

  1. package main
  2. import (
  3. "fmt"
  4. "reflect"
  5. )
  6. func main() {
  7. // 初始化整数变量,值为10。
  8. var v int = 10
  9. fmt.Println(v)
  10. // 输出: 10
  11. // 变量声明: 一个slice变量
  12. var vSlice []int = []int{1, 2, 3, 4}
  13. fmt.Println(vSlice, "type: ", reflect.TypeOf(vSlice).Kind())
  14. // 输出: [1 2 3 4] type: slice
  15. // 短变量声明: 一个map变量,指向的值为[]
  16. var vMap map[string]int = map[string]int{
  17. "a": 1,
  18. "b": 2,
  19. }
  20. fmt.Println(vMap)
  21. // 输出: map[a:1 b:2]
  22. // 短变量声明: 一个整数变量。
  23. sdvInt := 10
  24. fmt.Println(sdvInt, "type: ", reflect.TypeOf(sdvInt).Kind())
  25. // 输出: 10 type: int
  26. // 短变量声明: 一个slice变量
  27. sdvSlice := []int{1, 2, 3, 4}
  28. fmt.Println(sdvSlice, "type: ", reflect.TypeOf(sdvSlice).Kind())
  29. // 输出: [1 2 3 4] type: slice
  30. // 短变量声明: 一个map变量,指向的值为[]
  31. sdvMap := map[string]int{
  32. "a": 1,
  33. "b": 2,
  34. }
  35. fmt.Println(sdvMap)
  36. // 输出: map[a:1 b:2]
  37. // 初始化一个整数指针变量,指向的值为0
  38. var newInt *int = new(int)
  39. fmt.Println(*newInt)
  40. // 初始化一个slice指针变量
  41. var newSlice = new([10]int)[0:5]
  42. fmt.Println(newSlice, "type: ", reflect.TypeOf(newSlice).Kind())
  43. // 输出: [0 0 0 0 0] type: slice
  44. // 初始化一个map指针变量,指向的值为[]
  45. var newMap *map[string]int = new(map[string]int)
  46. fmt.Println(*newMap)
  47. // 输出: map[]
  48. // 初始化一个chan指针变量,指向的值为nil
  49. var newChan *chan int = new(chan int)
  50. fmt.Println(*newChan)
  51. // 输出: nil
  52. // make只能用于创建slice, map, channel
  53. // 切片类型(slice)
  54. makeSlice := make([]int, 5, 10)
  55. fmt.Println(makeSlice)
  56. // 输出: [0 0 0 0 0]
  57. // Map 类型
  58. var makeMap map[string]int = make(map[string]int)
  59. fmt.Println(makeMap)
  60. // 输出: map[]
  61. // Channel 类型
  62. var makeChan chan int32 = make(chan int32, 100)
  63. fmt.Println(makeChan)
  64. // 输出: 0xc000112000
  65. }

[golang] 变量声明和初始化 var, :=, new() 和 make()的更多相关文章

  1. 关于Javascript循环体变量声明与初始化的效率问题

    针对循环体变量声明与初始化的效率问题,将执行的简单测试代码如下: function test(n) { console.time('Internally initialized'); for (var ...

  2. ES6和ES5变量声明的区别(var let const)

    // es5的语法与es6的语法区别 // var let const console.log(name);//undefine,不会报错,因为变量声明会提到作用域的最前面 var name=&quo ...

  3. 【C++】const,static和static const类型成员变量声明及其初始化

    1)const定义的常量在超出其作用域之后其空间会被释放,而static定义的静态常量在函数执行后不会释放其存储空间 void f1() { ; cout<<x<<endl; ...

  4. C++ static、const和static const类型成员变量声明以及初始化

    C++ static.const和static const 以及它们的初始化 const定义的常量在超出其作用域之后其空间会被释放,而static定义的静态常量在函数执行后不会释放其存储空间. sta ...

  5. golang变量声明

    func main() { var a1 int a1 = 1 var a = 1 b := 1 var c, d int c = 1 d = 1 var e, f = 1, 2 g, h := 1, ...

  6. GoLang学习之变量定义和初始化

    变量命名原则 go语言的变量名有字母数字和下划线组成,首字母不能为数字,但是字母不仅仅只限于英文字母,所有的UTF-8字符都是可以的. 变量声明和初始化方式 使用var关键字 var a int = ...

  7. 详解变量声明加 var 和不加 var 的区别

    在全局作用域中声明变量加 var 关键字和不加 var ,js 引擎都会将这个变量声明为全局变量,在实际运行时,两种声明方式的变量的行为也是几乎一致的.但是在全局作用域下是否声明一个变量的 时候加va ...

  8. Go语言规格说明书 之 变量声明(Variable/Short variable declarations)

    go version go1.11 windows/amd64 本文为阅读Go语言中文官网的规则说明书(https://golang.google.cn/ref/spec)而做的笔记,完整的介绍Go语 ...

  9. (1)Go变量声明、赋值和常量

     先简单了解一下控制台输出,在go中,我们使用fmt包中的函数进行在控制台中打印,一般用以下几个函数      fmt.Print()        #不换行输出      fmt.Printf()  ...

  10. [JavaScript]JS中的变量声明与有效域

    1.变量声明 var a = 1; //使用var声明变量 b = 1; //不使用var 第一种情况,在当前域中声明一个名为a的变量,如果实在方法内则为局部变量,若在最外层声明则a为全局变量. 第二 ...

随机推荐

  1. [转帖]查看堆内对象的工具:jmap

    文章目录 用途 命令格式 示例 一,no option 二,heap 三,histo[:live] 四,clstats 五,finalizerinfo 六,dump:<dump-options& ...

  2. 简单监控Tomcat连接池大小的命令以及其他简单命令

    while true ; do date && echo "当前数据库连接池大小为:" $(jmap -histo `jps |grep caf |awk '{pr ...

  3. ngnix在linux安装并设置反向代理

    一.nginx安装 1.安装Nginx依赖的环境 安装Nginx依赖的gcc的编译环境: yum install gcc-c++ Nginx的http模块需要使用pcre来解析正则表达式,需要安装pc ...

  4. TienChin-课程管理-课程导出

    更改 Course.java: /** * 课程ID */ @TableId(value = "course_id", type = IdType.AUTO) @NotNull(m ...

  5. 微信小程序-双线程渲染模型

    微信小程序双线程渲染模型 小程序的运行环境分成渲染层和逻辑层: WXML 模板和 WXSS 样式工作在渲染层,通过 WebView 进行渲染 小程序会为每一个界面都创建一个 WebView 来渲染这个 ...

  6. 利用Mybatis拦截器实现自定义的ID自增器

    原生的Mybatis框架是没有ID自增器,但例如国产的Mybatis Plus却是支持,不过,Mybatis Plus却是缺少了自定属性的填充:例如:我们需要自定义填充一些属性,updateDate. ...

  7. 年末将至,Java 开发者必须了解的 16 个Java 顶级开源项目!

    年末将至,值得你关注的16个Java 开源项目! 本文已经收录自笔者开源的 JavaGuide: https://github.com/Snailclimb/JavaGuide ([Java学习+面试 ...

  8. 【部署教程】基于GPT2训练了一个傻狗机器人 - By ChatGPT 技术学习

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 首先我想告诉你,从事编程开发这一行,要学会的是学习的方式方法.方向对了,才能事半功倍.而我认为 ...

  9. dropzone基本使用

    dropzone是一个实现拖拽上传文件的一个插件. 生成拖拽区域 1 <div style="width: 1078px;margin: 0 auto;border: 2px ligh ...

  10. Codeforces Round #824 (Div. 2) A-E

    比赛链接 A 题解 知识点:贪心,数学. 注意到三段工作时间一共 \(n-3\) 天,且天数实际上可以随意分配到任意一段,每段至少有一天,现在目的就是最大化段差最小值. 不妨设 \(l_1<l_ ...