当前位置: 首页 > news >正文

网站做竞价需要什么信息呼伦贝尔建设工程检测网站

网站做竞价需要什么信息,呼伦贝尔建设工程检测网站,可以做书的网站,视频拍摄软件文章目录 1. Channel 与 Goroutine 泄露1.1 发送不接收1.2 接收不发送1.3 nil channel2. 跳出 for-switch 或 for-select 3.for 迭代变量3.1 闭包中的for迭代变量3.2 for range 迭代变量 4. 循环内的 defer5.defer 函数的参数值6.nil interface 和 nil interface 值7.结构体指针… 文章目录 1. Channel 与 Goroutine 泄露1.1 发送不接收1.2 接收不发送1.3 nil channel2. 跳出 for-switch 或 for-select 3.for 迭代变量3.1 闭包中的for迭代变量3.2 for range 迭代变量 4. 循环内的 defer5.defer 函数的参数值6.nil interface 和 nil interface 值7.结构体指针访问属性前先判空8.读取有顺序需要的不能使用map结构参考文献 本文将介绍 Golang 初学者容易菜的坑希望广告 Gopher 避而远之。 1. Channel 与 Goroutine 泄露 当 channel 不恰当使用时就可能导致 Goroutine 发生永久阻塞从而造成资源泄露。 先看一下 channel 不同状态下的读写与 close 操作的结果。 操作未关闭已关闭nil发数据阻塞或成功发送panic永久阻塞取数据阻塞或成功接收成功接收或零值永久阻塞关闭成功关闭panicpanic 1.1 发送不接收 对于一个已满的 channelbuffered channel 容量已满或是 unbuffered channel继续向 其发送数据将会导致当前goroutine阻塞。为了避免这种情况需要使用其他机制通知发送者。 // 错误示例 func produce() -chan int {ch : make(chan int)go func() {defer close(ch)for i : 0; i 10; i {ch - i}}()return ch }func main() {ch : produce()for num : range ch {if num 2 {// 不想接收了直接退出吧break}fmt.Println(num)}// 虽然此段代码能正常运行但// produce产生goroutine将永远// 阻塞于 ch - i上造成资源泄露 }// 修正 func produce(doneCh chan struct{}) -chan int {ch : make(chan int)go func() {defer close(ch)loop:for i : 0; i 10; i {select {case ch - i:case -doneCh:break loop}}}()return ch } func main() {doneCh : make(chan struct{})ch : produce(doneCh)for num : range ch {if num 2 {// 不想接收了先通知一下生产者close(doneCh)break} fmt.Println(num)} }1.2 接收不发送 与前述情况相反若接收者一直在一个不会再产生数据的 channel 上等待将导致其所在routine 阻塞而泄露。 在Go中从一个 closed channel 读取数据: 不会阻塞且获取对应类型的零值for-range将退出v, ok : -ch中ok将为false 所以可以利用上述性质通知接收方结束数据读取。 // 错误示例 func produce(doneCh chan struct{}) -chan int {ch : make(chan int)go func() {select {case ch-1:case -doneCh:break}// 任务完成直接退出}()return ch } func main() {doneCh : make(chan struct{})ch : produce(doneCh)for num : range ch {fmt.Println(num)}close(doneCh)// Output:// 1// fatal error: all goroutines are asleep - deadlock! }// 修正 func produce(doneCh chan struct{}) -chan int {ch : make(chan int)go func() {// 退出前先关闭channel防止有routine阻塞在上面defer close(ch)select {case ch-1:case -doneCh:break}}()return ch } func main() {doneCh : make(chan struct{})ch : produce(doneCh)for num : range ch {fmt.Println(num)}close(doneCh)// Output:// 1 }1.3 nil channel 向 nil channel 发送和接收数据都将会导致阻塞。这种情况可能在我们定义 channel 时忘记初始化的时候发生。 func main() {defer func() {time.Sleep(time.Second)fmt.Println(num of routines: , runtime.NumGoroutine())}()var ch chan intgo func() {-ch// ch-}() }2. 跳出 for-switch 或 for-select 没有指定标签的 break 只会跳出 switch/select 语句 若不能使用 return 语句跳出的话可为 break 跳出标签指定的代码块。 注意 goto 虽然也能跳转到指定位置但依旧会再次进入 for-switch死循环。 // break 配合 label 跳出指定代码块 func main() { loop:for {switch {case true:fmt.Println(breaking out...)// break // 死循环一直打印 breaking out...break loop}}fmt.Println(out...) }3.for 迭代变量 3.1 闭包中的for迭代变量 for 语句中的迭代变量在每次迭代中都会重用即 for 中创建的闭包函数 接收到的参数始终是同一个变量所以在 goroutine 开始执行时都会得到同一个迭代值 // 错误示例 func main() {n : 2wg : sync.WaitGroup{}wg.Add(n)for i : 0; i n; i {go func() {defer wg.Done()fmt.Print(i)}()}wg.Wait()// Output:// 22 }// 修正 func main() {n : 2wg : sync.WaitGroup{}wg.Add(n)for i : 0; i n; i {num : igo func() {defer wg.Done()fmt.Print(num)}()/*当然也可以这样go func(num int) {defer wg.Done()fmt.Println(num)}(i)*/}wg.Wait()// Output:// 01 或 10 }3.2 for range 迭代变量 for range 循环中迭代变量的短声明只会在开始时执行一次后面都是直接赋值所以迭代变量的变量地址是不变的避免将其赋值给指针。 // 错误示例 slice1 : []int32{1, 2, 3, 4, 5} slice2 : make([]*int32, len(slice1)) for i, item : range slice1 {slice2[i] item } for _, item : range slice2 {fmt.Printf(%v, *item) } // 55555// 修正 func Int32(v int32) *int32 {return v } func main() {slice1 : []int32{1, 2, 3, 4, 5}slice2 : make([]*int32, len(slice1))for i, item : range slice1 {slice2[i] Int32(item)}for _, item : range slice2 {fmt.Printf(%v, *item)}// 12345 }4. 循环内的 defer 对 defer 延迟执行的函数会在调用它的函数结束时执行而不是在调用它的语句块结束时执行注意区分开。 // 错误示例 type Resource struct {/*内部有一些需要释放的内容 */ }func (r Resource) Destroy() { /*...*/ }func getResource() Resource { /*...*/ }func main() {for i : 0; i 10000; i {res : getResource()defer res.Destroy()// 会一直延迟至main结束才会释放// do something} }// 修正 type Resource struct { /* 内部有一些需要释放的内容 */ }func (r Resource) Destroy() { /*...*/ }func getResource() Resource { /*...*/ }func main() {for i : 0; i 10000; i {func () {res : getResource()defer res.Destroy()// 下次循环前就会释放当然你也可以在最后直接调用Destroy// do something}()} }5.defer 函数的参数值 defer 只会延迟其后函数的执行而不会延迟函数的参数的求值若希望延迟其参数 求值通常会加上一层匿名函数。 func main() {var i 1times : func(num int) int {return num * 2}defer fmt.Println(resultA: , times(i))defer func() {fmt.Println(resultB: , func() int { return i * 2 }())}()i// Output:// resultB: 4// resultA: 2 }6.nil interface 和 nil interface 值 Golang 中 interface 类型变量的实现中包含值与类型只有两者都为 nil 时该变量才为nil。 // 错误示例 type Foo interface {Bar() }type FooImpl struct {num int }func (f *FooImpl) Bar() { fmt.Println(f.num) }func GenFoo(num int) (Foo, error) {var f *FooImplif num ! 0 {f FooImpl{num}}return f, nil }func main() {f, _ : GenFoo(0)// this comparison is never trueif f nil {return}// Panicf.Bar() }// 正确示例 func GenFoo(num int) (Foo, error) {if num ! 0 {f : FooImpl{num}return f, nil}return nil, errors.New(num is zero) }那么如何判断 interface{} 的值是否为 nil 呢 func IsNil(i interface{}) {if i ! nil {if reflect.ValueOf(i).IsNil() {fmt.Println(i is nil)return}fmt.Println(i isnt nil)}fmt.Println(i is nil) }7.结构体指针访问属性前先判空 当结构体指针为nil时直接访问结构体属性会报空指针 // 错误示例 type Struct1 struct {id int32 } func main() {var a *Struct1//panic: runtime error: invalid memory address or nil pointer dereferencea.id 1 }// 修正 type Struct1 struct {id int32 } func main() {var a *Struct1if a ! nil {a.id 1} }8.读取有顺序需要的不能使用map结构 Go 里面的map存储是无序的for循环读取与写入的顺序并不同需要排序的功能不能使用map而需要使用slice。 // map 读取情况 intMap : make(map[int]int, 10)for i : 0; i 10; i {intMap[i] i }for _, v : range intMap {fmt.Println(v) } //9 //3 //7 //…… //没有按照写入顺序输出乱序的// slice 读取情况 intSlice : make([]int, 0, 10)for i : 0; i 10; i {intSlice append(intSlice, i) }for _, v : range intSlice {fmt.Println(v) } //0 //1 //2 //... //读取是有序的参考文献 Go 神坑 1 —— interface{} 与 nil 的比较 - CSDN 50 Shades of Go: Traps, Gotchas, and Common Mistakes 50 Shades of Go: Traps, Gotchas, and Common Mistakes中文翻译 如何防止 goroutine 泄露
http://www.laogonggong.com/news/111663.html

相关文章:

  • 企业备案网站服务内容网站死链接查询
  • 电商网站开发发展和前景在线设计平台源码
  • 深圳哪家公司需要网站建设的网页设计和网站建设的区别
  • 网站网站制作多少钱wordpress如何上线
  • 在北京网站建设的岗位汉化wordpress插件
  • 爱站网关键词挖掘机营销战略包括哪些方面
  • 玉林市住房和城乡建设局网站网站建设的实践目的
  • 传媒网站源码怎么建立网站推广
  • 桓台县旅游网站建设新型门窗网站模板
  • 黑色网站模板2023引流软件
  • 全网有哪些网站可以做淘客网站的功能
  • 企业网站推广解决方案惟博df1042可以看多远
  • 做美食网站的目的意义湛江制作网站多少钱
  • 成都网站制作维护广丰区建设局网站
  • 如何为网站做优化东莞设计公司网站
  • 免费做网站支持绑定做的丑的网站有哪些知乎
  • 嘉兴外贸网站建设杭州论坛网站建设
  • 阿里云怎么做淘宝客网站php开源网站 网上商城
  • 门户网站的发展趋势网页模板怎么设计
  • 辽阳市建设行业培训中心网站创建网站的基本步骤
  • 网站图片3d显示效果济南网站建设推荐q479185700上快
  • 网站全屏轮播代码养殖场网站源码
  • 提供网站建设价格电子商务网站建设与管理课程的意义
  • 网站设计素材免费下载100种找客户的方法
  • 企业网站怎么做才好深圳注册公司地址怎么解决
  • 做中英文网站的世界互联网公司排名
  • 很有风格的网站有哪些如何为网站建设内容
  • 淘宝店采用哪些方法做网站推广东莞房价2022最新价格
  • 安徽省安徽省建设工程信息网站重庆梁平网站建设哪家便宜
  • uc酷站中的美图网站优秀网站设计网站