Go知识点之随便记记(二)

学习资料来自

GitHub - unknwon/the-way-to-go_ZH_CN: 《The Way to Go》中文译本,中文正式名《Go 入门指南》

1、标签🏷️ 

1)goto,continue,break(可跳出多重循环)都可以配合标签使用

2)标签和goto并不推荐使用

2、函数

1)不允许函数重载,无范型

2)函数可赋值给变量,本身属于一等值

3)以函数为值的变量可以互相比较,指向同一函数签名/nil的变量视为相等

4)不允许在函数内声明函数(匿名函数除外)

5)参数默认使用按值传递(传递值的拷贝)

6)允许可变长参数

func Greeting(prefix string, who ...string)
Greeting("hello:", "Joe", "Anna", "Eileen")

7)变长参数类型不确定时可引入空接口

func typecheck(..,..,values … interface{}) {
	for _, value := range values {
		switch v := value.(type) {
			case int: …
			case float: …
			case string: …
			case bool: …
			default: …
		}
	}
}

8)defer:多个时逆序执行,类似栈,先进后出。可辅助函数追踪

9)内置函数总结

10)函数本身可作为参数使用

11)关于闭包函数:声明在函数中的函数

       闭包函数可辅助进行调试

where := func() {
	_, file, line, _ := runtime.Caller(1)
	log.Printf("%s:%d", file, line)
}
where()
// some code
where()
// some more code
where()

# —————————————————————————————————————————


var where = log.Print
func func1() {
where()
... some code
where()
... some code
where()
}

12)函数执行时间计算(保存计算过的数值在内存中能有效降低运行时间)

start := time.Now()
longCalculation()
end := time.Now()
delta := end.Sub(start)
fmt.Printf("longCalculation took this amount of time: %s\n", delta)

3、数组和切片

1)各种初始化,数组声明需指定长度,切片不需要

var arrAge = [5]int{18, 20, 15, 22, 16}
var arrLazy = [...]int{5, 6, 7, 8, 22}
var arrLazy = []int{5, 6, 7, 8, 22}	//注:初始化得到的实际上是切片slice
var arrKeyValue = [5]string{3: "Chris", 4: "Ron"}
var arrKeyValue = []string{3: "Chris", 4: "Ron"}	//注:初始化得到的实际上是切片slice

2)大数组为函数参数时,可通过传递指针降低内存使用

3)切片是引用,共享存储

4)内存分配区别

  • new(T) :为类型T分配内存+初始化为0,返回指针
  • make(T) :返回类型T的初始值,仅针对map,切片,channel

 5)buffer :读写长度未知的 bytes ,初始化方法如下

  • var buffer bytes.Buffer
  • var r *bytes.Buffer = new(bytes.Buffer)
  • func NewBuffer(buf []byte) *Buffer
  • 追加字符串方法:buffer.WriteString(s)
  • buffer 转为字符串:buffer.String()

6)切片复制,追加

(1)复制:func copy(dst, src  []T)  int(src拷贝到dst + 返回拷贝的元素个数)

(2)追加:func append(s []T, x ... T)  []T(0 个或多个具有相同类型 s 的元素追加到切片后面,返回新的切片),append包含如下操作

  • 切片 b 的元素追加到切片 a 之后 :a = append(a, b...)
  • 删除位于索引 i 的元素 :a = append(a[:i], a[i+1:]...)
  • 切除切片 a 中从索引 i 至 j 位置的元素 :a = append(a[:i], a[j:]...)
  • 为切片 a 扩展 j 个元素长度 :a = append(a, make([]T, j)...)
  • 索引 i 的位置插入元素 x :a = append(a[:i], append([]T{x}, a[i:]...)...)
  • 索引 i 的位置插入长度为 j 的新切片 :a = append(a[:i], append(make([]T, j), a[i:]...)...)
  • 索引 i 的位置插入切片 b 的所有元素 :a = append(a[:i], append(b, a[i:]...)...)
  • 取出位于切片 a 最末尾的元素 x :x, a = a[len(a)-1], a[:len(a)-1]
  • 元素 x 追加到切片 a :a = append(a, x)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值