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

说明

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

指南

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

变量声明方式

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

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

短变量声明方式

short variable declarations 符号: :=

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

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

new(T)

new(T)的特点:

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

make()

make只用于初始化 slicemapchannel

	// make只能用于创建slice, map, channel
// 切片类型(slice)
makeSlice := make([]int, 5, 10)
fmt.Println(makeSlice)
// 输出: [0 0 0 0 0] // Map 类型
var makeMap map[string]int = make(map[string]int)
fmt.Println(makeMap)
// 输出: map[] // Channel 类型
var makeChan chan int32 = make(chan int32, 100)
fmt.Println(makeChan)
// 输出: 0xc000112000

完整源码

package main

import (
"fmt"
"reflect"
) func main() { // 初始化整数变量,值为10。
var v int = 10
fmt.Println(v)
// 输出: 10 // 变量声明: 一个slice变量
var vSlice []int = []int{1, 2, 3, 4}
fmt.Println(vSlice, "type: ", reflect.TypeOf(vSlice).Kind())
// 输出: [1 2 3 4] type: slice // 短变量声明: 一个map变量,指向的值为[]
var vMap map[string]int = map[string]int{
"a": 1,
"b": 2,
}
fmt.Println(vMap)
// 输出: map[a:1 b:2] // 短变量声明: 一个整数变量。
sdvInt := 10
fmt.Println(sdvInt, "type: ", reflect.TypeOf(sdvInt).Kind())
// 输出: 10 type: int // 短变量声明: 一个slice变量
sdvSlice := []int{1, 2, 3, 4}
fmt.Println(sdvSlice, "type: ", reflect.TypeOf(sdvSlice).Kind())
// 输出: [1 2 3 4] type: slice // 短变量声明: 一个map变量,指向的值为[]
sdvMap := map[string]int{
"a": 1,
"b": 2,
}
fmt.Println(sdvMap)
// 输出: map[a:1 b:2] // 初始化一个整数指针变量,指向的值为0
var newInt *int = new(int)
fmt.Println(*newInt) // 初始化一个slice指针变量
var newSlice = new([10]int)[0:5]
fmt.Println(newSlice, "type: ", reflect.TypeOf(newSlice).Kind())
// 输出: [0 0 0 0 0] type: slice // 初始化一个map指针变量,指向的值为[]
var newMap *map[string]int = new(map[string]int)
fmt.Println(*newMap)
// 输出: map[] // 初始化一个chan指针变量,指向的值为nil
var newChan *chan int = new(chan int)
fmt.Println(*newChan)
// 输出: nil // make只能用于创建slice, map, channel
// 切片类型(slice)
makeSlice := make([]int, 5, 10)
fmt.Println(makeSlice)
// 输出: [0 0 0 0 0] // Map 类型
var makeMap map[string]int = make(map[string]int)
fmt.Println(makeMap)
// 输出: map[] // Channel 类型
var makeChan chan int32 = make(chan int32, 100)
fmt.Println(makeChan)
// 输出: 0xc000112000 }

[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. 给无网络的CentOS服务器下载rpm包的一个解决办法

    很多公司的服务器为了安全都在内网, 是无法直接连接互联网的, 无法连接互联网就无法使用yum等的包管理器安装rpm包等. 有时候一些rpm包还是能很好的提高性能的, 所以可以使用多种方式获取rpm包进 ...

  2. 感受 Vue3 的魔法力量

    ​ 作者:京东科技 牛至伟 近半年有幸参与了一个创新项目,由于没有任何历史包袱,所以选择了Vue3技术栈,总体来说感受如下: • setup语法糖<script setup lang=" ...

  3. vue3中watch监听不是你想的那样简单

    vue3 中watch监听数组,数组变化后未触发回调 今天发生了一个很神奇的现象,就是我使用watch监听数组时. 被监听的数组已经发生了变化.但是没有触发回调操作. 当时的我感到很疑惑? 不应该呀? ...

  4. Spring源码之XML文件中Bean标签的解析2

    读取XML文件,创建默认bean标签对象的核心代码 在DefaultBeanDefinitionDocumentReader类中的如下方法中: protected void processBeanDe ...

  5. TienChin 活动管理-活动状态完善

    修改字典 修改活动状态字典,将之前的数据键值为 0 的数据标签内容改为 过期: 更改下数据库的描述,禁用改为过期: ALTER TABLE `tienchin_activity` MODIFY COL ...

  6. 脑科学与人工神经网络ANN的发展历程与最新研究

    本文深入研究了ANN的基本概念.发展背景.应用场景以及与人脑神经网络的关系. 关注TechLead,分享AI全维度知识.作者拥有10+年互联网服务架构.AI产品研发经验.团队管理经验,同济本复旦硕,复 ...

  7. 应对数据爆炸时代,揭秘向量数据库如何成为AI开发者的新宠,各数据库差异对比

    应对数据爆炸时代,揭秘向量数据库如何成为AI开发者的新宠,各数据库差异对比 随着大模型的爆火,向量数据库也越发成为开发者关注的焦点.为了方便大家更好地了解向量数据库,我们特地推出了<Hello, ...

  8. 深度学习应用篇-计算机视觉-OCR光学字符识别[7]:OCR综述、常用CRNN识别方法、DBNet、CTPN检测方法等、评估指标、应用场景

    深度学习应用篇-计算机视觉-OCR光学字符识别[7]:OCR综述.常用CRNN识别方法.DBNet.CTPN检测方法等.评估指标.应用场景 1.OCR综述 OCR(Optical Character ...

  9. 8.3 NtGlobalFlag

    NtGlobalFlag 是一个Windows内核全局标记,在Windows调试方案中经常用到.这个标记定义了一组系统的调试参数,包括启用或禁用调试技术的开关.造成崩溃的错误代码和处理方式等等.通过改 ...

  10. npm旧淘宝镜像过期,更换新淘宝镜像

    1. 清空缓存 npm cache clean --force 2.设置新淘宝镜像 npm config set registry https://registry.npmmirror.com/ 3. ...