一逼裆,變量和常量
1稽物,變量的聲明
聲明格式: var 變量名 變量類型
var name string
name = "小明"
fmt.Println(name)
批量聲明:
var age,height int8 //變量類型相同
age = 18
height = 170 //constant 170 overflows int8
var ( //類型變量不同
a string
b int
c bool
d float32
)
聲明并賦值:
hobby := "打籃球"
程序自動(dòng)判斷:
var teacher = "李小龍"
var name,age = "小李" , 18
注意事項(xiàng):
- 變量聲明的時(shí)候會(huì)在變量對(duì)應(yīng)的內(nèi)存區(qū)域進(jìn)行初始化操作,每個(gè)變量會(huì)生成該變量所屬類型的一個(gè)初始默認(rèn)值,例如:整形和浮點(diǎn)型:0农渊;字符串:空字符串;布爾類型默認(rèn)值為:false或颊;切片砸紊,函數(shù)传于,指針變量默認(rèn)為nil
- 變量聲明之后要使用,如果不使用則會(huì)報(bào)錯(cuò)
- 字符串可用雙引號(hào) " " 醉顽,或者 反引號(hào) ` ` 表示沼溜,不可以用單引號(hào)。但是反引號(hào)不支持轉(zhuǎn)義(例如\n轉(zhuǎn)義為換行)游添,而是直接輸出 \n
- 在函數(shù)的外部系草,聲明變量必須用 var 關(guān)鍵字,而不能用
:=
的方法聲明
2唆涝,匿名變量(anonymous variable)
- 匿名變量不占用命名空間找都,不分配內(nèi)存,所有匿名變量不存在重復(fù)聲明
- 我們常用匿名變量石抡,表示要忽略掉(不使用)該變量
- 我們只執(zhí)行包的初始化檐嚣,但是不使用包,也應(yīng)用到匿名變量
func foo() (int, string) {
return 10, "Q1mi"
}
func main() {
x, _ := foo()
_, y := foo()
fmt.Println("x=", x)
fmt.Println("y=", y)
}
3啰扛,常量
常量定義之后嚎京,在整個(gè)程序的運(yùn)行中,都保持不變隐解。常量的定義與變量類似鞍帝,只是把 var
關(guān)鍵字換成 const
關(guān)鍵字 就可以了
const pi = 3.1415
const e = 2.7182
二,打印輸出
golang的打印輸出依賴:fmt包 import ("fmt" )
- fmt.Println() 打印并換行
- fmt.Printf() 格式化輸出
- 查看變量類型用reflect.TypeOf()
type Cat struct{
length int8
color string
skill string
}
kitty := Cat{
length : 5,
color : "orange",
skill : "catch mouse",
}
fmt.Println(kitty) // {5 orange catch mouse}
fmt.Printf("kitty是:%v \n",kitty) // %v是默認(rèn)的占位符:kitty是:{5 orange catch mouse}
fmt.Printf("kitty是:%+v \n",kitty) // %+v會(huì)打印鍵值對(duì): kitty是:{length:5 color:orange skill:catch mouse}
fmt.Printf("kitty是:%#v \n",kitty) // %#v會(huì)打印類型+鍵值對(duì): kitty是:main.Cat{length:5, color:"orange", skill:"catch mouse"}
var teacher = "李小龍"
fmt.Println(reflect.TypeOf(teacher)) // string 查看變量類型
fmt.Println(reflect.TypeOf(kitty)) //查看變量類型:main.Cat
參考文章:https://studygolang.com/articles/20310
1煞茫,通用占位符:
v 值的默認(rèn)格式帕涌。
%s 輸出字符串表示(string類型或[]byte)
%+v 添加字段名(如結(jié)構(gòu)體)
%% 字面上的百分號(hào),并非值的占位符
2续徽,整數(shù)占位符:
%b 二進(jìn)制表示
%d 十進(jìn)制表示
%x 十六進(jìn)制表示
3蚓曼,浮點(diǎn)數(shù)及復(fù)數(shù):
%b 無(wú)小數(shù)部分的,指數(shù)為二的冪的科學(xué)計(jì)數(shù)法钦扭,與 strconv.FormatFloat中的 'b' 轉(zhuǎn)換格式一致纫版。例如 -123456p-78
%f 有小數(shù)點(diǎn)而無(wú)指數(shù),例如 123.456
4客情,指針:
%p 十六進(jìn)制表示其弊,前綴 0x
fmt.Printf("%p \n",&kitty) // 0xc000070330
三,命令行
- 在命令行執(zhí)行:
go
會(huì)列出所有命令 - 在命令號(hào)執(zhí)行:
go help + 命令
可以獲得幫助
常用命令有:
go version 查看版本
go env用于打印Go語(yǔ)言的環(huán)境信息膀斋。
go run命令可以編譯并運(yùn)行命令源碼文件梭伐。
go get可以根據(jù)要求和實(shí)際情況從互聯(lián)網(wǎng)上下載或更新指定的代碼包及其依賴包,并對(duì)它們進(jìn)行編譯和安裝仰担。
go build命令用于編譯我們指定的源碼文件或代碼包以及它們的依賴包糊识。
go install用于編譯并安裝指定的代碼包及它們的依賴包。
go clean命令會(huì)刪除掉執(zhí)行其它命令時(shí)產(chǎn)生的一些文件和目錄。
go doc命令可以打印附于Go語(yǔ)言程序?qū)嶓w上的文檔技掏。我們可以通過(guò)把程序?qū)嶓w的標(biāo)識(shí)符作為該命令的參數(shù)來(lái)達(dá)到查看其文檔的目的铃将。
go test命令用于對(duì)Go語(yǔ)言編寫的程序進(jìn)行測(cè)試。
go list命令的作用是列出指定的代碼包的信息哑梳。
go fix會(huì)把指定代碼包的所有Go語(yǔ)言源碼文件中的舊版本代碼修正為新版本的代碼。
go vet是一個(gè)用于檢查Go語(yǔ)言源碼中靜態(tài)錯(cuò)誤的簡(jiǎn)單工具绘盟。
go tool pprof命令來(lái)交互式的訪問(wèn)概要文件的內(nèi)容鸠真。
三,變量的復(fù)制龄毡,引用吠卷,指針變量
&
符號(hào)在go中是取內(nèi)存地址的意思, &a
就是獲取變量a的內(nèi)存地址
1沦零,變量的賦值是值傳遞
var age int8 = 18
fmt.Println(age) // 18
fmt.Println(&age) // 0xc0000120a0
var age1 int8 = age
fmt.Println(age1) // 18
fmt.Println(&age1) // 0xc0000120b6 可以發(fā)現(xiàn)age與age1的地址空間并不相同
2祭隔,指針
var age int = 18
fmt.Println(&age) // 0xc0000120a0
var agePoint *int //解析:agePoint 是一個(gè)指針變量,int是指該指針變量的類型路操,*表示該變量(agePoint)是一個(gè)指針變量
fmt.Println(agePoint) // nil,當(dāng)一個(gè)指針被定義后沒(méi)有分配到任何變量時(shí)疾渴,它的值為 nil。
//*agePoint = 1 //報(bào)錯(cuò)屯仗,原因:我們定義一個(gè)指針(agePoint)搞坝,指針?lè)峙淞说刂罚ㄖ羔樀刂罚侵羔樦赶虻闹担?agePoint)還沒(méi)有分配到地址
//fmt.Println(*agePoint) //報(bào)錯(cuò)魁袜,原因:與上相同桩撮,只分配了指針地址,還沒(méi)分配 值 地址
agePoint = &age
fmt.Println(*agePoint) // 18
fmt.Println(agePoint) // 0xc0000120a0 可見峰弹,與age變量的內(nèi)存地址是一樣的
*agePoint = 29
fmt.Println(age) // 29 可見店量,改變 *agePoint,age也會(huì)一同改變
上面代碼中:
- var age 是一個(gè)int類型的值鞠呈,而 var agePoint 是一個(gè)指針
- *agePoint 是一個(gè)值
- 用
&
可以取到某個(gè)變量的內(nèi)存地址融师,這個(gè)內(nèi)存地址可以賦值給一個(gè)指針變量 - 改變 *agePoint,age也會(huì)一同改變粟按,因?yàn)檫@兩個(gè)變量的值诬滩,存放在:相同的內(nèi)存地址
3,接收指針的函數(shù)
func main() {
var myAge int8 = 18
var yourAge int8 = 28
changeEachOther(&myAge,&yourAge)
fmt.Println(myAge) // 28
fmt.Println(yourAge) // 18
}
//交換兩個(gè)變量的值
func changeEachOther(x *int8,y *int8) {
fmt.Println(x) // x是一個(gè)內(nèi)存地址灭将,0xc0000120a0疼鸟,其實(shí) x 就是 &myAge
fmt.Println(*x) // *x是&myAge內(nèi)存地址里面的值,18
var temp int8 = *x
*x = *y
*y = temp
}
4庙曙,傳值與傳引用
- 參考博文:https://blog.csdn.net/cyk2396/article/details/78893828
-
var b = a
如果b的修改不會(huì)改變a的值空镜,那么是傳值;否則,是傳引用
四吴攒,內(nèi)置類型和函數(shù):
1张抄,內(nèi)置類型--值類型:
bool
int(32 or 64), int8, int16, int32, int64
uint(32 or 64), uint8(byte), uint16, uint32, uint64
float32, float64
string
complex64, complex128
array -- 固定長(zhǎng)度的數(shù)組
2,引用類型(指針類型)
slice -- 序列數(shù)組(最常用)
map -- 映射
chan -- 管道
3洼怔,內(nèi)置函數(shù)
Go 語(yǔ)言擁有一些不需要進(jìn)行導(dǎo)入操作就可以使用的內(nèi)置函數(shù)署惯。它們有時(shí)可以針對(duì)不同的類型進(jìn)行操作,例如:len镣隶、cap 和 append极谊,或必須用于系統(tǒng)級(jí)的操作,例如:panic安岂。因此轻猖,它們需要直接獲得編譯器的支持。
append -- 用來(lái)追加元素到數(shù)組域那、slice中,返回修改后的數(shù)組咙边、slice
close -- 主要用來(lái)關(guān)閉channel
delete -- 從map中刪除key對(duì)應(yīng)的value
panic -- 停止常規(guī)的goroutine (panic和recover:用來(lái)做錯(cuò)誤處理)
recover -- 允許程序定義goroutine的panic動(dòng)作
real -- 返回complex的實(shí)部 (complex、real imag:用于創(chuàng)建和操作復(fù)數(shù))
imag -- 返回complex的虛部
make -- 用來(lái)分配內(nèi)存次员,返回Type本身(只能應(yīng)用于slice, map, channel)
new -- 用來(lái)分配內(nèi)存败许,主要用來(lái)分配值類型,比如int翠肘、struct檐束。返回指向Type的指針
cap -- capacity是容量的意思,用于返回某個(gè)類型的最大容量(只能用于切片和 map)
copy -- 用于復(fù)制和連接slice束倍,返回復(fù)制的數(shù)目
len -- 來(lái)求長(zhǎng)度被丧,比如string、array绪妹、slice甥桂、map、channel 邮旷,返回長(zhǎng)度
print黄选、println -- 底層打印函數(shù),在部署環(huán)境中建議使用 fmt 包