這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
Golang學習筆記,便於自己後續查看。
變數
變數是幾乎所有程式設計語言中最基本的組成元素。從根本上說,變數相當於是對一塊資料存放區空間的命名,程式可以通過定義一個變數來申請一塊資料存放區空間,之後可以通過引用變數名來使用這Block Storage空間。
Go語言中的變數使用方式與C語言接近,但具備更大的靈活性。
變數聲明
Go語言的變數聲明方式與C和C++語言有明顯的不同。對於純粹的變數聲明,Go語言引入了關鍵字var,而類型資訊放在變數名之後,樣本如下:
var v1 int
var v2 stringvar v3 [10] int // 數組var v4 [] int // 數組切片var v5 struct {
f int}
var v6 *int // 指標
var v7 map[string]intvar v8 func(a int) int // map,key為string類型,value為int類型
變數聲明語句不需要使用分號作為結束符。與C語言相比,Go語言摒棄了語句必須以分號作為語句結束標記的習慣。
變數初始化
對於聲明變數時需要進行初始化的情境,var關鍵字可以保留,但不再是必要的元素,如下 :
var v1 int = 10 // 正確的使用方式1
var v2 = 10 // 正確的使用方式2,編譯器可以自動推匯出v2的類型
v3 := 10 // 正確的使用方式3,編譯器可以自動推匯出v3的類型
以上三種用法的效果是完全一樣的。與第一種用法相比,第三種用法需要輸入的字元數大大減少,是懶程式員和聰明程式員的最佳選擇。這裡Go語言也引入了另一個C和C++中沒有的符號 (冒號和等號的組合:=),用於明確表達同時進行變數聲明和初始化的工作 。
指定類型已不再是必需的,Go編譯器可以從初始設定式的右值推匯出該變數應該聲明為 4
哪種類型,這讓Go語言看起來有點像動態類型語言,儘管Go語言實際上是 不折不扣 的強型別語言(靜態類型語言)。
當然,出現在:=左側的變數不應該是已經被聲明過的,否則會導致編譯錯誤,比如下面這個 :
var i inti := 2
會導致類似如下的編譯錯誤:
no new variables on left side of :=
變數賦值在Go文法中,變數初始化和變數賦值是兩個不同的概念。下面為聲明一個變數之後的賦值
過程:
var v10 intv10 = 123
Go語言的變數賦值與多數語言一致,但Go語言中提供了C/C++程式員期盼多年的多重賦值功能,比如下面這個交換i和j變數的語句:
i, j = j, i
在不支援多重賦值的語言中,互動兩個變數的內容需要引入一個中間變數:
t = i; i = j; j = t;
匿名變數
我們在使用傳統的強型別語言編程時,經常會出現這種情況,即在調用函數時為了擷取一個值,卻因為該函數返回多個值而不得不定義一堆沒用的變數。在Go中這種情況可以通過結合使用多重返回和匿名變數來避免這種醜陋的寫法,讓代碼看起來更加優雅。
_, _, nickName := "May", "Chan", "Chibi Maruko"
常量
在Go語言中,常量是指編譯期間就已知且不可改變的值。常量可以是數實值型別(包括整型、浮點型和複數類型)、布爾類型、字串類型等 。
字面常量
所謂字面常量(literal),是指程式中硬式編碼常量,如:
-12
3.14159265358979323846 // 浮點類型的常量3.2+12i // 複數類型的常量true // 布爾類型的常量"foo" // 字串常量
Go語言的字面常量更接近我們自然語言中的常量概念,它是無類型的。只要這個常量在相應類型的範圍範圍內,就可以作為該類型的常量,比如上面的常量12,它可以賦值給int、uint、int32、int64、float32、float64、complex64、complex128等類型的變數。
常量定義
通過const關鍵字,你可以給字面常量指定一個友好的名字:
const Pi float64 = 3.14159265358979323846
const zero = 0.0
const u, v float32 = 0, 3
const a, b, c = 3, 4, "foo"//a=3,b=4,c="foo", 無類型整型和字串常量
Go的常量定義可以限定常量類型,但不是必需的。如果定義常量時沒有指定類型,那麼它與字面常量一樣,是無類型常量。常量定義的右值也可以是一個在編譯期運算的常量運算式,比如:
const mask = 1 << 3由於常量的賦值是一個編譯期行為,所以右值不能出現任何需要運行期才能得出結果的運算式,比如試圖以如下方式定義常量就會導致編譯錯誤:
const Home = os.GetEnv("HOME")
原因很簡單,os.GetEnv()只有在運行期才能知道返回結果,在編譯期並不能確定,所以無法作為常量定義的右值。
預定義常量
Go語言預定義了這些常量:true、false和iota。iota比較特殊,可以被認為是一個可被編譯器修改的常量,在每一個const關鍵字出現時被常量定義,
通過const關鍵字,你可以給字面常量指定一個友好的名字:
const Pi float64 = 3.14159265358979323846 // 無類型浮點常量// 無類型整型常量
const u, v float32 = 0, 3
const a, b, c = 3, 4, "foo"//a=3,b=4,c="foo", 無類型整型和字串常量
const zero = 0.0
Go的常量定義可以限定常量類型,但不是必需的。如果定義常量時沒有指定類型,那麼它與字面常量一樣,是無類型常量。常量定義的右值也可以是一個在編譯期運算的常量運算式,比如
const mask = 1 << 3
由於常量的賦值是一個編譯期行為,所以右值不能出現任何需要運行期才能得出結果的運算式,比如試圖以如下方式定義常量就會導致編譯錯誤:
const Home = os.GetEnv("HOME")
原因很簡單,os.GetEnv()只有在運行期才能知道返回結果,在編譯期並不能確定,所以重設為0,然後在下一個const出現之前,每出現一次iota,其所代表的數字會自動增1。從以下的例子可以基本理解iota的用法:
從以下的例子可以基本理解iota的用法:
const (
c0 = iota // iota被重設為0 // c0 == 0
c1 = iota // c1 == 1
c2 = iota // c2 == 2
)
const (
a = 1 << iota // a == 1 (iota在每個const開頭被重設為0)
b = 1 << iota // b == 2
c = 1 << iota // c == 4
)
類型
Go語言內建以下這些基礎類型:
-
頂
-
1
-
踩
-
0
-
主題推薦
-
golang 編程 資料存放區 程式設計語言 自然語言
-
猜你在找
查看評論 * 以上使用者言論只代表其個人觀點,不代表CSDN網站的觀點或立場
核心技術類目
全部主題HadoopAWS移動遊戲JavaAndroidiOSSwift智能硬體DockerOpenStackVPNSparkERPIE10EclipseCRMJavaScript資料庫UbuntuNFCWAPjQueryBIHTML5SpringApache.NETAPIHTMLSDKIISFedoraXMLLBSUnitySplashtopUMLcomponentsWindows MobileRailsQEMUKDECassandraCloudStackFTCcoremailOPhone CouchBase雲端運算iOS6Rackspace Web AppSpringSideMaemoCompuware大資料aptechPerlTornadoRubyHibernateThinkPHPHBasePureSolrAngularCloud FoundryRedisScalaDjangoBootstrap
q454684431
- 訪問:68596次
- 積分:1221
- 等級: 積分:1221
- 排名:第17757名
- 原創:44篇
- 轉載:68篇
- 譯文:0篇
- 評論:8條
- 雲端運算(39)
- linux(15)
- 網路(5)
- git(0)
- python(26)
- 生活感悟(4)
- 虛擬化技術(18)
- 鏡像(2)
- 資料庫(3)
- 訊息機制(4)
- c++(3)
- 遊戲3D(0)
- boost庫之家(5)
- mac(1)
- mysql(1)
- Docker(13)
- 2015年01月(16)
- 2014年09月(1)
- 2014年06月(4)
- 2014年05月(3)
- 2014年04月(8)
- 2014年01月(2)
- 2013年11月(1)
- 2013年09月(14)
- 2013年08月(64)
- python eventlet並發原理分析(2771)
- openstack 工作原理分析(2191)
- glance 上傳鏡像流程(1838)
- keystone 安裝、資料庫配置(1677)
- openstack keystone介紹(1612)
- python輕量級ORM---peewee(1404)
- OpenStack Identity API v3(keystone)(1341)
- openstack中虛擬大神libvirt庫(1273)
- keystone 命令簡要說明(1268)
- qpid入門(1260)
- python 線程池的研究及實現(2)
- python中關於with及contextlib的用法(2)
- python eventlet並發原理分析(1)
- openstack中虛擬大神libvirt庫(1)
- 訊息機制qpid學習(下)(1)
- glance 上傳鏡像流程(1)
- 虛擬化之QEMU與KVM(0)
- Intel VT技術效能初探(0)
- setsockopt/getsockopt Example(0)
- windows socket執行個體(0)
- python eventlet並發原理分析
wangzy208:你從哪轉的,能給一下原文地址嗎?
- glance 上傳鏡像流程
rollingwayne:圖怎麼都掛了?
- openstack中虛擬大神libvirt庫
lenchio:沒有圖片了
- 訊息機制qpid學習(下)
zjm713:我正在學習qpid,非常感謝您的分享,有一個問題請教,用在嵌入式上,而且是在單進程中,這個情境qpi...
- python 線程池的研究及實現
q454684431:那你有收到提示說由於timeout error或者其他錯誤資訊嗎?還是某個線程變為”脫韁“狀態了?
- python 線程池的研究及實現
Leelour:你的程式除了測試代碼和threadpool 不一樣還有其他的改進麼。。。最近在用threadpool...
- python中關於with及contextlib的用法
q454684431:哈哈,最後一行呀,親~~~ python的各種包確實很強大,可是也很多。。。。。不好弄呀~
- python中關於with及contextlib的用法
purple2727:怎麼沒看到轉載的地方,文章很好,我也在學python。