golang基礎(chǔ)語(yǔ)法學(xué)習(xí)

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
)

和變量不同昆烁,常量的聲明可以在后面什么都不跟,例子中的bd等于他們之前第一個(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

  1. string的聲明
    string可以用雙引號(hào)"也可以用`來(lái)聲明盆佣。
var a = "123"
var b = `\n123`      //等同于C#中 var b = @"\n123"
  1. 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, ";")
  1. 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
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末筐高,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子丑瞧,更是在濱河造成了極大的恐慌柑土,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绊汹,死亡現(xiàn)場(chǎng)離奇詭異稽屏,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)西乖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門狐榔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)坛增,“玉大人,你說(shuō)我怎么就攤上這事薄腻∈盏罚” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵庵楷,是天一觀的道長(zhǎng)罢艾。 經(jīng)常有香客問(wèn)我,道長(zhǎng)尽纽,這世上最難降的妖魔是什么咐蚯? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮蜓斧,結(jié)果婚禮上仓蛆,老公的妹妹穿的比我還像新娘。我一直安慰自己挎春,他們只是感情好看疙,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著直奋,像睡著了一般能庆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上脚线,一...
    開(kāi)封第一講書(shū)人閱讀 49,764評(píng)論 1 290
  • 那天搁胆,我揣著相機(jī)與錄音,去河邊找鬼邮绿。 笑死渠旁,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的船逮。 我是一名探鬼主播顾腊,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼挖胃!你這毒婦竟也來(lái)了杂靶?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤酱鸭,失蹤者是張志新(化名)和其女友劉穎吗垮,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體凹髓,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡烁登,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蔚舀。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片饵沧。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蚀之,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出捷泞,到底是詐尸還是另有隱情,我是刑警寧澤寿谴,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布锁右,位于F島的核電站,受9級(jí)特大地震影響讶泰,放射性物質(zhì)發(fā)生泄漏咏瑟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一痪署、第九天 我趴在偏房一處隱蔽的房頂上張望码泞。 院中可真熱鬧,春花似錦狼犯、人聲如沸余寥。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)宋舷。三九已至,卻和暖如春瓢姻,著一層夾襖步出監(jiān)牢的瞬間祝蝠,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工幻碱, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留绎狭,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓褥傍,卻偏偏與公主長(zhǎng)得像儡嘶,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子摔桦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348