[golang] 变量声明和初始化 var, :=, new() 和 make()
[golang] 变量声明和初始化 var, :=, new() 和 make()
说明
go语言中,提供了多种变量声明和初始化的方法。这里着重一一说明。并提供一个简单的指南。
指南
- 使用
make()
,来初始化slice
,map
和channel
。 - 大多数场合,类型明确的场合下,使用短变量声明方式
:=
。 - 当使用文字方式初始化一个变量,并且需要指明类型时,使用
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只用于初始化 slice
,map
和 channel
。
// 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()的更多相关文章
- 关于Javascript循环体变量声明与初始化的效率问题
针对循环体变量声明与初始化的效率问题,将执行的简单测试代码如下: function test(n) { console.time('Internally initialized'); for (var ...
- ES6和ES5变量声明的区别(var let const)
// es5的语法与es6的语法区别 // var let const console.log(name);//undefine,不会报错,因为变量声明会提到作用域的最前面 var name=&quo ...
- 【C++】const,static和static const类型成员变量声明及其初始化
1)const定义的常量在超出其作用域之后其空间会被释放,而static定义的静态常量在函数执行后不会释放其存储空间 void f1() { ; cout<<x<<endl; ...
- C++ static、const和static const类型成员变量声明以及初始化
C++ static.const和static const 以及它们的初始化 const定义的常量在超出其作用域之后其空间会被释放,而static定义的静态常量在函数执行后不会释放其存储空间. sta ...
- 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, ...
- GoLang学习之变量定义和初始化
变量命名原则 go语言的变量名有字母数字和下划线组成,首字母不能为数字,但是字母不仅仅只限于英文字母,所有的UTF-8字符都是可以的. 变量声明和初始化方式 使用var关键字 var a int = ...
- 详解变量声明加 var 和不加 var 的区别
在全局作用域中声明变量加 var 关键字和不加 var ,js 引擎都会将这个变量声明为全局变量,在实际运行时,两种声明方式的变量的行为也是几乎一致的.但是在全局作用域下是否声明一个变量的 时候加va ...
- Go语言规格说明书 之 变量声明(Variable/Short variable declarations)
go version go1.11 windows/amd64 本文为阅读Go语言中文官网的规则说明书(https://golang.google.cn/ref/spec)而做的笔记,完整的介绍Go语 ...
- (1)Go变量声明、赋值和常量
先简单了解一下控制台输出,在go中,我们使用fmt包中的函数进行在控制台中打印,一般用以下几个函数 fmt.Print() #不换行输出 fmt.Printf() ...
- [JavaScript]JS中的变量声明与有效域
1.变量声明 var a = 1; //使用var声明变量 b = 1; //不使用var 第一种情况,在当前域中声明一个名为a的变量,如果实在方法内则为局部变量,若在最外层声明则a为全局变量. 第二 ...
随机推荐
- [转帖]APIServer dry-run and kubectl diff
https://kubernetes.io/blog/2019/01/14/apiserver-dry-run-and-kubectl-diff/ Monday, January 14, 2019 A ...
- 查看dmesg 里面部分内容的精确时间
for i in `dmesg |grep "stuck for" |awk '{print $1}' |awk -F "." '{print $1}' |aw ...
- R2M分布式锁原理及实践
作者:京东科技 张石磊 1 案例引入 名词简介: 资源:可以理解为一条内容,或者图+文字+链接的载体. 档位ID: 资源的分类组,资源必须归属于档位. 问题描述:当同一个档位下2条资源同时审批通过时, ...
- 【验证码逆向专栏】某度滑块、点选、旋转验证码 v1、v2 逆向分析
声明 本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容.敏感网址.数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 本文章未经许 ...
- 【1】paddle飞桨框架高层API使用讲解
1.高层API简介 飞桨框架2.0全新推出高层API,是对飞桨API的进一步封装与升级,提供了更加简洁易用的API,进一步提升了飞桨的易学易用性,并增强飞桨的功能. 飞桨高层API由五个模块组成:数据 ...
- C/C++ 通过HTTP实现文件上传下载
WinInet(Windows Internet)是 Microsoft Windows 操作系统中的一个 API 集,用于提供对 Internet 相关功能的支持.它包括了一系列的函数,使得 Win ...
- Pdfium.Net.Free 一个免费的Pdfium的 .net包装器--快速入门
Pdfium.Net.Free 支持 .NETFramework 4.0 .NETFramework 4.5 .NETStandard 2.0 可以和PdfiumViewer.Free共同使用预览pd ...
- Unity框架中的核心类
组件:Component 在Unity中,所有的游戏对象都可以挂载组件.组件控制着游戏对象的行为和外观,例如渲染.动画.碰撞检测等. 而Component就是组件的基类,提供了一些通用的方法和属性,例 ...
- 《ASP.ENT Core 与 RESTful API 开发实战》-- (第5章)-- 读书笔记(中)
第 5 章 使用 Entity Framework Core 5.3 重构仓储类 创建一个通用仓储接口 namespace Library.API.Services { public interfac ...
- .NET Core开发实战(第24课:文件提供程序:让你可以将文件放在任何地方)--学习笔记
24 | 文件提供程序:让你可以将文件放在任何地方 文件提供程序核心类型: 1.IFileProvider 2.IFileInfo 3.IDirectoryContents IFileProvider ...