go語言程序結構

1、命名

  1.命名規則

    a.一個名字必須以一個字母(Unicode字母)或者下劃線開頭。數組

    b.後面能夠跟任意數量的字母,數字,下劃線。app

    c.區分大小寫ide

 

  2.不可用於自定義名字的25個關鍵字

break   default    func i   nterface    select  
case    defer      go      map    struct   
chan    else     goto    package       switch
const     fallthrough       if       range     type  
continue     for      import      return     var
25個關鍵字

 

  3.30多個預約義的名字

內建常量: true    false    iota     nil

內建類型: int     int8    int16   int32   int64
               uint    uint8    uint16    uint32    uint64    uintptr
               float32    float64    complex128    complex64
               bool    byte    rune    string    error

內建函數:make    len    cap    new    append    copy    close    delete
               complex    real    imag
               panic    recover
30多個預約義的名字

    a.內部預訂名字不是關鍵字模塊化

    b.能夠再定義,從新使用它們函數

    c.通常不要定義它們,除非在一些特殊的場景裏。(什麼場景能使用,我也想不到。反正少用就對了)  工具

 

  4.做用域

    a.若是一個名字是在函數內部定義,那麼他就只在函數內部有效。ui

    b.若是在函數外部定義,那麼將在當前包的全部文件夾中均可以訪問。this

    c.若是一個名字是大寫字母開頭的(必須是在函數外部定義的包級名字;包級函數名自己也是包級名字),那麼他是能夠導出的,也就是說能夠被外部的包訪問。spa

    d.包自己的名字通常總用小寫字母。指針

  

  5.命名方式

    go語言推薦使用駝峯命名方式

 

2、聲明

  1.聲明語句的意義,以及go語言的四種主要類型

    a.聲明語句定義了程序的各類實體對象以及部分或所有屬性

    b.四種類型:

      變量:var

      常量:const

      類型:type

      函數:func

  

  2.一個例子簡單介紹下各個聲明的部分

package main


//導入聲明
import (
    "fmt"
)

//常量聲明,包一級範圍聲明。能夠再整個包中的每一個源文件中使用
const boilingF = 212.0

//函數聲明,無返回值,無參數的函數申明
func main()  {

    //變量聲明,函數級聲明,只能在函數中使用
    bool1 :=true

    if bool1{
        fmt.Println("this value is true")
    }else {
        fmt.Println("this value is fales")
    }

    c := test(1)
    fmt.Println(c)
}
//帶參數和返回值的函數聲明,無返回值省略  返回值類型  一項。可是哪怕沒有參數,也不可省略(參數)這一項。
// func 函數名(參數)返回值類型 {執行語句}
func test(a int)  int {
    b := a +1
    return b
}
簡介各聲明

 

 

3、變量

一、變量

  1.變量聲明的語法

var 變量名 類型 = 表達式
var s string = "我是神"     //正常格式
var s  string                   //省略表達的方式,默認爲零值
var s = "我是神"             //省略類型的方式,由編譯器自行判斷類型
var s,j,i str                    //申請多個統一類型的變量,且省略表達式所有爲零值。
var b,g,m = true,2.3 ,"four"    //申明多個變量,根據表達式編譯器自行判斷類型
var f,err = os.Open(name)    //申請兩個變量接收函數的返回值,類型有系統判斷。
幾種不一樣的變量聲明方式

  

  2.各種型的零值:

    數值類型(int):零值爲0

    布爾類型(bool):零值爲false

    字符串類型(string):零值爲空字符串 ""

    接口類型和引用類型(包括slice、map、chan和函數):零值爲nil

    數組或結構體等聚合類型對應的零值是每一個元素或者字段都是對應該類型的零值。

 

  3.零值的意義

    a.零值初始化機制能夠確保每一個聲明的變量老是有一個良好定義的值。

    b.能夠在沒有增長額外工做的前提下確保邊界條件的合理性爲。

    c.不至於致使錯誤或產生不可預知的行爲

    d.go語言中不存在未初始化的變量。

    e.應該讓一些聚合類型的零值也具備意義,能夠保證不管任何類型的變量老是有一個合理有效的零值狀態。

 

二、簡短變量聲明

  1.簡短變量聲明的語法

變量名 :=  表達式
//上述的變量聲明方式均可以用簡短變量聲明的方式進行聲明
s := "我是神"
s,j :=os.Open(name)
簡短變量聲明方式

 

  2.簡短變量聲明方式注意點

    a.只能在函數內部使用,在函數外部使用必須用var聲明

    b.簡短變量聲明語句中必須至少要聲明一個新的變量

//用簡短申明方式聲明兩個變量
in,err := os.Open(name)

//用簡短聲明方式聲明一個變量,另一個爲賦值操做
out ,err := os.Open(name)

//沒有聲明新的變量,不能編譯經過
out ,err := os.Open(name)

 

三、new()函數

  1.new()函數的語法

變量名 := new(T)    //T爲數據類型

p := new(int)
fmt.Println(p)
fmt.Println(*p)

*p = 2
fmt.Println(p)
fmt.Println(*p)

//0xc00001c060
//0
//0xc00001c060
//2
new()函數

    a.new()函數建立的爲變量的內存地址,即指針。數據類型爲 *T

    b.每次調用new()函數返回的都是新的變量的地址。

  

  2.new函數的注意點

    1)new函數這是一個預約義的函數,不是一個關鍵字。

    2)咱們能夠將new名字從新定義爲別的類型

    3)new被定義爲新的類型的變量名,那麼在其做用域內是沒法使用new()函數的

func delta (old, new int) int {
        return new-old
}
//因爲new被定義爲int類型的變量,所以在delta函數中是沒法使用內置de new()函數的。
從新定義new

 

四、變量的生命週期

  1.什麼變量的生命週期

    變量的生命週期指的是在程序運行期間變量有效存在的時間間隔。

  

  2.包一級聲明的變量的生命週期

    和整個程序的運行週期是一直的

  

  3.局部變量的的生命週期

    a.從每次建立一個新變量的聲明語句開始

    b.直到該變量再也不被引用爲止

    v.變量的存儲空間可能被回收

    d.函數的參數變量和返回值變量都是局部變量,在函數每次被調用是建立。

  

  4.全局變量的保存在堆中,不便於回收和管理,生命週期長。局部變量的保存在棧中,方便回收和管理,生命週期端。使用的技術爲「變量逃逸」技術。

 

4、賦值

一、普通賦值

x =1                    //變量名賦值
*p = ture             //指針賦值
person.name = 「bob」        //結構體字段賦值
count[x] = count[x] * scale       //數組,slice或map的元素賦值
count[x] *= scale        //運算並賦值

v :=1
v ++          //等價於v = v+1
v --            //等價於v= v-1
普通賦值方法

 

二、元祖賦值

x,y = y,x         //交換x.y位置
a[i] , a[j]  =  a[j]  ,  a[i]

x , y  = y , x+y
v ,ok  = m[key]
v ,ok  = x.(T)
v ,ok  = <-ch

_,err = io.Copy(dst, src)

_爲空白標識符,是捨棄掉不須要處理的值。
元組賦值

 

三、可賦值性

  即 「 = 」的左邊和右邊必須具備相同的數據類型

 

5、類型

一、類型聲明的意義

  1.類型聲明語句建立了一個新的類型類型名稱,和現有的類型具備相同的底成結構。

  2.新命名的類型提供了一個方法,用來分隔不一樣的概念的類型。

  3.這樣即便底成類型相同也是不兼容的。

 
二、類型聲明的語法
//type 類型名字 底成類型

package tempconv

import "fmt"

type Celsius float64            //攝氏度
type Fahrenheit float64       //華氏度

const (
    AbsoluteZeroC Celsius = -273.15       //絕對零度
    FreezingC     Celsius = 0                   //結冰點溫度
    BoilingC      Celsius = 100                 //沸水溫度
)

func CToF(c Celsius) Fahrenheit { return Fahrenheit(c*9/5 + 32) }

func FToC(f Fahrenheit) Celsius { return Celsius((f - 32) * 5 / 9) }

//!-

func (c Celsius) String() string { return fmt.Sprintf("%g°C", c) }
類型聲明

  a.Celsius和Fahrenheit分別對應不一樣類型的溫度單位。

  b.他們擁有相同的底成類型float64,可是他們是不一樣的數據類型。

  c.所以他們不能再一塊兒運算,也不能作比較

 

三、類型轉換

  a.Celsius(t)和Fahrenheit(t)是類型轉化操做,不是說函數調用,而是將值改變爲一直對應的類型。

  b.對於每個類型T,都有一個對應的類型轉換操做T(x),用於將x轉換爲T類型。

  c.當T爲指針類型時,可能須要用小括號包裝T,好比(*int)(0)

  d.只有兩個類型的底成基礎結構一致時,才容許轉換操做。

  e.轉換操做只改變類型,不會影響值自己。(可是float轉成int時會丟棄小數部分,形成值的改變)

 

6、包與文件

一、 包的做用

  a.go語言中的包和其餘語言的庫或者模塊的概念類似

  b.目的是爲了支持模塊化,封裝,單獨編譯和代碼重用

  c.一個包的源代碼保存在一個或多個以.go爲文件後綴名的源文件中

 

二、包的規則

  a.每個包都對應一個獨立的名字空間。(我理解的意思是,每一個包的包名都不該相同)

    b.若是一個名字的大寫字母開頭的,那麼這個名字是能夠導出的。

  c.一般一個包所在目錄路徑的後綴是包的導入路徑:$GOPATH/src/包名

  d.若是導入包可是沒有使用到改包,編譯時會報錯。

 

三、包的初始化

  1.普通的初始化

    a.若是包中還有多個.go源文件,它們將按照發給編譯器的順序進行初始化

    b.go語言的構建工具首先會將.go文件根據文件名排序,而後依次調用編譯器編譯

  2.複雜的初始化

    a.例如某些表格數據初始化應不是一個簡單的賦值過程。

    b咱們能夠用init初始化函數來簡單初始化工做。

    c.每一個文件均可以包含多個init初始化函數。

相關文章
相關標籤/搜索