zoukankan      html  css  js  c++  java
  • [golang] 变量声明和初始化 var, :=, new() 和 make()

    [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
    
    }
    
    
    非常感谢阅读!如有不足之处,请留下您的评价和问题。
    请“推荐”本文!
  • 相关阅读:
    OWIN系列之自己动手编写中间件
    Visual Studio2015使用tinyfox2.x作为Owin Host调试教程
    CentOS7下自定义目录安装mono+jexus教程
    TinyFox/Jexus如何正确使用配置文件
    CentOS7下默认目录安装mono+jexus教程
    CentOS 7 常用命令
    javascript动态创建script,并监听onload、onerror
    javascript if
    StackExchange.Redis常用API
    EF EntityState的几种状态
  • 原文地址:https://www.cnblogs.com/steven-yang/p/14621297.html
Copyright © 2011-2022 走看看