go基礎(chǔ)編程day2類(lèi)型、變量蔼卡、常量喊崖、運(yùn)算符

const var type幾個(gè)關(guān)鍵詞的簡(jiǎn)單使用

package main

import "fmt"

// 定義常量
const (
    P      = 3.14
    const1 = 1
    const2 = "2"
    const3 = 3
)

//全局變量的聲明與賦值
var (
    name  = "james"
    age   = 18
    name2 = "nihao"
)

// 一般類(lèi)型的聲明 type關(guān)鍵字
type (
    newType int
    type1   float32
    type2   string
)

func main() {
    fmt.Printf("Hello %s!\n", name) // Hello james!
}

重點(diǎn)理解第三個(gè)type關(guān)鍵詞,已知這些類(lèi)型雇逞,int荤懂,string等等,但是type可以聲明自己的類(lèi)型塘砸,這里newType屬于一個(gè)新的類(lèi)型节仿,但是他的基礎(chǔ)類(lèi)型還是int,但跟int并不是同一個(gè)類(lèi)型newType是他的命名

go基本類(lèi)型

  • 布爾型:bool
    長(zhǎng)度:1字節(jié)
    取值范圍:true掉蔬、false
    注意:不能像某些語(yǔ)言一樣使用01數(shù)字來(lái)代表true或者false

  • 整型:int/uint
    根據(jù)運(yùn)行平臺(tái)可能為32位(uint)或者64位(int)

  • 8位整型:int8/uint8
    長(zhǎng)度:1字節(jié)
    取值范圍:-128~127/0~255

  • 字節(jié)型:byte(uint8別名)

  • 16位整型:int16/uint16
    長(zhǎng)度:2字節(jié)
    取值范圍:-32768~32767/0~65535

  • 32位整型:int32(rune)/uint32
    長(zhǎng)度:4字節(jié)
    取值范圍:(232/2~232/2-1)/(0~2^32-1)

  • 64位整型:int64/uint64
    長(zhǎng)度:8字節(jié)
    取值范圍:同理

  • 浮點(diǎn)型:float32/float64
    長(zhǎng)度:4/8字節(jié)
    精準(zhǔn)度:精確到7/15小數(shù)位

  • 復(fù)數(shù):complex64/complex128
    長(zhǎng)度:8/16字節(jié)

  • 足夠保存指針的32位或64位整數(shù)型:uintptr

  • 其他值類(lèi)型:
    array廊宪、struct、string

  • 引用類(lèi)型:
    slice女轿、map箭启、chan

  • 接口類(lèi)型:interface

  • 函數(shù)類(lèi)型:func

注意區(qū)分值類(lèi)型和引用類(lèi)型,會(huì)在后面變量傳遞的時(shí)候有區(qū)別

類(lèi)型零值

零值并不等于空值蛉迹,而是當(dāng)變量被聲明為某種類(lèi)型后的默認(rèn)值傅寡,就是說(shuō)你在聲明他的時(shí)候就存在值了,通常情況下值類(lèi)型的默認(rèn)值為0,比如int赏僧,就是一個(gè)0大猛,slice就是多個(gè)或一個(gè)0扭倾,bool的默認(rèn)值為false淀零,string為空的字符串

package main

import "fmt"

func main() {
    var a int
    var b []int
    var c string
    var d bool
    fmt.Println(a)
    fmt.Println(b)
    fmt.Println(c)
    fmt.Println(d)
}

/*
0
[]

false
*/

類(lèi)型別名

// 一般類(lèi)型的聲明 type關(guān)鍵字
type (
    newType int
    type1   float32
    type2   string
)

就是為類(lèi)型起一個(gè)別名,注意的是基礎(chǔ)類(lèi)型與別名之后的類(lèi)型并不完全對(duì)等膛壹,賦值等等需要轉(zhuǎn)換

單個(gè)變量的聲明與賦值

這個(gè)我剛看也有點(diǎn)愁人驾中,聲明和賦值的方法很多,并不是會(huì)簡(jiǎn)單好用的一種就夠了模聋,畢竟也要讀別人的代碼肩民,所以必須全部掌握

第一種:聲明-賦值

package main

import "fmt"

func main() {
    // 聲明 var-命名-類(lèi)型
    var a int
    // 賦值
    a = 111
    fmt.Println(a) // 111
}

第二種:類(lèi)型推斷

package main

import "fmt"

func main() {
    // 賦值并類(lèi)型推斷
    var a = 111
    fmt.Println(a) // 111
}

第三種:聲明并賦值簡(jiǎn)單寫(xiě)法

package main

import "fmt"

func main() {
    // 聲明并賦值簡(jiǎn)單寫(xiě)法
    a := 111
    fmt.Println(a) // 111
}

這些方式不僅適用int等等這些類(lèi)型的聲明,也適用一些其他類(lèi)型的聲明链方,所以要掌握

系統(tǒng)推斷的聲明賦值前提是在使用過(guò)程中值的類(lèi)型不會(huì)發(fā)生轉(zhuǎn)變持痰,否則會(huì)拋出錯(cuò)誤

聲明賦值變量要注意的點(diǎn):

  • 全局變量聲明不能省略var關(guān)鍵字換成:=來(lái)聲明

  • 多個(gè)全局變量可以使用var()進(jìn)行簡(jiǎn)寫(xiě)

  • 所有的變量都可以使用類(lèi)型推斷

  • 局部變量不可以使用var()方式簡(jiǎn)寫(xiě),只能使用并行方式

package main

import "fmt"

// 全局變量 支持多個(gè)變量賦值祟蚀,支持并行工窍,不可省略var
var (
    a      = "hello"
    b      = "hi"
    aa, bb = 1, 2
)

func main() {
    // 不可以使用括號(hào),但是可以使用并行前酿,可以省略var使用簡(jiǎn)寫(xiě)
    var a, b, c, d int
    a, b, c, d = 1, 2, 3, 4
        // 也可以忽略賦值患雏,只用_來(lái)代替變量名,可用于多返回值但是不需要全部返回值的時(shí)候
        // 上面兩句等價(jià) var a, b, c, d int = 1, 2, 3, 4
    e, f, g := 5, "ss", 6
    fmt.Println(a, b, c, d, e, f, g)
}

變量的類(lèi)型轉(zhuǎn)換

  • go中不存在隱式轉(zhuǎn)換罢维,所有類(lèi)型轉(zhuǎn)換必須顯式聲明
  • 轉(zhuǎn)換只能發(fā)生在兩種相互兼容的類(lèi)型之間
package main

import "fmt"

func main() {
    var a float32 = 1.1
    b := int(a)
    fmt.Println(b) // 1

    var c bool = true
    d := int(c) // cannot convert c (type bool) to type int
}

要注意數(shù)字轉(zhuǎn)字符串的時(shí)候會(huì)轉(zhuǎn)為對(duì)應(yīng)的字母淹仑,想要真正的轉(zhuǎn)換成字符串需要庫(kù)strconv

package main

import "fmt"
import "strconv"

func main() {
    var a int = 65
    b := string(a)
    fmt.Println(b) // A
    // int轉(zhuǎn)string
    c := strconv.Itoa(a)
    fmt.Println(c) // 65
    d, e := strconv.Atoi(c)
    fmt.Println(d)
    fmt.Println(e)
}

常量及運(yùn)算符

常量的定義

  • 常量的值在編譯時(shí)就已經(jīng)確認(rèn)
  • 常量定義格式與變量基本相同
  • 等號(hào)右側(cè)必須是常量或者常量表達(dá)式(必須是常量,不能是運(yùn)行中產(chǎn)生的)
  • 常量表達(dá)式中的函數(shù)必須是內(nèi)置函數(shù)(自己寫(xiě)的函數(shù)不可以)
  • ++ --作為語(yǔ)句并不作為表達(dá)式 即不能放在等號(hào)右邊
package main

import "fmt"

const a int = 2
const b = "A"

const (
    c = a + 1
    d = a * 3
    // 沒(méi)有表達(dá)式或者常量的話(huà)會(huì)自動(dòng)選擇上一行的表達(dá)式肺孵,前提是這兩行格式相同
    e
    f, g = 22, 33
)

func main() {
    fmt.Println(a) // 2
    fmt.Println(b) // A
    fmt.Println(c) // 3
    fmt.Println(d) // 6
    fmt.Println(e) // 6
    fmt.Println(f) // 22
    fmt.Println(g) // 33
}

常量的初始化規(guī)則與枚舉

  • 在定義常量組時(shí)匀借,如果不提供初始值,則表示將使用上行的表達(dá)式
  • 使用相同的表達(dá)式不代表具有相同的值
  • iota是常量的計(jì)數(shù)器平窘,從0開(kāi)始吓肋,組中每定義一個(gè)常量自動(dòng)遞增1
  • 通過(guò)初始化規(guī)則與iota可以達(dá)到枚舉的效果
  • 每遇到一個(gè)const關(guān)鍵字,iota就會(huì)重置為0
package main

import "fmt"

const (

    // 使用雙引號(hào)是會(huì)輸出字符串A初婆,單引號(hào)輸出對(duì)應(yīng)的數(shù)字
    a = 'A'
    b
    // 此時(shí)iota為2
    c = iota
    d
)

const (
    // 新的關(guān)鍵詞const iota從0開(kāi)始
    e = iota
)

func main() {
    fmt.Println(a) // 65
    fmt.Println(b) // 65
    fmt.Println(c) // 2
    fmt.Println(d) // 3
    fmt.Println(e) // 0
}

枚舉應(yīng)用

package main

import (
    "fmt"
)

const (
    a      = 0
    Monday = iota
    Tuesday
    Wednesday
    Thursday
    Friday
    Saturday
    Sunday
)

func main() {
    fmt.Println(Sunday) // 7
}

運(yùn)算符

  • go語(yǔ)言中運(yùn)算符同樣遵循從左至右的運(yùn)算順序
  • 優(yōu)先級(jí)(從高到低)
    ^ ! (一元運(yùn)算)
    * / % << >> & &^
    + - | ^ (二元運(yùn)算)
    == != < <= >=
    <- (專(zhuān)用與channel)
    &&
    ||

新接觸:
>> << 左移/右移多少位
& | ^ &^ 四個(gè)位運(yùn)算符

/*
6:  0110
11: 1011

---------

兩個(gè)數(shù)位運(yùn)算先轉(zhuǎn)換為2進(jìn)制

&   0010 = 2    和
|   1111 = 15   或
^   1101 = 13   對(duì)比過(guò)程中只存在一個(gè)1則為1
&^  0100 = 4    如果第二個(gè)數(shù)對(duì)應(yīng)的位置為1蓬坡,則將第一個(gè)數(shù)對(duì)應(yīng)的位置轉(zhuǎn)換為0
之后再轉(zhuǎn)換回10進(jìn)制

*/

func main() {
    fmt.Println(6 & 11)  // 2
    fmt.Println(6 | 11)  // 5
    fmt.Println(6 ^ 11)  // 13
    fmt.Println(6 &^ 11)  // 4
}

單個(gè)的&變?yōu)榱宋贿\(yùn)算符,&&作為‘與’運(yùn)算符磅叛,左邊條件不成立則右邊不執(zhí)行

實(shí)現(xiàn)計(jì)算機(jī)存儲(chǔ)單位的枚舉

const (
    B float64 = 1 << (iota * 10)
    KB
    MB
    GB
    TB
)

func main() {

    fmt.Println(B)  // 1
    fmt.Println(KB)  // 1024
    fmt.Println(MB)  // 1.048576e+06
    fmt.Println(GB)  // 1.073741824e+09
    fmt.Println(TB)  // 1.099511627776e+12
}

指針

指針屬于要深入了解的東西屑咳,

  • go雖然保留了指針,但是在go中并不支持指針運(yùn)算以及->運(yùn)算符弊琴,而是采用.選擇符來(lái)操作指針目標(biāo)對(duì)象成員

  • 操作符&取變量地址兆龙,使用*通過(guò)指針間接訪問(wèn)目標(biāo)對(duì)象

  • 默認(rèn)值為nil非NULL

package main

import (
    "fmt"
)

func main() {
    a := 1
    // 聲明指向int的指針p
    var p *int
    // 賦值p
    p = &a
    fmt.Println(p) // 0xc420014100
    fmt.Println(&a) // 0xc420014100
    fmt.Println(a) // 1
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子紫皇,更是在濱河造成了極大的恐慌慰安,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件聪铺,死亡現(xiàn)場(chǎng)離奇詭異化焕,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)铃剔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)撒桨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人键兜,你說(shuō)我怎么就攤上這事凤类。” “怎么了普气?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵谜疤,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我现诀,道長(zhǎng)夷磕,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任赶盔,我火速辦了婚禮企锌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘于未。我一直安慰自己撕攒,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布烘浦。 她就那樣靜靜地躺著抖坪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪闷叉。 梳的紋絲不亂的頭發(fā)上擦俐,一...
    開(kāi)封第一講書(shū)人閱讀 51,370評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音握侧,去河邊找鬼蚯瞧。 笑死,一個(gè)胖子當(dāng)著我的面吹牛品擎,可吹牛的內(nèi)容都是我干的埋合。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼萄传,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼甚颂!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤振诬,失蹤者是張志新(化名)和其女友劉穎蹭睡,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體赶么,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡肩豁,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了禽绪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蓖救。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖印屁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情斩例,我是刑警寧澤雄人,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站念赶,受9級(jí)特大地震影響础钠,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜叉谜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一旗吁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧停局,春花似錦很钓、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至锭碳,卻和暖如春袁稽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背擒抛。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工推汽, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人歧沪。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓歹撒,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親槽畔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子栈妆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容