golang中builtin包說明

builtin包是go的預聲明定義,包括go語言中常用的各種類型和方法聲明,包括變量和常量兩部分.其詳細聲明在builtin.go文件中,鏈接:http://golang.org/src/builtin/builtin.go

首先介紹一下golang中常量.

常量:

const (
        true  = 0 == 0 // Untyped bool.
        false = 0 != 0 // Untyped bool.
)
true和false是兩個無類型的bool值


const iota = 0 // Untyped int.無類型int
iota是預聲明標示符,它只能用在常量聲明中,並且其值從0開始,在const中每新增一行將使得iota計數一次,即iota自己增長1(從這點來看,iota可以看成const塊中的行索引,記錄行數),其值一直自增1直到遇到下一個const關鍵字,其值才被重新置爲0.

1在常量聲明中,如果一個常量沒有賦值,則他就跟上一行的賦值相同,這個可以用在如果多個常量其值相同時,則只需給1個常量賦值,其他常量跟在他後面即可.

package main
import (
	"fmt"
)
const (
	a = iota   //iota默認初始值爲0
	b = 100
	c      //c默認跟上一個賦值相同
	d = iota   //iota默認每行加1,故此時其值爲3
)
func main() {
	fmt.Println(a, b, c, d)
}
運行結果: 0 100 100 3

2在變量聲明中,每新增一行,iota值採增加1,如果多個變量在一行中聲明,iota值只增加1次

package main

import (
	"fmt"
)
const (
	a    = iota
	b, c = iota, iota
	d    = iota
)
func main() {
	fmt.Println(a, b, c, d)
}
運行結果:0 1 1 2

3iota遇到下一個const關鍵字,其值重新被賦值爲0

package main

import (
	"fmt"
)

const (
	a    = iota
	b, c = iota, iota
	d    = iota
)
const e = iota //再次遇到const關鍵字,iota值變爲0

func main() {
	fmt.Println(a, b, c, d, e)
}
運行結果:0 1 1 2 0

4常量定義方式: const 名字[數據類型]=表達式,其中數據類型可有可無,但是使用數據類型時其必須注意:兩個帶類型常量不能寫在同一行,帶類型常量必須賦值,不能爲空,如下所示:

const (
	a    = 1
     d    int   //錯誤
	b int, c int = 1, 1 //錯誤

)
正確寫法如下:

const (
	a    int = 1
	d    int
	b, c = 1, 1
)
所以在定義const常量時,除非特別強調常量類型,否則可以不帶數據類型.

變量:

func append(slice []Type, elems ...Type) []Type

其使用有兩種方式:

slice = append(slice, elem1, elem2)  //直接在slice後面添加單個元素,添加元素類型可以和slice相同,也可以不同
slice = append(slice, anotherSlice...)  //直接將另外一個slice添加到slice後面,但其本質還是將anotherSlice中的元素一個一個添加到slice中,和第一種方式類似.
作爲一種特殊情況,將字符串添加到字節數組之後是合法的.

package main

import (
	"fmt"
)

func main() {
	slice := append([]byte("hello "), "world"...)  //其實考慮一下,這也是很正常的,因爲在go中[]byte和string是可以直接相互轉換的.
	fmt.Println(string(slice))
}
運行結果:hello world


func len(v Type) int

len()是go中使用頻率比較高的一個函數,其用來返回Type v的length,其對應的類型以及返回的值如下:

數組:數組長度
數組指針:數組長度
slice/map:slice 或者map中元素個數
string:字符串中字節數
channel:通道中現有數量

func cap(v Type) int

cap()返回的是容器的容量,有時候和len()返回的值是不同的,其對應的類型和返回情況如下:

數組:數組長度
數組指針:數組長度
slice:slice重新分配後能夠達到最大長度
channel:分配channel中緩存的大小
通過對比我們可以看到,在面對數組類型以及數組指針時,len和cap的值都是一樣的,都是數組長度.

異同點:cap不支持map,string類型.而在slice 和channel,二者獲取的值也是不同的,len取得的是現有值,而cap取得的是最大值.例子如下:

package main

import (
	"fmt"
)

func main() {

	a := make(chan int, 10)
	fmt.Println(cap(a))        //10
	fmt.Println(len(a))        //0
	b := make([]int, 2)
	b = append(b, 1)
	fmt.Println(len(b))        //3
	fmt.Println(cap(b))      //4
}
運行結果:10 0 3 4 


func close(c chan<- Type)

close()只能用來關閉channel,並且其只能在發送端關閉,不能在接受端關閉.具體參見http://blog.csdn.net/chenbaoke/article/details/41647865


func complex(r, i FloatType) ComplexType     //將兩個浮點數類型轉換爲一個複數,其中實部和虛部二者類型必須一致,並且只能爲float32和float64的一種

func imag(c ComplexType) FloatType   //獲取複數的虛部

func real(c ComplexType) FloatType   //獲取複數的實部

package main

import (
	"fmt"
)
func main() {
	a := complex(1, 2)
	b := imag(a)
	c := real(a)
	fmt.Println(a, b, c)
}
運行結果:(1+2i)  2  1

func copy(dst, src []Type) int

copy實現兩個slice之間的複製,其中複製的長度是dst和src中長度比較小的長度,返回的也是比較小的長度,copy過程中允許覆蓋.

package main

import (
	"fmt"
)

func main() {

	a := make([]int, 1)
	b := []int{1, 2}
	c := copy(a, b) //由於a的大小爲1,所以b只給a複製了1個元素1,並且返回c的長度也是1
	fmt.Println(a, b, c)
}
運行結果:[1] [1 2] 1



func delete(m map[Type]Type1, key Type)

從map中刪除相應的元素,如果無此key,則不做任何操作


func make(Type, size IntegerType) Type

只能用於map,slice,channel

func new(Type) *Type //初始化對象並返回一個指向對象的指針


func panic(v interface{})  //停止goroutine執行,先執行defer函數,待defer函數執行完,將出錯信息向其panic調用者傳遞panic相關信息.
func recover() interface{}   //defer函數中通過recover獲取panic調用的錯誤信息,並恢復正常執行.如果沒有panic,則recover會返回nil.


func print(args ...Type)
func println(args ...Type)
    //暫時沒有明白其用法

type ComplexType    //表示所有的複數類型complex64 或 complex128
type FloatType   //表示所有的浮點類型:float32 或 float64
type IntegerType
type Type
type Type1
type bool
type byte     //等價與uinit8,習慣上用它來區分字節值和8位無符號整數
type complex128
type complex64
type error
type float32
type float64
type int      //帶符號整型,其大小與機器總線數量有關,但是他是一種具體的類型,而不是int32或者int64的別名.
type int16
type int32
type int64
type int8
type rune    //int32別名,習慣上用它來區分字符值和整數值
type string   //8位字節的字符串合集,string可爲空,但是不能爲nil,不能夠對string進行修改.
type uint
type uint16
type uint32
type uint64
type uint8
type uintptr  //其爲整數類型,其大小足以容納任何指針的位模式.


var nil Type      //nil只能表示指針,channel,函數,interface,map或者slice類型,不能夠表示其他類型.



參考:http://golang.org/pkg/builtin/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章