golang的變量聲明
基本格式
var identifier [type] [= value]
例子
var a int
var b string
var c bool
var d int = 8
var e string = "hello"
var f = "hello"
例子2
var (
a int
b string
c bool
d int = 8
e string = "hello"
)
這個(gè)就跟golang的package引入類似,可以用括號(hào)將多個(gè)項(xiàng)目括起來(lái)颂斜,這樣就只用寫(xiě)一個(gè)var或者import。
例子3
a := 20
golang的常量聲明
基本格式
const identifier [type] = value
例子
const a int = 10
const b = 10
const c string = "233"
const d = "233"
例子2
const (
a int = 100
b = 10
c string = "233"
d = "233"
)
例子3
const (
a = 100
b
c = "233"
d
)
和變量不同昆烁,常量的聲明可以在后面什么都不跟,例子中的
b
和d
等于他們之前第一個(gè)有賦值的常量。即:b = 100
d = "233"
例子4
const (
a = iota //0
b //1
c = 234 //234
d = iota //3
e //4
)
iota
是一個(gè)很神奇的玩意。在一個(gè)const的括號(hào)內(nèi)轴总,第一個(gè)iota是0,之后的每一行博个,iota會(huì)自增1,無(wú)論你是否使用iota功偿。
golang的基本類型
string
-
string
的聲明
string
可以用雙引號(hào)"
也可以用`
來(lái)聲明盆佣。
var a = "123"
var b = `\n123` //等同于C#中 var b = @"\n123"
-
string
的常用操作
取字符串長(zhǎng)度
var a = "123"
len(a)
格式化輸入到字符串
var a = 123
var c = fmt.Sprintf("%d",a)
字符串分割
var a = "123;234;345"
var aSlice = strings.Split(a,";")
字符串存在
var a = "123"
var aBool = strings.Contains(a,"2")
前后綴判斷
var a = "pre123suf"
var aPreBool = strings.HasPrefix(a,"pre")
var aSufBool = strings.HasSuffix(a,"suf")
字符串查找
var a = "1234561"
var index = strings.Index(a,"1")
index = strings.LastIndex(a,"1")
字符串拼接
var strArr []string = {"123","234","345"}
var result = strings.Join(strArr, ";")
-
string
底層知識(shí)
底層是數(shù)組往堡,可以和byte數(shù)組進(jìn)行轉(zhuǎn)換
var str = "123456789"
var c = str[0] //使用下標(biāo)訪問(wèn)元素
for index,val := range str {
fmt.Printf("index = %d, value = %c", index, val)
}
字符串不能對(duì)單個(gè)元素直接進(jìn)行更改(str[0] = '0'
是非法的)。需要轉(zhuǎn)成切片再進(jìn)行更改共耍。
var str = "123"
strSlice = []byte(str)
strSlice[0] = '0'
str = string(strSlice)
字符串是由byte字節(jié)存儲(chǔ)虑灰,所以字符串的長(zhǎng)度是byte數(shù)組的長(zhǎng)度。如果字符串中有中文痹兜,字符串長(zhǎng)度會(huì)和字的個(gè)數(shù)不一致穆咐。
var str = "Hello, 中文"
fmt.Printf("length of str = %d", len(str)) //length of str = 13
runeSlice = []rune(str)
fmt.Printf("length of str = %d", len(runeSlice)) //length of str = 9
時(shí)間和日期類型
獲取當(dāng)前時(shí)間
now := time.Now()
獲取時(shí)間戳
timeStamp := time.Now().Unix()
時(shí)間和時(shí)間戳轉(zhuǎn)換
now := time.Now()
timeStamp := now.Unix()
now = time.Unix(timeStamp,0)
定時(shí)器
ticker := time.Tick(time.Second)
for i:= range ticker{
fmt.Printf("%v\n", i)
}
時(shí)間常量
const (
Nanosecond Duration
Microsecond = 1000 * Nacosecond
Millisecond = 1000 * Microsecond
Second = 1000 * Millisecond
)
格式化
now := time.Now()
now.Format("2006/01/02 15:04:05" ) //這時(shí)間是golang的誕生時(shí)間,只能寫(xiě)這個(gè)
流程控制
if-else
和c系列的if-else非常類似字旭,只是可以再一開(kāi)始聲明一個(gè)變量对湃,而且不用括號(hào)
a := 10
if a > 5 {
fmt.Printfln("great than 5")
}
else {
fmt.Printfln("less than 5")
}
fmt.Printf("value = %d", a)
if a := 10; a > 5 {
fmt.Printfln("great than 5")
}
else {
fmt.Printfln("less than 5")
}
fmt.Printf("value = %d", a) //非法。a只能在if的范圍內(nèi)使用
for
循環(huán)只有for遗淳,沒(méi)有while拍柒。
基本用法
for i := 0; i < 10; i++ {
}
while用法
for i < 10 {
}
無(wú)限循環(huán)
for {
}
range遍歷
for _, val := range b {
sum += val
}
switch
基本用法,不需要跟break屈暗,默認(rèn)就是有break的情況拆讯。
a := 10
switch a{
case 1:
//do something
case 2:
//do something
default:
//do something
}
和if一樣,可以在使用時(shí)聲明變量
switch a := 10; a{
case 1:
//do something
case 2:
//do something
default:
//do something
}
可以多個(gè)case放在一起
switch a := 10; a{
case 1, 3, 5, 7, 9:
//do something
case 2, 4, 6, 8, 10:
//do something
default:
//do something
}
可以不寫(xiě)固定值养叛,而是用條件控制
a := 10
switch {
case a < 5:
//do something
case a > 5:
//do something
default:
//do something
}
可以執(zhí)行多個(gè)case
a := 10
switch {
case a < 5:
//do something
fallthrough
case a <10:
//do something
default:
//do something
}
函數(shù)
基本格式
func functionName([parameterName type]) [returnType]{
}
連續(xù)的相同類型的參數(shù)种呐,可以只寫(xiě)一次類型
func add(a, b int) int {
return a + b
}
多返回值, 返回值可以直接命名。不需要的返回值用_
忽略
func calc(a, b int) (int, int){
sum := a + b
sub := a - b
return sum, sub
}
func calc1(a, b int) (sum, sub int) {
sum = a + b
sub = a - b
return
}
aa, _ := calc(a, b)
可變參數(shù)
func calc(b ...int) int {
sum := 0
for _, val := range b {
sum += val
}
return sum
}
defer
延遲執(zhí)行弃甥。在函數(shù)返回之前執(zhí)行爽室。執(zhí)行到defer時(shí)會(huì)進(jìn)行壓棧操作,函數(shù)執(zhí)行完成后出棧執(zhí)行defer潘飘。壓棧時(shí)會(huì)把數(shù)據(jù)的當(dāng)前值進(jìn)行存儲(chǔ)肮之,即使后面改變也不會(huì)生效。
func testDefer() {
defer fmt.Println("first defer")
defer fmt.Println("second defer")
defer fmt.Println("third defer")
sam = "sam"
defer fmt.Println("hello %s", sam)
sam = "peter"
fmt.Println("hello %s", sam)
}
//輸出結(jié)果:
//hello peter
//hello sam
//third defer
//second defer
//first defer
函數(shù)可以存儲(chǔ)在變量中卜录。類似于函數(shù)指針或者delegate戈擒。可以聲明匿名函數(shù)艰毒。
func func1(name string) {
fmt.Printf("Hello %s\n", name)
}
func test() {
f1 := func1
f1("peter")
f1 = func(name string){
fmt.Printf("Welcome %s\n", name)
}
f1("peter")
}
//輸出:
//Hello peter
//Welcome peter