[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
}