append

函数append会智能地处理底层数组的容量增长。在切片的容量小于1000个元素时,总是会成倍地增加容量。一旦元素个数超过1000,容量的增长因子就会设为1.25,

也就是每次增加25%的容量,随着语言的演化,这种增长算法可能会有所改变。

测试代码 & 结果

func main() {
l1 := []int{0: 1}
k := 1
last := 0
for k < 2000 {
l1 = append(l1, k)
k++
if cap(l1) != last {
fmt.Println(k, cap(l1))
last = cap(l1)
}
}
}

切片传到函数里面是传引用

代码测试

func foo(list []int) {
for i := 0; i < len(list); i++ {
list[i] = 10 + i
}
return
}
func main() {
list := []int{0, 1, 2}
foo(list)
fmt.Printf("%v", list)
} // 结果
[10, 11, 12]

切片和指针

64位架构的机器上,一个切片需要24字节的内存,指针字段需要8字节,长度和容量各需要8字节

方法集


Values | Methods Receivers

T      |(t T)

*T     | (t T) and (t **T)

指向T类型的值的方法集只包含值接收者声明的方法。

指向T类型的指针的方法集包含值接收者声明和指针接收者声明的方法。

并发

go语言运行时默认会为每个可用的物理处理器分配一个逻辑处理器

如果创建一个goroutine并准备运行,这个goroutine就会被到调度器的全局运行队列中。之后,调度器就将这些队列中的goroutine分配给一个逻辑处理器,并放到这个逻辑处理器对应的本地运行队列中。

逻辑处理器

本地运行队列

调度器

使用go build -race竞争检测器标志来编译程序

运行程序./go_start.exe 出现警告。

可以使用atomicsync包下的方法或函数保证线程安全

unbuffered := make(chan int)
buffered := make(chan string, 10)

第一个是无缓冲的通道,第二是有缓冲的通道

任务执行,需要考虑的情况:

  1. 系统中断
  2. 完成情况(完成 or 失败)
  3. 超时

runner

runner自带超时与中断功能

type Runner struct {
interrupt chan os.Signal complete chan error timeout <-chan time.Time tasks []func(int)
} var ErrTimeOut = errors.New("received timeout")
var ErrInterrupt = errors.New("received interrupt") // new a Runner
func New(d time.Duration) *Runner {
return &Runner{
interrupt: make(chan os.Signal, 1),
complete: make(chan error),
timeout: time.After(d),
}
} func (r *Runner) Add(tasks ...func(int)) {
r.tasks = append(r.tasks, tasks...)
} func (r *Runner) Start() error {
signal.Notify(r.interrupt, os.Interrupt) go func() {
r.complete <- r.run()
}() select {
case err := <-r.complete:
return err
case <-r.timeout:
return ErrTimeOut
}
} func (r *Runner) run() error {
for id, task := range r.tasks {
if r.gotInterrupt() {
return ErrInterrupt
}
task(id)
}
return nil
} func (r *Runner) gotInterrupt() bool {
select {
case <-r.interrupt:
signal.Stop(r.interrupt)
return true
default:
return false
}
}

pool

资源管理池

package pool

import (
"errors"
"io"
"log"
"sync"
) type Pool struct {
m sync.Mutex
resources chan io.Closer
factory func() (io.Closer, error)
closed bool
} var ErrPoolClosed = errors.New("Pool has been closed") func New(fn func() (io.Closer, error), size uint) (*Pool, error) {
if size <= 0 {
return nil, errors.New("size value too small")
}
return &Pool{
factory: fn,
resources: make(chan io.Closer, size),
}, nil
} // get a resource
func (p *Pool) Acquire() (io.Closer, error) {
select {
case r, ok := <-p.resources:
log.Println("Acquire:", "shared Resource")
if !ok {
return nil, ErrPoolClosed
}
return r, nil
default:
log.Println("Acquire:", "New Resource")
return p.factory()
}
} // release to reasoure
func (p *Pool) Release(r io.Closer) {
p.m.Lock()
defer p.m.Unlock() if p.closed {
r.Close()
return
} select {
case p.resources <- r:
log.Println("Release:", "In queue")
default:
log.Println("Release:", "Closing")
r.Close()
}
} // Close
func (p *Pool) Close() {
p.m.Lock()
defer p.m.Unlock()
if p.closed {
return
}
p.closed = true
close(p.resources) for r := range p.resources {
r.Close()
}
return
}

go语言实战 摘抄的更多相关文章

  1. R入门<三>-R语言实战第4章基本数据管理摘要

    入门书籍:R语言实战 进度:1-4章 摘要: 1)实用的包 forecast:用于做时间序列预测的,有auto.arima函数 RODBC:可以用来读取excel文件.但据说R对csv格式适应更加良好 ...

  2. R语言实战(三)基本图形与基本统计分析

    本文对应<R语言实战>第6章:基本图形:第7章:基本统计分析 =============================================================== ...

  3. R语言实战(二)数据管理

    本文对应<R语言实战>第4章:基本数据管理:第5章:高级数据管理 创建新变量 #建议采用transform()函数 mydata <- transform(mydata, sumx ...

  4. R语言实战(一)介绍、数据集与图形初阶

    本文对应<R语言实战>前3章,因为里面大部分内容已经比较熟悉,所以在这里只是起一个索引的作用. 第1章       R语言介绍 获取帮助函数 help(), ? 查看函数帮助 exampl ...

  5. Swift语言实战晋级

    Swift语言实战晋级基本信息作者: 老镇 丛书名: 爱上Swift出版社:人民邮电出版社ISBN:9787115378804上架时间:2014-12-26出版日期:2015 年1月开本:16开页码: ...

  6. swift语言实战晋级-第9章 游戏实战-跑酷熊猫-9-10 移除平台与视差滚动

    9.9 移除场景之外的平台 用为平台是源源不断的产生的,如果不注意销毁,平台就将越积越多,虽然在游戏场景中看不到.几十个还看不出问题,那几万个呢?几百万个呢? 所以我们来看看怎么移除平台,那什么样的平 ...

  7. swift语言实战晋级-第9章 游戏实战-跑酷熊猫-7-8 移动平台的算法

    在上个小节,我们完成了平台的产生.那么我们来实现一下让平台移动.平台的移动,我们只需要在平台工厂类中写好移动的方法,然后在GameScene类中统一控制就行了. 在GameScene类中,有个upda ...

  8. Swift语言实战晋级-第9章 游戏实战-跑酷熊猫-5-6 踩踏平台是怎么炼成的

    在游戏中,有很多分来飞去的平台,这个平台长短不一.如果每种长度都去创建一张图片那是比较繁琐的事情.实际上,我们只用到3张图.分别是平台的,平台的中间部分,平台的右边.关键是平台的中间部分,两张中间部分 ...

  9. Swift语言实战晋级-第9章 游戏实战-跑酷熊猫-4 熊猫的跳和打滚

    之前我们学会了跑的动作,现在我们可以利用同样的方法来实现了跳和打滚的动画. …… class Panda : SKSpriteNode { …… //跳的纹理集合 let jumpAtlas = SK ...

随机推荐

  1. Django 过滤器 、日期格式化、数学运算

    Django 的模板中的数学运算前言 django模板只提供了加法的filter,没有提供专门的乘法和除法运算:django提供了widthratio的tag用来计算比率,可以变相用于乘法和除法的计算 ...

  2. Mac020--常用插件

    Google浏览器常用插件 1.github插件octotree 2.掘金Chrome网上应用商店 2-1.掘金/老司机的神兵利器 2-2.好用的Google插件:来自掘金 3.Gliffy Diag ...

  3. TS学习笔记----(一)基础类型

    布尔值: boolean let isDone: boolean = false; 数字: number 和JavaScript一样,TS里的所有数字都是浮点数. 支持十进制和十六进制字面量,TS还支 ...

  4. SCUT - 486 - 无向图上的点 - Dijkstra

    好像原题是这个?https://www.cnblogs.com/kanchuang/p/11120052.html 这个有解释:https://blog.csdn.net/wddwjlss/artic ...

  5. 利用CSS的translate属性或利用CSS实现图片居中的效果

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. 14-jquery元素节点操作

    **创建节点** ```var Div = $('<div>');var Div2 = $('<div>这是一个div元素</div>');``` **插入节点** ...

  7. 解决stanfordnlp一直运行不报错也没有结果

    最近学习stanfordnlp,当运行程序时,发现程序一直没有反应,上网查询说是内存不够,但是本地电脑是8g内存.后来重新下载了所需文件,问题解决.

  8. AFNetworking2.0源码解析<四>

    结构 AFURLResponseSerialization负责解析网络返回数据,检查数据是否合法,把NSData数据转成相应的对象,内置的转换器有json,xml,plist,image,用户可以很方 ...

  9. python-xss攻击和单例模式

    1.python中单例模式 class Foo: instance = None def __new__(cls, *args, **kwargs): if not Foo.instance: Foo ...

  10. netdevice - 底层访问 Linux 网络设备

    总览 (SYNOPSIS) #include <sys/ioctl.h> #include <net/if.h> 描述 (DESCRIPTION) 本手册 描述 用于 配置 网 ...