變量
單變量聲明
第一種,指定變量類型,聲明後若不指派,使用預設值
var name type
name = value
第二種,類型推斷
var name = value
//也可以寫作
var name type = value
第三種,簡短聲明,省略var
注意 :=左側的變量至少保證一個是新變量,否則會導緻編譯錯誤
name := value
// 例如
var a int = 10
var b = 10
c : = 10
這種方式它隻能被用在函數體内,而不可以用于全局變量的聲明與指派
多變量聲明
第一種,相同類型的變量。以逗号分隔,聲明與指派分開,若不指派,存在預設值
var name1, name2, name3 type
name1, name2, name3 = v1, v2, v3
第二種,直接指派,下面的變量類型可以是不同的類型
var name1, name2, name3 = v1, v2, v3
第三種,集合類型,這種因式分解關鍵字的寫法一般用于聲明全局變量
var (
name1 type1
name2 type2
)
注意事項
1、如果在相同的代碼塊中,我們不可以再次對于相同名稱的變量使用初始化聲明,例如:a := 20 就是不被允許的,編譯器會提示錯誤 no new variables on left side of :=,但是 a = 20 是可以的,因為這是給相同的變量賦予一個新的值。
2、局部變量定義了就要使用,否則無法通過編譯,但是全局變量是允許聲明但不使用的。
3、變量的預設值:
整型:預設值是0
浮點類型:預設是0
字元串:預設值""
布爾:false
其他:
以下幾種類型為 nil:
var a *int
var a []int
var a map[string] int
var a chan int
var a func(string) int
var a error // error 是接口
4、如果你想要交換兩個變量的值,則可以簡單地使用 a, b = b, a,兩個變量的類型必須是相同。
5、空白辨別符 _ 也被用于抛棄值,如值 5 在:_, b = 5, 7 中被抛棄。
_ 實際上是一個隻寫變量,你不能得到它的值。這樣做是因為 Go 語言中你必須使用所有被聲明的變量,但有時你并不需要使用從一個函數得到的所有傳回值。
6、多變量可以在同一行進行指派,如:
a, b, c := 5, 7, "abc"
//或
var a, b int
var c string
a, b, c = 5, 7, "abc"
常量
顯式類型定義: const b string = "abc"
隐式類型定義: const b = "abc"
常量可以作為枚舉,常量組
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)
}
運作結果:
uint16,16
string,abc
常量可以用len(), cap(), unsafe.Sizeof()函數計算表達式的值。常量表達式中,函數必須是内置函數,否則編譯不過:
package main
import "unsafe"
const (
a = "abc"
b = len(a)
c = unsafe.Sizeof(a)
)
func main(){
println(a, b, c)
}
//輸出
abc 3 16
注意事項
- 常量中的資料類型隻可以是布爾型、數字型(整數型、浮點型和複數)和字元串型
- 不曾使用的常量,在編譯的時候,是不會報錯的
- 顯示指定類型的時候,必須確定常量左右值類型一緻,需要時可做顯示類型轉換。這與變量就不一樣了,變量是可以是不同的類型值
iota
iota,特殊常量,可以認為是一個可以被編譯器修改的常量。
第一個 iota 等于 0,每當 iota 在新的一行被使用時,它的值都會自動加 1。
iota 用法
package main
import "fmt"
func main() {
const (
a = iota //0
b //1
c //2
d = "ha" //獨立值,iota += 1
e //"ha" iota += 1
f = 100 //iota +=1
g //100 iota +=1
h = iota //7,恢複計數
i //8
)
fmt.Println(a,b,c,d,e,f,g,h,i)
}
運作結果:
0 1 2 ha ha 100 100 7 8
如果中斷iota自增,則必須顯式恢複。且後續自增值按行序遞增
自增預設是int類型,可以自行進行顯示指定類型
另起一個const(),iota依舊從零遞增
數字常量不會配置設定存儲空間,無須像變量那樣通過記憶體尋址來取值,是以無法擷取位址
有趣的的 iota 執行個體
package main
import "fmt"
const (
i=1<<iota
j=3<<iota
k
l
)
func main() {
fmt.Println("i=",i)
fmt.Println("j=",j)
fmt.Println("k=",k)
fmt.Println("l=",l)
}
以上執行個體運作結果為:
i= 1
j= 6
k= 12
l= 24
iota 表示從 0 開始自動加 1,是以 i=1<<0, j=3<<1(<< 表示左移的意思),即:i=1, j=6,這沒問題,關鍵在 k 和 l,從輸出結果看 k=3<<2,l=3<<3。
簡單表述:
- i=1:左移 0 位,不變仍為 1;
- j=3:左移 1 位,變為二進制 110, 即 6;
- k=3:左移 2 位,變為二進制 1100, 即 12;
- l=3:左移 3 位,變為二進制 11000,即 24。
注:<<n==*(2^n)。
基本資料類型
1.1 布爾型bool
布爾型的值隻可以是常量 true 或者 false。一個簡單的例子:var b bool = true
1.2 數值型
1、整數型
- int8 有符号 8 位整型 (-128 到 127) 長度:8bit
- int16 有符号 16 位整型 (-32768 到 32767)
- int32 有符号 32 位整型 (-2147483648 到 2147483647)
- int64 有符号 64 位整型 (-9223372036854775808 到 9223372036854775807)
- uint8 無符号 8 位整型 (0 到 255) 8位都用于表示數值:
- uint16 無符号 16 位整型 (0 到 65535)
- uint32 無符号 32 位整型 (0 到 4294967295)
- uint64 無符号 64 位整型 (0 到 18446744073709551615)
int和uint:根據底層平台,表示32或64位整數。除非需要使用特定大小的整數,否則通常應該使用int來表示整數。 大小:32位系統32位,64位系統64位。 範圍:-2147483648到2147483647的32位系統和-9223372036854775808到9223372036854775807的64位系統。
2、浮點型
-
float32
IEEE-754 32位浮點型數
-
float64
IEEE-754 64位浮點型數
-
complex64
32 位實數和虛數
-
complex128
64 位實數和虛數
3、其他
-
byte
類似 uint8
-
rune
類似 int32
-
uint
32 或 64 位
-
int
與 uint 一樣大小
-
uintptr
無符号整型,用于存放一個指針
1.3 字元串型
字元串就是一串固定長度的字元連接配接起來的字元序列。Go的字元串是由單個位元組連接配接起來的。Go語言的字元串的位元組使用UTF-8編碼辨別Unicode文本
var str string
str = "Hello World"
注意事項
1、即使是64位機,int與int64不認為是同一種類型,也不能互相指派。
2、64位機,整數預設類型int,浮點數預設類型float64
var a = 100
var b = 29.0
fmt.Printf("%T\n",a)
fmt.Printf("%T\n",b)
//輸出
int
float64
資料類型轉換
文法格式:Type(Value)
注意點:相容類型可以轉換
常數:在有需要的時候,自動轉型
變量:需要手動轉型