[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为全局变量. 第二 ...
随机推荐
- 一个PCI-E的硬盘参数
看了下 HDD 随机 IOPS 在 100-200 之间 (读写) SATA的 SSD 随机IOPS 在 读 100k 写 20k 左右U.2的SSD 的随机IOPS 在 读 500k 写 50k 左 ...
- 日志框架简介-Slf4j+Logback入门实践 | 京东云技术团队
前言 随着互联网和大数据的迅猛发展,分布式日志系统和日志分析系统已广泛应用,几乎所有应用程序都使用各种日志框架记录程序运行信息.因此,作为工程师,了解主流的日志记录框架非常重要.虽然应用程序的运行结果 ...
- 浅谈基于Web的跨平台桌面应用开发
作者:京东物流 王泽知 近些年来,跨平台跨端一直是比较热门的话题,Write once, run anywhere,一直是我们开发者所期望的,跨平台方案的优势十分明显,对于开发者而言,可以做到一次开发 ...
- 图片三像素问题如何解决css
一.提出问题 在浏览器中,图片有一个下间隙问题,有人也称之为图片3像素BUG 1.这并不是什么浏览器bug,而只是英文字母书写时有个基线的问题,基线决定了图片的对其方式.这才是造成浏览器中图片下间隙的 ...
- 使用C#做为游戏开发的服务器语言方案
Scut开源服务器 开源C#/Python/Lua 手游服务器 主页:http://www.scutgame.com/index.html 开源:https://github.com/ScutGame ...
- 从零开始配置 vim(15)——状态栏配置
vim 下侧有一个状态栏,会显示当前打开的文件等一系列内容,只是我们很少去关注它.而且原生的vim也支持对状态栏进行自定义.这篇文章主要介绍如何自定义状态栏 设置状态栏 我们可以采用 set stat ...
- JVM底层原理
目录 1.类加载器与ClassFileFormate 2.JVM内存模型 3.对象在JVM中的创建与内存分配 4.对象引用与垃圾回收算法 5.JVM垃圾回收 6.G1垃圾回收器 7.ZGC垃圾回收器
- 常用排序方法——python写法【冒泡、快速排序、TOP-K问题】
1.冒泡排序 相信冒泡排序是很多小伙伴第一个知道的排序算法.它就是每趟排序冒出一个最大(最小)值,相邻两个元素比较,前一个比后一个大,则交换. def bubbleSort(arr): n = len ...
- C++ CryptoPP使用AES加解密
Crypto++ (CryptoPP) 是一个用于密码学和加密的 C++ 库.它是一个开源项目,提供了大量的密码学算法和功能,包括对称加密.非对称加密.哈希函数.消息认证码 (MAC).数字签名等.C ...
- 关于Docker容器中的DNS配置
Docker: 1.启动时指定: docker run --dns 8.8.8.8 busybox:latest 2.全局配置: vi /etc/docker/daemon.json { " ...