iT邦幫忙

2023 iThome 鐵人賽

DAY 2
0
自我挑戰組

Go in 3o系列 第 2

[Day02] Go in 30 - 變數與算符 part01 變數

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20230917/20162693lpP5ABb22D.png

圖片來源 : System32Comics

一、變數簡介

變數可以用來暫存資料,宣告一個變數需滿足四個條件:

  • 宣告變數的敘述
  • 變數名稱
  • 變數要儲存的資料型別
  • 變數的初始值

但是!!我們還是可以視情況省略其中部分,這也意味定義變數不只有一種方式。

二、宣告變數

基本 var 宣告

var 宣告變數是最基本的方式,之後提出來的方法都是由它衍生出來的,
我們先來看看完整的Var宣告,它具備了上述四種條件:

var <變數名稱> <變數型別> = <值>

例如 :

var fruit String = "apple"

var 一次宣告多個變數

我們可以只用一個 var 同時宣告多個變數,而且每個變數型別不必一樣,
還可以有各自的初始值,寫法如下:

var (
    <名稱 1> <型別 2>  = <值 1>
    <名稱 1> <型別 2>  = <值 1>
    ...
    <名稱 N> <型別 N>  = <值 N>
)

例如 :
一口氣宣告三個變數

var (
    customer1 String = "Ricky"  //字串
    male      bool   = true //boolean
    startUpTime time.Time = time.Now() //time.Time結構
)

用var宣告變數時省略型別或賦值

在一些嚴格規定的場合中,或許會需要在宣告套件範圍的變數時指定初始值,
同時嚴格控制型別,而需要完整寫法。
但在其餘場合,我們可以使用省略宣告變數的部分內容的方式。

變數宣告時並不需要同時寫型別或初始值,只要提及其中一個即可,Go語言會處理剩下的部分

如果變數宣告只給型別、沒給初始值,Go語言會自動位變數賦予該型別特有的零值(Zero Value)。
反之,給了初值而沒給型別,Go也會去根據初值去判斷該採用哪種型別。

例如 :

package main

import (
	"fmt"
	"time"
)

var(
	customer1 = "Ricky" //省略型別
	male bool  // 省略初值
	startUpTime = time.Now() //省略型別
)

func main() {
	fmt.Println(male, customer1 , startUpTime)	
}

執行結果 :

https://ithelp.ithome.com.tw/upload/images/20230917/201626933t3hpUmeWU.png

如此一來程式碼變得更精簡。

推斷型別發生問題

有時我們不得不在宣告變數時明確寫出每個環節,
尤其在某些狀況Go無法猜對你所需要的正確型別的時候。

短變數宣告(short variable declaration)

如果是在函式中宣告變數,可以用 := 簡寫寫法進一步精簡,它省略了 var 與 型別。
ps. 只有在函式中才能這麼做

<名稱> := <值>

例如 :

package main

import (
	"fmt"
	"time"
)

func main() {

	customer1 := "Ricky" 
	male := true  
	startUpTime := time.Now() 

	fmt.Println(male, customer1 , startUpTime)
	
}

這樣就變得非常精簡,在Go世界中也是常見變數定義方式,接下來介紹另一個同樣以短變數宣告,
一次搞定變數宣告的方式。

以短變數宣告建立多重變數

使用短變數宣告多重變數,寫法像醬 :

<變數1>, <變數2>, <變數3>, ...<變數N> := <值1>, <值2>, <值3> ...<值 N>

其實也蠻直觀,可以看的出來每個變數會有自己相對應的初始值,換句話說,宣告時要注意。

package main

import (
	"fmt"
	"time"
)

func main() {

    customer1, male, startUpTime = "Ricky", true, time.Now() 
	fmt.Println(male, customer1 , startUpTime)
	
}

這樣閱讀性比較差一點,但當需要呼叫會回傳多個值得函式時,就可以使用了!

透過函式傳回值宣告多重變數

在這裡我們會需要一個函式,這個函式回回傳多個值,
我們再把它指定給多個新變數,如下:

package main

import (
	"fmt"
	"time"
)

func getConfig()(bool, string, time.Time) {
	return false, "info", time.Now()
}

func main() {
	
	male, customer1,startUpTime := getConfig()
	fmt.Println(male, customer1 , startUpTime)

}

結果如下 :

https://ithelp.ithome.com.tw/upload/images/20230917/20162693GtHudblNmS.png

在單行程式內用 var 宣告多重變數

var <變數1>, <變數2>, <變數3>...,<變數N> <型別>
var <變數1>, <變數2>, <變數3>...,<變數N> = <值>
package main

import (
	"fmt"
	"time"
)


func getConfig()(bool, string, time.Time) {
	return false, "info", time.Now()
}

func main() {

	
	//只提供型別
	var start, middle, end float32
	fmt.Println(start, middle , end)

	//初始值的型別差異
	var name, left, right, top, bottom = "one", 1, 1.1, 1.4, 2
	fmt.Println(name, left , right, top, bottom)

	//對函式一樣適用
	male, customer1,startUpTime := getConfig()
	fmt.Println(male, customer1 , startUpTime)
	
}

結果如下:
https://ithelp.ithome.com.tw/upload/images/20230917/20162693XQZbepOIRs.png

三、更改變數

更改單一變數

<變數> = <值>
package main

import (
	"fmt"
)

func main() {

	offset := 5
	fmt.Println(offset)

	offset = 10 //將5改為10
	fmt.Println(offset)
}

更改多個變數

像宣告多重變數一樣 :

<變數1>, <變數2>, <變數3>, ...<變數N> = <值1>, <值2>,...<值N>

一次更改多個變數值,如下:

package main

import (
	"fmt"
)

func main() {

	offset1, offect2, offect3 := 0, 1, 2
	fmt.Println(offset1, offect2, offect3)

	offset1, offect2, offect3 = 10, 11, 12
	fmt.Println(offset1, offect2, offect3)
}

補充說明 :

正常來說我們不可以對已經宣告過的變數使用短變數宣告來賦值,但是有例外!!!
如果短變數宣告左側有多重變數,而當中有任一是之前沒有的新變數,這種寫法可以成立。

例如 :

https://ithelp.ithome.com.tw/upload/images/20230917/20162693DaXPqTdJFT.png

新變數

https://ithelp.ithome.com.tw/upload/images/20230917/20162693QiKZSnsVdH.png

以上就是變數大致整理的部分,下一篇會算符為主題~


上一篇
[Day01] Go in 30 - Go 語言簡介
下一篇
[Day03] Go in 30 - 變數與算符 Part02 運算子與指標
系列文
Go in 3o30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言