golang中builtin包说明

本文介绍了Go语言的内置包`builtin`,包括常量声明规则、iota的用法,以及变量如`append`、`len`、`cap`、`close`等的函数细节。此外,还讲解了`make`、`new`、`panic`和`recover`等函数的工作原理,以及Go中各种基本类型和复数类型。
摘要由CSDN通过智能技术生成

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/

Golang 的 rate 提供了限流的功能,通过控制单位时间内的请求次数来限制请求的流量,避免对系统的过度压力,从而保证系统的稳定性和可靠性。该提供了两种限流器类型:Limiter 和 TokenBucket。 1. Limiter Limiter 类型通过设定每秒处理的请求数和容量,来实现限流,例如: ```go // 每秒最多处理 100 个请求 limiter := rate.NewLimiter(100, 1) // 处理请求 if limiter.Allow() == false { // 请求超过限制,进行限流处理 // ... } ``` 上述代码,通过 NewLimiter 方法创建一个每秒最多处理 100 个请求的限流器,使用 Allow 方法判断是否允许处理请求。如果返回 false,则说明请求超过了限流器的容量,需要进行限流处理。 2. TokenBucket TokenBucket 类型通过设定 Token 的最大数量和 Token 的生成速率来实现限流,例如: ```go // 创建 TokenBucket tb := rate.NewTokenBucket(rate.Every(time.Second), 100) // 处理请求 if tb.TakeAvailable(1) < 1 { // 请求超过限制,进行限流处理 // ... } ``` 上述代码,通过 NewTokenBucket 方法创建一个每秒最多生成 100 个 Token 的 TokenBucket,使用 TakeAvailable 方法判断是否允许处理请求。如果返回 0,则说明请求超过了 TokenBucket 的容量,需要进行限流处理。 需要注意的是,限流只是一种减少系统压力的手段,不能替代服务降级和容错机制,应该综合考虑多种因素来保证系统的稳定性和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值