iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 6
0
Software Development

學習Go系列 第 6

Go day 6 (new & lifecycle & type)

new

go 的 new 寫法是 new(T),T 是代表型別(int,string,...).會建立一個初始化 T 型別的位址值.
下面的範例 num 會指向 0xc000090008 位址,並印出 int 的初始值,之後可以改變值但位址不變.

package main

import (
	"fmt"
)

func main() {
	num := new(int)
	fmt.Println(num)  // 0xc000090008
	fmt.Println(*num) // 0
	*num = 10
	fmt.Println(num)  // 0xc000090008
	fmt.Println(*num) // 10
}

如果沒有使用 new 則需要先宣告一個 int 變數,num 再指到 n 的位址.

var n int
num := &n
fmt.Println(num)  // 0xc000090008
fmt.Println(*num) // 0
*num = 10
fmt.Println(num)  // 0xc000090008
fmt.Println(*num) // 10

lifecycle

package 層級的變數的 lifecycle 在結束程式前都會一直存活.
區域變數每次呼叫都會建立新的 instance,當建立出來的 instance 都沒被使用到時,就可能被垃圾回收機制回收.但像範例 nt 指到第 2 個 test(),所以第 2 個 test() 的 localv 就不會被回收.

package main

import (
	"fmt"
)

var globalv string
var nt *int

func test() *int {
	var localv int
	return &localv
}

func main() {
	fmt.Println(&globalv) // 0x118b890
	fmt.Println(test())   // 0xc0000140b8
	nt := test()
	fmt.Println(nt) // 0xc0000140d0
}

type

type 可以用來根據基底的型別創造新的型別,像下面的 Anamal 與 Plant 的基底的型別都還是 string ,
所以也具備 string 的功能初始值也是 "".然後也可以用 var 宣告型別為 Anamal 與 Plant 的變數.
兩者由於是不同型別所以也無法比較.而每個新型別 T 都可以透過 T(v) 可將 v 值轉換成新的型別.

package main

import (
	"fmt"
)

type Anamal string
type Plant string

func getAnamal(name Anamal) Anamal {
	return Anamal(name)
}

func getPlant(name Plant) Plant {
	return Plant(name)
}

func main() {
	fmt.Println(getAnamal("Dog")) // Dog
	fmt.Println(getPlant("Rose")) // Rose
	var anamal Anamal
	var plant Plant
	fmt.Println(anamal == "") // true
	//fmt.Println(plant == anamal) // invalid operation: plant == anamal (mismatched types Plant and Anamal)
	fmt.Println(plant == Plant(anamal)) // true
}


上一篇
Go day 5 (pointer & assign)
下一篇
Go day 7 (init & scope)
系列文
學習Go30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言