基本類型
1.基本類型列表
復(fù)制代碼 代碼如下:
類型 長(zhǎng)度 說明
bool 1 true/false,默認(rèn)false, 不能把非0值當(dāng)做true(不用數(shù)字代表true/false)
byte 1 uint8 別名
rune 4 int32別名。 代表一個(gè)unicode code point
int/unit 一來所運(yùn)行的平臺(tái),32bit/64bit
int8/uint8 1 -128 ~ 127; 0 ~ 255
int16/uint16 2 -32768 ~ 32767; 0 ~ 65535
int32/uint32 4 -21億 ~ 21億, 0 ~ 42億
int64/uint64 8
float32 4 精確到7位小數(shù),相當(dāng)于c的float
float64 8 精確到15位小數(shù),相當(dāng)于c的double
complex64 8
complex128 16
uintptr 足夠保存指針的32位、64位整數(shù),指針(可以存指針的整數(shù)型)
array 值類型,數(shù)組
struct 值類型,結(jié)構(gòu)體
string 值類型,字符串類型,常用
slice 引用類型,切片
map 引用類型,字典
channel 引用類型,通道
interface 接口類型,接口
function 函數(shù)類型,函數(shù)
2.類型轉(zhuǎn)換
不支持隱式類型轉(zhuǎn)換,必須進(jìn)行顯式類型轉(zhuǎn)換
轉(zhuǎn)換只發(fā)生在兩種互相兼容的類型之間: 各類int不允許相互賦值或操作,不然會(huì)在編譯時(shí)報(bào)錯(cuò)
復(fù)制代碼 代碼如下:
type>(expression)
示例
復(fù)制代碼 代碼如下:
package main
import "fmt"
func main(){
a := 0x1234
b := 1234.56
c := 256
fmt.Printf("%x\n", uint8(a))
fmt.Printf("%d\n", int(b))
fmt.Printf("%f\n", float64(c))
}
結(jié)果
復(fù)制代碼 代碼如下:
34
1234
256.000000
3.類型別名
復(fù)制代碼 代碼如下:
type t_str string
var b t_str = "a str"
4.類型默認(rèn)值
聲明不賦值,類型零值,非空值,而是聲明后的默認(rèn)值
復(fù)制代碼 代碼如下:
bool: false
integers: 0
floats: 0.0
string: ""
pointers,functions,interfaces,slices,channels,maps: nil
保留字
復(fù)制代碼 代碼如下:
break case chan const continue
default defer else fallthrough for
func go goto if import
interface map package range return
select struct switch type var
變量
1.變量聲明
復(fù)制代碼 代碼如下:
//第一種,指定變量類型,聲明后若不賦值,使用默認(rèn)值
var v_name v_type
v_name = value
//第二種,根據(jù)值自行判定變量類型
var v_name = value
//第三種,省略var, 注意 :=左側(cè)的變量不應(yīng)該是已經(jīng)聲明過的,否則會(huì)導(dǎo)致編譯錯(cuò)誤.
v_name := value
e.g.
var a int = 10
var b = 10
c : = 10
示例:
復(fù)制代碼 代碼如下:
package main
var a = 1234
var b string = "hello"
var c bool
func main(){
println(a, b, c)
}
結(jié)果:
復(fù)制代碼 代碼如下:
1234 hello false
2.多變量聲明:
復(fù)制代碼 代碼如下:
//類型相同多個(gè)變量, 非全局變量
var vname1, vname2, vname3 type
vname1, vname2, vname3 = v1, v2, v3
var vname1, vname2, vname3 = v1, v2, v3 //和python很像,不需要顯示聲明類型,自動(dòng)推斷
vname1, vname2, vname3 := v1, v2, v3 //出現(xiàn)在:=左側(cè)的變量不應(yīng)該是已經(jīng)被聲明過的,否則會(huì)導(dǎo)致編譯錯(cuò)誤
//類型不同多個(gè)變量, 全局變量, 局部變量不能使用這種方式
var (
vname1 v_type1
vname2 v_type2
)
示例:
復(fù)制代碼 代碼如下:
package main
var x, y int
var ( //這種只能出現(xiàn)在全局變量中,函數(shù)體內(nèi)不支持
a int
b bool
)
var c, d int = 1, 2
var e, f = 123, "hello"
//這種不帶聲明格式的只能在函數(shù)體中出現(xiàn)
//g, h := 123, "hello"
func main(){
g, h := 123, "hello"
println(x, y, a, b, c, d, e, f, g, h)
}
結(jié)果:
復(fù)制代碼 代碼如下:
0 0 0 false 1 2 123 hello 123 hello
注意:
A.多變量賦值時(shí),將先行計(jì)算所有左側(cè)變量的值,再進(jìn)行賦值
復(fù)制代碼 代碼如下:
i := 0
i, l[i] = 1, 2
//get i = 1, l[0] = 2
sc[0], sc[0] = 1, 2
//get sc[0] = 2
B.垃圾桶_
復(fù)制代碼 代碼如下:
func test()(int, string) {
return 123, "abc"
}
a, _ := test()
C.已聲明但是沒有使用的變量會(huì)在編譯階段報(bào)錯(cuò),較Python 更為嚴(yán)格
常量
常量可以是字符,字符串,布爾或數(shù)字
常量賦值是編譯期的行為
1.常量聲明
在編譯階段就能確定下來的值,在運(yùn)行時(shí)無法改變?cè)撝?br />
常量可以定義為數(shù)值、布爾值或字符串等類型
復(fù)制代碼 代碼如下:
const constantName = value
const Pi float32 = 3.1415926
const c_name [type] = value
const c_name1, c_name2 = value1, value2
const (
c_name1 = vluae1
c_name2 = value2
)
=右側(cè),必須為常量或常量表達(dá)式,如果使用到了函數(shù),必須為內(nèi)置函數(shù)(編譯期行為)
const i = 10000
說明:
復(fù)制代碼 代碼如下:
A.常量必須是編譯期能確定的Number(char/integer/float/complex)、String和bool
B.在定義常量數(shù)組時(shí),如果不提供初始化值,則表示與上行常量類型,值,完全相同
const (
a = "abc"
b
)
//則 b = "abc"
C.常量可以用len(), cap(), unsafe.Sizeof()常量計(jì)算表達(dá)式的值. 常量表達(dá)式中,函數(shù)必須是內(nèi)置函數(shù),否則編譯不過
package main
import "unsafe"
const (
a = "abc"
b = len(a)
c = unsafe.Sizeof(a)
)
func main(){
println(a, b, c)
}
結(jié)果: abc 3 16
枚舉
iota,特殊常量,可以認(rèn)為是一個(gè)可以被編譯器修改的常量
在每一個(gè)const關(guān)鍵字出現(xiàn)時(shí),被重置為0,然后再下一個(gè)const出現(xiàn)之前,每出現(xiàn)一次iota,其所代表的數(shù)字會(huì)自動(dòng)增加1
不提供初始值,則表示使用上一行的表達(dá)式
1.聲明:
iota生成從0開始的自動(dòng)增長(zhǎng)枚舉值,意味著,多一個(gè)枚舉值,iota+=1,無論是否使用
基本語法
復(fù)制代碼 代碼如下:
const (
a = 1
b = 2
)
const (
a = iota //0
b //1
c //2
)
const (
_ = iota
a //1
b //2
)
iota用法
復(fù)制代碼 代碼如下:
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
)
}
const (
x = iota // 0
y = iota // 1
z = iota // 2
w //省略,默認(rèn)和前面一樣字面值 w = iota, 即3
)
const v = iota //遇到const關(guān)鍵字,iota重置
注意: 每行的變量數(shù)必須一致 const ( A, B = iota, iota C, D E, F )
復(fù)制代碼 代碼如下:
func main() {
println(A,B,C,D,E,F)
}
//結(jié)果: 0 0 1 1 2 2 【各自增長(zhǎng)】
運(yùn)算符
Go運(yùn)算符全部是從左到右結(jié)合的
不支持運(yùn)算符重載
復(fù)制代碼 代碼如下:
優(yōu)先級(jí) 運(yùn)算符 說明
高 * / % >> ^(AND NOT)
+ - ! ^
== != = > >=
- channel運(yùn)算符
低 ||
在go中,++ --為語句,而非表達(dá)式
復(fù)制代碼 代碼如下:
package main
func main(){
i := 1
i ++
println(i)
b := i
println(b)
//syntax error: unexpected ++, expecting semicolon or newline or }
//c := i++
//意味著, ++/--不能出現(xiàn)在等號(hào)右側(cè)
}
指針
Go保留了指針, *T表示T對(duì)應(yīng)的指針類型
如果包含包名, 則應(yīng)該是 *.T
代表指針類型的符號(hào) '*' 總是和類型放在一起,而不是緊挨著變量名
同樣支持指針的指針**T
1.聲明
復(fù)制代碼 代碼如下:
var a, b *int
2.說明
復(fù)制代碼 代碼如下:
操作符取變量地址,用*透過指針變量間接訪問目標(biāo)對(duì)象
默認(rèn)值是nil,沒有NULL常量
不支持指針運(yùn)算,不支持‘->'預(yù)算福,直接'.'選擇符操作指針目標(biāo)對(duì)象成員
可以在unsafe.Pointer和任意類型指針間進(jìn)行轉(zhuǎn)換
可以將unsafe.Pointer轉(zhuǎn)換為uintptr,然后變相做指針運(yùn)算,uintptr可以轉(zhuǎn)換為整數(shù)
3.示例
復(fù)制代碼 代碼如下:
package main
import "fmt"
type User struct {
Id int
Name string
}
func main(){
i := 100
var p *int = i //取地址
println(*p) //取值
up := User{1, "Jack"}
up.Id = 100 //直接取只針對(duì)想成員
fmt.Println(up)
u2 := *up //拷貝對(duì)象
u2.Name = "Tom"
fmt.Println(up, u2)
}
4.結(jié)果:
復(fù)制代碼 代碼如下:
100
{100 Jack}
{100 Jack} {100 Tom}
分組聲明
復(fù)制代碼 代碼如下:
import (
"fmt"
"os"
)
const (
i = 100 //首行必須有常量表達(dá)式
pi = 3.1415
)
var ( //全局變量可用,函數(shù)體內(nèi)不支持
i int
pi float32
)
您可能感興趣的文章:- 詳解Golang編程中的常量與變量
- Golang常量iota的使用實(shí)例
- 手把手帶你走進(jìn)Go語言之常量解析