Golang(二)基本語法

變量與常量

什么是變量

變量是為存儲特定類型的值而提供給內(nèi)存位置的名稱煞肾。在go中聲明變量有多種語法刀疙。

聲明變量

var名稱類型是聲明單個(gè)變量的語法舔痕。

以字母或下劃線開頭魏滚,由一個(gè)或多個(gè)字母镀首、數(shù)字、下劃線組成鼠次。

聲明一個(gè)變量

第一種更哄,指定變量類型,聲明后若不賦值腥寇,使用默認(rèn)值

var name type
name = value

第二種成翩,根據(jù)值自行判定變量類型(類型推斷Type inference)

如果一個(gè)變量有一個(gè)初始值,Go將自動能夠使用初始值來推斷該變量的類型赦役。因此麻敌,如果變量具有初始值,則可以省略變量聲明中的類型掂摔。

var name = value

第三種术羔,省略var, 注意 :=左側(cè)的變量不應(yīng)該是已經(jīng)聲明過的(多個(gè)變量同時(shí)聲明時(shí),至少保證一個(gè)是新變量)乙漓,否則會導(dǎo)致編譯錯誤(簡短聲明)

name := value

// 例如
var a int = 10
var b = 10
c : = 10

這種方式它只能被用在函數(shù)體內(nèi)级历,而不可以用于全局變量的聲明與賦值

示例

package main
var a = "Hello"
var b string = "World"
var c bool

func main(){
    println(a, b, c)
}

結(jié)果

Hello World false

多變量聲明

第一種,以逗號分隔叭披,聲明與賦值分開寥殖,若不賦值,存在默認(rèn)值

var name1, name2, name3 type
name1, name2, name3 = v1, v2, v3

第二種,直接賦值扛禽,下面的變量類型可以是不同的類型

var name1, name2, name3 = v1, v2, v3

第三種锋边,集合類型

var (
    name1 type1
    name2 type2
)

注意事項(xiàng)

如果在相同的代碼塊中,我們不可以再次對于相同名稱的變量使用初始化聲明编曼,例如:a := 20 就是不被允許的,編譯器會提示錯誤 no new variables on left side of :=剩辟,但是 a = 20 是可以的掐场,因?yàn)檫@是給相同的變量賦予一個(gè)新的值。

如果你在定義變量 a 之前使用它贩猎,則會得到編譯錯誤 undefined: a熊户。

如果你聲明了一個(gè)局部變量卻沒有在相同的代碼塊中使用它,同樣會得到編譯錯誤吭服,例如下面這個(gè)例子當(dāng)中的變量 a:

func main() {
   var a string = "abc"
   fmt.Println("hello, world")
}

嘗試編譯這段代碼將得到錯誤 a declared and not used

此外嚷堡,單純地給 a 賦值也是不夠的,這個(gè)值必須被使用

在同一個(gè)作用域中艇棕,已存在同名的變量蝌戒,則之后的聲明初始化,則退化為賦值操作沼琉。但這個(gè)前提是北苟,最少要有一個(gè)新的變量被定義,且在同一作用域打瘪,例如友鼻,下面的y就是新定義的變量

package main

import (
    "fmt"
)

func main() {
    x := 140
    fmt.Println(&x)
    x, y := 200, "abc"
    fmt.Println(&x, x)
    fmt.Print(y)
}

結(jié)果

0xc04200a2b0
0xc04200a2b0 200
abc

空白標(biāo)識符 _ 也被用于拋棄值,如值 5 在:_, b = 5, 7 中被拋棄

_ 實(shí)際上是一個(gè)只寫變量闺骚,你不能得到它的值彩扔。這樣做是因?yàn)?Go 語言中你必須使用所有被聲明的變量,但有時(shí)你并不需要使用從一個(gè)函數(shù)得到的所有返回值

并行賦值也被用于當(dāng)一個(gè)函數(shù)返回多個(gè)返回值時(shí)僻爽,比如這里的 val 和錯誤 err 是通過調(diào)用 Func1 函數(shù)同時(shí)得到:val, err = Func1(var1)

常量聲明

常量是一個(gè)簡單值的標(biāo)識符虫碉,在程序運(yùn)行時(shí),不會被修改的量进泼。

常量中的數(shù)據(jù)類型只可以是布爾型蔗衡、數(shù)字型(整數(shù)型、浮點(diǎn)型和復(fù)數(shù))和字符串型

不曾使用的常量乳绕,在編譯的時(shí)候绞惦,是不會報(bào)錯的

顯示指定類型的時(shí)候,必須確保常量左右值類型一致洋措,需要時(shí)可做顯示類型轉(zhuǎn)換济蝉。這與變量就不一樣了,變量是可以是不同的類型值

const identifier [type] = value
顯式類型定義: const b string = "abc"
隱式類型定義: const b = "abc"
package main

import "fmt"

func main() {
   const LENGTH int = 10
   const WIDTH int = 5
   var area int
   const a, b, c = 1, false, "str" //多重賦值

   area = LENGTH * WIDTH
   fmt.Printf("面積為 : %d", area)
   println()
   println(a, b, c)
}

結(jié)果

面積為 : 50
1 false str

常量可以作為枚舉

const (
    Unknown = 0
    Female = 1
    Male = 2
)

常量組中如不指定類型和初始化值,則與上一行非空常量右值相同

package main

import (
    "fmt"
)

func main() {
    const (
        x uint16 = 16
        y
        s = "abc"
        z
    )
    fmt.Printf("%T,%v\n", y, y)
    fmt.Printf("%T,%v\n", z, z)
}

結(jié)果

uint16,16
string,abc

iota

iota王滤,特殊常量贺嫂,可以認(rèn)為是一個(gè)可以被編譯器修改的常量

在每一個(gè)const關(guān)鍵字出現(xiàn)時(shí),被重置為0雁乡,然后再下一個(gè)const出現(xiàn)之前第喳,每出現(xiàn)一次iota,其所代表的數(shù)字會自動增加1

iota 可以被用作枚舉值:

const (
    a = iota
    b = iota
    c = iota
)

第一個(gè) iota 等于 0踱稍,每當(dāng) iota 在新的一行被使用時(shí)曲饱,它的值都會自動加 1;所以 a=0, b=1, c=2 可以簡寫為如下形式:

const (
    a = iota
    b
    c
)

iota 用法

package main

import "fmt"

func main() {
    const (
            a = iota   //0
            b          //1
            c          //2
            d = "ha"   //獨(dú)立值珠月,iota += 1
            e          //"ha"   iota += 1
            f = 100    //iota +=1
            g          //100  iota +=1
            h = iota   //7,恢復(fù)計(jì)數(shù)
            i          //8
    )
    fmt.Println(a,b,c,d,e,f,g,h,i)
}

結(jié)果

0 1 2 ha ha 100 100 7 8

如果中斷iota自增扩淀,則必須顯式恢復(fù)。且后續(xù)自增值按行序遞增

自增默認(rèn)是int類型啤挎,可以自行進(jìn)行顯示指定類型

數(shù)字常量不會分配存儲空間驻谆,無須像變量那樣通過內(nèi)存尋址來取值,因此無法獲取地址

基本數(shù)據(jù)類型

以下是go中可用的基本數(shù)據(jù)類型

布爾型bool

布爾型的值只可以是常量 true 或者 false庆聘。一個(gè)簡單的例子:var b bool = true

數(shù)值型

整型

  • int8 有符號 8 位整型 (-128 到 127)
  • int16 有符號 16 位整型 (-32768 到 32767)
  • int32 有符號 32 位整型 (-2147483648 到 2147483647)
  • int64 有符號 64 位整型 (-9223372036854775808 到 9223372036854775807)
  • uint8 無符號 8 位整型 (0 到 255)
  • uint16 無符號 16 位整型 (0 到 65535)
  • uint32 無符號 32 位整型 (0 到 4294967295)
  • uint64 無符號 64 位整型 (0 到 18446744073709551615)

int:根據(jù)底層平臺胜臊,表示32或64位整數(shù)。除非需要使用特定大小的整數(shù)掏觉,否則通常應(yīng)該使用int來表示整數(shù)区端。 大小:32位系統(tǒng)32位,64位系統(tǒng)64位澳腹。 范圍:-2147483648到2147483647的32位系統(tǒng)和-9223372036854775808到9223372036854775807的64位系統(tǒng)织盼。

浮點(diǎn)型

  • float32

IEEE-754 32位浮點(diǎn)型數(shù)

  • float64

IEEE-754 64位浮點(diǎn)型數(shù)

  • complex64

32 位實(shí)數(shù)和虛數(shù)

  • complex128

64 位實(shí)數(shù)和虛數(shù)

其他

  • byte

類似 uint8

  • rune

類似 int32

  • uint

32 或 64 位

  • int

與 uint 一樣大小

  • uintptr

無符號整型,用于存放一個(gè)指針

字符串型

字符串就是一串固定長度的字符連接起來的字符序列酱塔。Go的字符串是由單個(gè)字節(jié)連接起來的沥邻。Go語言的字符串的字節(jié)使用UTF-8編碼標(biāo)識Unicode文本

var str string
str = "Hello World"

運(yùn)算符

算術(shù)運(yùn)算符

+ - * / %(求余) ++ --

關(guān)系運(yùn)算符

== != > < >= <=

邏輯運(yùn)算符

運(yùn)算符 描述
&& 所謂邏輯與運(yùn)算符。如果兩個(gè)操作數(shù)都非零羊娃,則條件變?yōu)檎?/td>
丨丨 所謂的邏輯或操作唐全。如果任何兩個(gè)操作數(shù)是非零,則條件變?yōu)檎?/td>
! 所謂邏輯非運(yùn)算符蕊玷。使用反轉(zhuǎn)操作數(shù)的邏輯狀態(tài)邮利。如果條件為真,那么邏輯非操后結(jié)果為假

位運(yùn)算符

A B A&B A丨B A^B
0 0 0 0 0
0 1 0 1 1
1 1 1 1 0
1 0 0 1 1

這里最難理解的就是^了垃帅,只要認(rèn)為AB兩者都相同的時(shí)候延届,為0,其他都為1

運(yùn)算 描述 示例
& 二進(jìn)制與操作副本位的結(jié)果贸诚,如果它存在于兩個(gè)操作數(shù) (A & B) = 12, 也就是 0000 1100
二進(jìn)制或操作副本方庭,如果它存在一個(gè)操作數(shù) (A 丨 B) = 61, 也就是 0011 1101
^ 二進(jìn)制異或操作副本厕吉,如果它被設(shè)置在一個(gè)操作數(shù)但不能同時(shí)是比特 (A ^ B) = 49, 也就是 0011 0001
? 二進(jìn)制左移位運(yùn)算符。左邊的操作數(shù)的值向左移動由右操作數(shù)指定的位數(shù) A ? 2 will give 240 也就是 1111 0000
? 二進(jìn)制向右移位運(yùn)算符械念。左邊的操作數(shù)的值由右操作數(shù)指定的位數(shù)向右移動 A ? 2 = 15 也就是 0000 1111

賦值運(yùn)算符

運(yùn)算符 描述 示例
= 簡單的賦值操作符头朱,分配值從右邊的操作數(shù)左側(cè)的操作數(shù) C = A + B 將分配A + B的值到C
+= 相加并賦值運(yùn)算符,它增加了右操作數(shù)左操作數(shù)和分配結(jié)果左操作數(shù) C += A 相當(dāng)于 C = C + A
-= 減和賦值運(yùn)算符龄减,它減去右操作數(shù)從左側(cè)的操作數(shù)和分配結(jié)果左操作數(shù) C -= A 相當(dāng)于 C = C - A
*= 乘法和賦值運(yùn)算符项钮,它乘以右邊的操作數(shù)與左操作數(shù)和分配結(jié)果左操作數(shù) C *= A is equivalent to C = C * A
/= 除法賦值運(yùn)算符,它把左操作數(shù)與右操作數(shù)和分配結(jié)果左操作數(shù) C /= A 相當(dāng)于 C = C / A
%= 模量和賦值運(yùn)算符欺殿,它需要使用兩個(gè)操作數(shù)的模量和分配結(jié)果左操作數(shù) C %= A 相當(dāng)于 C = C % A
?= 左移位并賦值運(yùn)算符 C ?= 2 相同于 C = C ? 2
?= 向右移位并賦值運(yùn)算符 C ?= 2 相同于 C = C ? 2
&= 按位與賦值運(yùn)算符 C &= 2 相同于 C = C & 2
^= 按位異或并賦值運(yùn)算符 C ^= 2 相同于 C = C ^ 2
丨= 按位或并賦值運(yùn)算符 C 丨= 2 相同于 C = C 丨 2

原文:第2章-基本語法
作者:黎躍春

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末寄纵,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子脖苏,更是在濱河造成了極大的恐慌,老刑警劉巖定踱,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件棍潘,死亡現(xiàn)場離奇詭異,居然都是意外死亡崖媚,警方通過查閱死者的電腦和手機(jī)亦歉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來畅哑,“玉大人肴楷,你說我怎么就攤上這事≤牛” “怎么了赛蔫?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長泥张。 經(jīng)常有香客問我呵恢,道長,這世上最難降的妖魔是什么媚创? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任渗钉,我火速辦了婚禮,結(jié)果婚禮上钞钙,老公的妹妹穿的比我還像新娘鳄橘。我一直安慰自己,他們只是感情好芒炼,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布瘫怜。 她就那樣靜靜地躺著,像睡著了一般焕议。 火紅的嫁衣襯著肌膚如雪宝磨。 梳的紋絲不亂的頭發(fā)上弧关,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天,我揣著相機(jī)與錄音唤锉,去河邊找鬼世囊。 笑死,一個(gè)胖子當(dāng)著我的面吹牛窿祥,可吹牛的內(nèi)容都是我干的株憾。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼晒衩,長吁一口氣:“原來是場噩夢啊……” “哼嗤瞎!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起听系,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤贝奇,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后靠胜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體掉瞳,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年浪漠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了陕习。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,809評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡址愿,死狀恐怖该镣,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情响谓,我是刑警寧澤损合,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站歌粥,受9級特大地震影響塌忽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜失驶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一土居、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧嬉探,春花似錦擦耀、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至胎围,卻和暖如春吁系,著一層夾襖步出監(jiān)牢的瞬間德召,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工汽纤, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留上岗,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓蕴坪,卻偏偏與公主長得像肴掷,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子背传,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評論 2 351

推薦閱讀更多精彩內(nèi)容