Golang基礎(chǔ)語法

一,變量和常量

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 := "打籃球"

程序自動判斷:

var teacher = "李小龍"
var name,age = "小李" , 18

注意事項:

  1. 變量聲明的時候會在變量對應(yīng)的內(nèi)存區(qū)域進(jìn)行初始化操作,每個變量會生成該變量所屬類型的一個初始默認(rèn)值,例如:整形和浮點型:0;字符串:空字符串;布爾類型默認(rèn)值為:false;切片,函數(shù),指針變量默認(rèn)為nil
  2. 變量聲明之后要使用,如果不使用則會報錯
  3. 字符串可用雙引號 " " ,或者 反引號 ` ` 表示,不可以用單引號。但是反引號不支持轉(zhuǎn)義(例如\n轉(zhuǎn)義為換行),而是直接輸出 \n
  4. 在函數(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,常量

常量定義之后,在整個程序的運行中,都保持不變。常量的定義與變量類似,只是把 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會打印鍵值對: kitty是:{length:5 color:orange skill:catch mouse}
fmt.Printf("kitty是:%#v \n",kitty)  // %#v會打印類型+鍵值對: 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)體)
%%    字面上的百分號,并非值的占位符
2,整數(shù)占位符:
%b    二進(jìn)制表示
%d    十進(jìn)制表示
%x    十六進(jìn)制表示
3,浮點數(shù)及復(fù)數(shù):
%b 無小數(shù)部分的,指數(shù)為二的冪的科學(xué)計數(shù)法,與 strconv.FormatFloat中的 'b' 轉(zhuǎn)換格式一致。例如 -123456p-78
%f 有小數(shù)點而無指數(shù),例如 123.456
4,指針:
%p 十六進(jìn)制表示,前綴 0x
fmt.Printf("%p \n",&kitty)   // 0xc000070330

三,命令行

  • 在命令行執(zhí)行: go 會列出所有命令
  • 在命令號執(zhí)行:go help + 命令 可以獲得幫助
    常用命令有:

go version 查看版本
go env用于打印Go語言的環(huán)境信息。
go run命令可以編譯并運行命令源碼文件。
go get可以根據(jù)要求和實際情況從互聯(lián)網(wǎng)上下載或更新指定的代碼包及其依賴包,并對它們進(jìn)行編譯和安裝。
go build命令用于編譯我們指定的源碼文件或代碼包以及它們的依賴包。
go install用于編譯并安裝指定的代碼包及它們的依賴包。
go clean命令會刪除掉執(zhí)行其它命令時產(chǎn)生的一些文件和目錄。
go doc命令可以打印附于Go語言程序?qū)嶓w上的文檔。我們可以通過把程序?qū)嶓w的標(biāo)識符作為該命令的參數(shù)來達(dá)到查看其文檔的目的。
go test命令用于對Go語言編寫的程序進(jìn)行測試。
go list命令的作用是列出指定的代碼包的信息。
go fix會把指定代碼包的所有Go語言源碼文件中的舊版本代碼修正為新版本的代碼。
go vet是一個用于檢查Go語言源碼中靜態(tài)錯誤的簡單工具。
go tool pprof命令來交互式的訪問概要文件的內(nèi)容。

三,變量的復(fù)制,引用,指針變量

&符號在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 是一個指針變量,int是指該指針變量的類型,*表示該變量(agePoint)是一個指針變量 
fmt.Println(agePoint) // nil,當(dāng)一個指針被定義后沒有分配到任何變量時,它的值為 nil。

//*agePoint = 1 //報錯,原因:我們定義一個指針(agePoint),指針分配了地址(指針地址),但是指針指向的值(*agePoint)還沒有分配到地址
//fmt.Println(*agePoint) //報錯,原因:與上相同,只分配了指針地址,還沒分配 值 地址

agePoint = &age
fmt.Println(*agePoint) // 18
fmt.Println(agePoint) // 0xc0000120a0  可見,與age變量的內(nèi)存地址是一樣的

*agePoint = 29
fmt.Println(age) // 29 可見,改變 *agePoint,age也會一同改變

上面代碼中:

  • var age 是一個int類型的值,而 var agePoint 是一個指針
  • *agePoint 是一個值
  • &可以取到某個變量的內(nèi)存地址,這個內(nèi)存地址可以賦值給一個指針變量
  • 改變 *agePoint,age也會一同改變,因為這兩個變量的值,存放在:相同的內(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
}

//交換兩個變量的值
func changeEachOther(x *int8,y *int8) {
    fmt.Println(x) // x是一個內(nèi)存地址,0xc0000120a0,其實 x 就是 &myAge
    fmt.Println(*x) // *x是&myAge內(nèi)存地址里面的值,18

    var temp int8 = *x
    *x = *y
    *y = temp
}

4,傳值與傳引用

四,內(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    -- 固定長度的數(shù)組
2,引用類型(指針類型)
slice   -- 序列數(shù)組(最常用)
map     -- 映射
chan    -- 管道
3,內(nèi)置函數(shù)

Go 語言擁有一些不需要進(jìn)行導(dǎo)入操作就可以使用的內(nèi)置函數(shù)。它們有時可以針對不同的類型進(jìn)行操作,例如:len、cap 和 append,或必須用于系統(tǒng)級的操作,例如:panic。因此,它們需要直接獲得編譯器的支持。

    append          -- 用來追加元素到數(shù)組、slice中,返回修改后的數(shù)組、slice
    close           -- 主要用來關(guān)閉channel
    delete          -- 從map中刪除key對應(yīng)的value
    panic           -- 停止常規(guī)的goroutine  (panic和recover:用來做錯誤處理)
    recover         -- 允許程序定義goroutine的panic動作
    real            -- 返回complex的實部   (complex、real imag:用于創(chuàng)建和操作復(fù)數(shù))
    imag            -- 返回complex的虛部
    make            -- 用來分配內(nèi)存,返回Type本身(只能應(yīng)用于slice, map, channel)
    new                -- 用來分配內(nèi)存,主要用來分配值類型,比如int、struct。返回指向Type的指針
    cap                -- capacity是容量的意思,用于返回某個類型的最大容量(只能用于切片和 map)
    copy            -- 用于復(fù)制和連接slice,返回復(fù)制的數(shù)目
    len                -- 來求長度,比如string、array、slice、map、channel ,返回長度
    print、println     -- 底層打印函數(shù),在部署環(huán)境中建議使用 fmt 包
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容