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.無類型intiota是預聲明標示符,它只能用在常量聲明中,並且其值從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類型,不能夠表示其他類型.