第 3 節:變數

kuibatian發表於2019-11-15

1:什麼叫變數

可變的量, 計算機用來儲存資料的.

在前面的講解案例中,我們是讓計算機輸出資料到螢幕上,那麼有同學可能就要問了,怎樣讓計算機儲存我們通過鍵盤輸入的資料呢?這就要用到變數了。
所謂的變數簡單的理解就是計算機用來儲存資料的。我們可以理解變數就像我們去超市買商品時用到的購物車,我們先將商品從貨架上拿下來,放到購物車中,結賬時在從購物車中取出商品。計算機通過變數來儲存資料實際上將資料儲存到計算機的記憶體中,這裡我們可以畫一個圖給大家理解一下。

計算機將記憶體劃分成不同的區域,資料就是儲存在這些區域中,那麼怎樣從這些區域中將資料取出來呢?計算機將每塊區域都加上了一串數字,作為編號。通過該編號就可以將資料取出來了,但是問題是,這一串數字對我們程式設計師來說是非常難記憶的,
為了解決這個問題,我們可以通過變數的方式來表示儲存的資料,如下圖:
title
我們給每個儲存區域加上了Number1,Number2,Name等符號,這樣通過這些符號來儲存資料,然後通過這些符號取出資料就非常容易,方便了。這些符號就是變數。

2:變數型別

我們現在理解了變數可以用來儲存資料,但是我們要儲存的資料型別是各種各樣的,例如:整數,小數,文字等等。所以我們必須在定義變數時就要告訴計算機,定義的變數儲存是什麼型別的資料。那麼在記憶體中就可以根據不同的型別來開闢不同的儲存空間。

關於GO語言中的有哪些型別,我們後面會具體講解。下面我們先看一下怎樣宣告變數?

3. 變數宣告

所謂宣告變數就是建立一個變數,並且指定該變數儲存什麼型別的資料。
Go語言引入了關鍵字var,而型別資訊放在變數名之後,示例如下:
title

注意:這裡的輸出是先將變數a的值取出來,然後在列印在螢幕上。所以不能給a這個變數加上引號。

4:變數初始化

我們可以在定義變數時,就給變數賦值,這種方式就是變數的初始化。示例如下:
title
注意:在這裡我們將”=”符號,讀作“賦值號”,不能讀作“等號”。
問題:以下的程式輸出的結果是多少?
var c int =20
fmt.Println(“c”)
同時再次強調一下在這裡輸出變數c的值,所以不能給變數c加上雙引號。

5:變數賦值

除了在定義變數時,完成初始化以外,我們也可以在變數定義完後,再給變數賦值,也就是先宣告後賦值,示例如下:
title
注意:上面的輸出語句也可以只使用一個Println函式,具體如下:fmt.Println(a,b),中間用逗號進行分割
問題1:以下程式的輸出結果是多少?
title
問題2:以下程式的輸出結果是多少?
title
結論:變數可以重複賦值,一旦給一個變數賦了新值,那麼變數中的老值就不復存在了


1-5的程式碼: 第二個程式碼檔案

package main

import (
    "fmt"
    "math"
)

func main0201() {
    //變數的定義和使用
    //var 變數名 資料型別 = 值
    //int 表示整型資料
    var sun int = 50

    //變數在程式執行過程中 值可以發生改變
    //表示式
    sun = sun + 25

    fmt.Println(sun)
}
func main0202() {

    //變數的宣告 如果沒有賦值 預設值為0
    var sun int

    //為變數賦值
    sun = 50

    fmt.Println(sun)
}

func main0203() {
    //float64 浮點型資料
    var value float64 = 2

    //var sum int = value * value * value * value * value * value * value * value * value * value

    //可以使用系統提供的包 計算資料的n次方
    //需要匯入math包 pow函式
    var sum float64 = math.Pow(value, 10)

    fmt.Println(sum)
}

6:自動推導型別
在給變數賦值時,我們感覺非常麻煩,有沒有更簡單的給變數賦值的方式,我們可以使用自動推導型別,具體示例如下:
title

所謂自動推導型別,就是不用通過var 宣告變數,不用指定型別,直接在變數名後面跟”:”號,同時完成賦值。那麼GO會根據所賦的值自動推匯出變數的型別。如果給num變數賦值為小數,那麼該變數的型別為小數型別(浮點)。
通過比較,我們發現這種方式比前面的賦值方式要簡單方便。這種方式,也是我們以後開發過程中最常用的方式。


第三個程式碼檔案:


package main

import "fmt"

func main0301() {
    //var a int = 10
    //var b int = 20
    //不同的資料型別在記憶體中開闢的空間不同
    //自動推導型別
    a := 10      //int     整型
    b := 123.456 //float64 浮點型
    c := "夠浪"  //string 字串型別

    fmt.Println(a + 10)
    fmt.Println(b + 3.14)
    fmt.Println(c)
    //不同的資料型別不能計算
    //fmt.Println(a + b)//err
}

//交換兩個變數的值
func main() {
    a := 10
    b := 20

    //使用第三變數進行交換
    //先定義後使用
    //var c int
    //c = a

    //c := a
    //a = b
    //b = c

    //通過運算進行交換
    a = a + b
    b = a - b
    a = a - b

    fmt.Println(a)
    fmt.Println(b)
}

7:多重賦值匿名變數

(1)多重賦值
在上面的講解中,我們給變數num賦值,採用了自動推導的方式,如果想一次使用自動推導的方式,給多個變數賦值,應該怎樣實現呢?具體如下:

title
但是這種方式寫起來非常的複雜,可以用如下的方式進行簡化:
title

將1的值賦值給a,將10的值賦值給b,將30的值賦值給c.

(2)匿名變數
_匿名變數,丟棄資料不進行處理, _匿名變數配合函式返回值使用才有價值,目前大家只需要知道其語法,後面學到函式時,我們在強調匿名變數的使用場景。
現在我們先看一下匿名變數的語法:
title


//04程式碼檔案
package main

import "fmt"

func main0401() {
    //多重賦值
    //變數個數和值的個數要一一對應
    //a,b,c := 10,20,30
    a, b, c, d := 10, 3.14, "bokedu", "程式設計師"

    fmt.Println(a)
    fmt.Println(b)
    fmt.Println(c)
    fmt.Println(d)

}
func main0402() {
    var a int = 10
    var b int = 20

    //在一個作用域範圍內變數名不能重複
    //var a float64 = 3.14

    //如果在多重賦值時有新定義的變數  可以使用自動推導型別
    a, b, c, d := 110, 120, "你好", "朋友"
    //a, b := 110, 120

    fmt.Println(a)
    fmt.Println(b)
    fmt.Println(c)
    fmt.Println(d)
}

func main() {
    //var a int = 10
    //var b int = 20

    //_表示匿名變數 不接收資料
    _, _, c, d := 120, 110, "你好", "朋友"
    //a, b := 110, 120

    //fmt.Println(_)
    fmt.Println(c)
    fmt.Println(d)
}

8:資料置換

到目前為止,我們已經學習了什麼是變數,變數的定義,以及變數的賦值。那麼下面大家思考如下問題:
有兩個變數a和b, a的值為10,b的值為20,交換兩個變數的值?
(有兩個杯子,都盛滿了水,怎樣交換兩個杯子中的水)
(1)使用傳統方式實現
title
(2)使用多重賦值的方式實現
title
多重賦值的方式交換兩個變數的值,比通過第三個變數來進行變數交換更簡單,程式碼也少。


05程式碼

package main

import "fmt"

func main() {
    a, b := 10, 20

    //可以通過多重賦值進行交換
    a, b = b, a

    fmt.Println(a)
    fmt.Println(b)
}

9:輸出格式

輸出:將資料資訊列印在電腦螢幕上
title

在我們GO語言中進行輸出,用到我們前面所講解的兩個函式:Print()和Println()
這個兩個函式的區別就是Print()函式不換行,Println()換行輸出。
關於輸出這裡有兩個問題,需要給大家強調清楚。
(1)我們前面的程式中,已經多次用到輸出,不管是採用Print(),還是Println(),但是問題是,每次輸出的資料結構不清晰,比較混亂。
例如如下程式:

title

該程式輸出的結果是 1,10,20 .如果我們現在讓另外一個程式設計師檢視該結果,該程式設計師很難分清楚,
1是來自哪個變數,2是來自哪個變數,3來自哪個變數,除非該程式設計師閱讀程式碼。但是,大家想一下,如果該程式的程式碼量非常大,那麼該程式設計師閱讀程式碼是否要花費很長的時間呢?所以,建議採用如下輸出:

title

雙引號內的內容會原樣輸出。這樣結構比較清晰,注意與變數名之間用逗號分隔。

(3)除了使用Println()函式換行輸出以外,還有另外一個函式Printf()也可以實現換行輸出。示例如下:
title
執行以後,發現確實換行了。這種輸出方式,就是格式化輸出,%d,表示輸出的是一個整數,第一個%d會被變數a的值替換,第二個%d會被變數b替換,其它型別的輸出用什麼去表示後面會給大家講解。 “\n” 表示換行。
有同學可能就問了,這種換行輸出方式比較麻煩,但是如果一次性有結構的輸出多個變數的值,Println()輸出就會比較麻煩,並且結構也會感覺比較混亂,還是以上面的程式碼為例,如下:

title
下面我們在給大家演示函式Printf()的輸出:
title
通過對比發現Printf()函式一次性換行輸出多個變數值,結構清晰。


//06
package main

import "fmt"

func main() {

//fmt.Println("hello world")
//fmt.Print("性感荷官線上發牌")
//fmt.Print("澳門線上賭場上線了")
//format
a := 10
b := 3.14559
//%d是一個佔位符 表示輸出一個整型資料

//%f是一個佔位符 表示輸出一個浮點型資料
//%f預設保留六位小數  因為浮點型資料不是精準的資料 六位是有效的
//%.2f保留小數位數為兩位  會對第三位小數進行四捨五入
//\n表示一個轉義字元 換行
fmt.Printf("%d %.2f\n", a, b)

c:="你瞅啥"
//%s是一個佔位符 表示輸出一個字串型別
fmt.Printf("%s",c)

}


10:接收輸入

前面我們所寫的所有的程式,都是直接給變數賦值,但是很多情況下,我們希望使用者通過鍵盤輸入一個數值,儲存到某個變數中,然後將該變數的值取出來,進行操作。我們日常生活中也經常用到輸入的場景:
title
我們們在銀行ATM機器前取錢時,肯定需要輸入密碼,對不?
那麼怎樣才能讓程式知道我們們剛剛輸入的是什麼呢??
大家應該知道了,如果要完成ATM機取錢這件事情,需要先從鍵盤中輸入一個資料,然後用一個變數來儲存,是不是很好理解啊!
那麼我們GO語言怎樣接收使用者的鍵盤輸入呢?如下:
title

在GO中我們用到了“fmt”這個包中的Scanf()函式來接收使用者鍵盤輸入的資料。當程式執行到Scanf()函式後,會停止往下執行,等待使用者的輸入,輸入完成後程式繼續往下執行。在這裡重點要注意的是Scanf()函式的書寫格式,首先也要用“%d”,來表示輸入的是一個整數,輸入完整數後儲存到變數age中,注意這裡age變數前面一定要加上“&”符號,表示獲取記憶體單元的地址(前面我們說的記憶體儲存區域的編號),然後才能夠儲存。
還有另外一種獲取使用者輸入資料的方式,如下:
title
通過Scan函式接收使用者輸入,這時可以省略掉%d,這種寫法更簡單。

11.變數命名規範

在我們前面的程式設計中,我們定義變數時都是隨意進行命名,但是在GO語言中,對變數的命名有一些規範性的要求,下面我們看一下具體的要求。
(1)變數命名規範要求
名字必須以一個字母(Unicode字母)或下劃線開頭,後面可以跟任意數量的字母、數字或下劃線。大寫字母和小寫字母是不同的:heapSort和Heapsort是兩個不同的名字。
除了上面提到的規範要求以外,GO語言自己特有的,具有一定含義的一些字元,也不能作為變數名稱。例如,前面我們接觸到的func, fmt,print等等,這些都是GO自帶的,具有特殊含義的字元,我們稱為關鍵字。

break       default        func         interface        select
case        defer         go           map              struct
chan        else           goto           package          switch
const        fallthrough    if             range            type
continue    for             import        return            var

以上關鍵字都不能作為變數的名稱。
此外,還有大約30多個預定義的名字,比如int和true等

true false iota nil

        int int8 int16 int32 int64
        uint uint8 uint16 uint32 uint64 uintptr
        float32 float64 complex128 complex64
        bool byte rune string error

        make len cap new append copy close delete
        complexrealimag
        panic recover

(2)見名知意
起一個有意義的名字,儘量做到看一眼就知道是什麼意思(提高程式碼可 讀性) 比如: 名字 就定義為 name , 定義學生 用 student

(4)駝峰命名法
title
小駝峰式命名法(lower camel case): 第一個單詞以小寫字母開始;第二個單詞的首字母大寫,例如:myName、aDog
大駝峰式命名法(upper camel case): 每一個單字的首字母都採用大寫字母,例如:FirstName、LastName
不過在程式設計師中還有一種命名法比較流行,就是用下劃線“_”來連線所有的單詞,比如send_buf


// 08
package main

func main() {
    //識別符號命名規則
    /*
    1、允許使用字母 數字 下劃線
    2、不允許使用go系統關鍵
    3、不允許使用數字開頭
    4、區分大小寫
    5、見名知義
     */

     //大駝峰命名
    //RoleLv
    //小駝峰命名
    //roleLv
    //linux命名
    //role_lv

}

相關文章