[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

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM