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

跨境独立站哪个平台好域名备案查询

跨境独立站哪个平台好,域名备案查询,网站后台账户如何做会计分录,明年做哪个网站致富在 Go 语言的开发过程中,控制结构作为程序的核心组成部分,承担着程序流程的调控任务。无论是简单的条件判断,还是复杂的循环控制,恰当使用控制结构能有效提高代码的可读性与执行效率。然而,许多初学者和开发者在使用 G…

在 Go 语言的开发过程中,控制结构作为程序的核心组成部分,承担着程序流程的调控任务。无论是简单的条件判断,还是复杂的循环控制,恰当使用控制结构能有效提高代码的可读性与执行效率。然而,许多初学者和开发者在使用 Go 语言的控制结构时,常常会犯一些低级错误,导致程序出现逻辑问题或性能瓶颈。

1、忽略了 select 语句中的 default 分支 

示例代码:

package mainimport ("fmt""time"
)func main() {ch := make(chanint)gofunc() {time.Sleep(2 * time.Second)ch <- 1}()select {case val := <-ch:fmt.Println("FunTester: 接收到", val)}fmt.Println("FunTester: 程序结束")
}

错误说明: 在上述代码中,select 语句没有 default 分支。这意味着当 ch 没有数据可接收时,select 会一直阻塞,直到有数据到达。这可能会导致程序在某些情况下无法继续执行,尤其是在需要处理超时或非阻塞操作的场景中。

可能的影响: 如果没有 default 分支,select 语句会一直等待,直到某个 case 条件满足。这可能会导致程序在等待时无法执行其他任务,进而影响程序的响应性和性能。

最佳实践: 在 select 语句中使用 default 分支,以确保在没有 case 条件满足时,程序可以继续执行其他任务。这样可以避免不必要的阻塞,提高程序的响应性。

改进后的代码:

package mainimport ("fmt""time"
)func main() {ch := make(chanint)gofunc() {time.Sleep(2 * time.Second)ch <- 1}()select {case val := <-ch:fmt.Println("FunTester: 接收到", val)default:fmt.Println("FunTester: 没有数据可接收")}fmt.Println("FunTester: 程序结束")
}

输出结果:

FunTester: 没有数据可接收
FunTester: 程序结束

上述代码当channal没有数据进来时,代码会执行default逻辑,然后退出。但上述代码仅适用于一次性数据任务执行场景,当channal中的数据消费完退出后,channal再有数据进来也无法唤醒select逻辑;

优化后的代码: 

package mainimport ("fmt""time"
)func main() {ch := make(chan string)// 启动一个 Goroutine 定时发送数据到 Channelgo func() {for {//time.Sleep(3 * time.Second)time.Sleep(100 * time.Millisecond)ch <- "data"fmt.Println("Sent data to channel")}}()for {select {case data := <-ch:fmt.Println("Received data:", data)default:fmt.Println("No data received, continue waiting...")time.Sleep(500 * time.Millisecond)}}
}

for循环是个死循环,除非手动触发程序退出,否则会一直执行,适用于常驻任务场景;

但部分场景中针对单一任务会设置超时,如在规定时间内任务未执行完成,需要强制跳出循环,以便于下一个任务执行,因此代码逻辑需要加入超时退出的逻辑。

超时退出的代码:

package mainimport ("fmt""time"
)func main() {ch := make(chan string)// 启动一个 Goroutine 定时发送数据到 Channelgo func() {for {//time.Sleep(3 * time.Second)time.Sleep(500 * time.Millisecond)ch <- "data"fmt.Println("Sent data to channel")}}()timer := time.After(5 * time.Second)for {select {case <-timer:fmt.Println("task timeout")goto Outputcase data := <-ch:fmt.Println("Received data:", data)default:fmt.Println("No data received, continue waiting...")time.Sleep(500 * time.Millisecond)}}
Output:fmt.Println("task exit")
}

2、忽略了 select 语句中的 case 顺序 

错误说明: 在 select 语句中,case 的顺序可能会影响程序的执行结果。如果有多个 case 条件同时满足,Go 会随机选择一个执行。这可能会导致开发者误以为 case 的顺序会影响优先级,但实际上并不会。

可能的影响: 开发者可能会误以为 select 语句中的 case 顺序会影响优先级,导致程序行为与预期不符。特别是在处理多个 channel 时,可能会误以为先定义的 case 会优先执行。

最佳实践: 理解 select 语句中的 case 是随机选择的,不要依赖于 case 的顺序来决定优先级。如果需要特定的优先级,可以通过其他方式(如嵌套 select 或超时机制)来实现。

示例代码:

package mainimport ("fmt""time"
)func main() {ch1 := make(chan int)ch2 := make(chan int)go func() {for {time.Sleep(1 * time.Second)ch1 <- 1}}()go func() {for {time.Sleep(1 * time.Second)ch2 <- 2}}()for {select {case val := <-ch1:fmt.Println("FunTester: 接收到 ch1", val)case val := <-ch2:fmt.Println("FunTester: 接收到 ch2", val)}}
}

输出结果:

FunTester: 接收到 ch1 1
FunTester: 接收到 ch2 2
FunTester: 接收到 ch2 2
FunTester: 接收到 ch1 1
FunTester: 接收到 ch1 1
FunTester: 接收到 ch2 2
FunTester: 接收到 ch2 2
FunTester: 接收到 ch1 1
FunTester: 接收到 ch2 2

3、忽略了 select 语句中的 nil channel 

示例代码:

package mainimport ("fmt""time"
)func main() {var ch chan intgo func() {time.Sleep(1 * time.Second)ch <- 1}()select {case val := <-ch:fmt.Println("FunTester: 接收到", val)default:fmt.Println("FunTester: 没有数据可接收")}fmt.Println("FunTester: 程序结束")
}

错误说明: 在上述代码中,ch 是一个 nil channel,因为其未初始化。在 Go 中,向 nil channel 发送或接收数据会导致永久阻塞。因此,select 语句中的 case val := <-ch 会一直阻塞,直到 ch 被初始化。

可能的影响: 如果 select 语句中的 channel 是 nil,程序可能会永久阻塞,导致无法继续执行其他任务。这可能会导致程序挂起或资源泄漏。

最佳实践: 在使用 select 语句时,确保所有的 channel 都已经正确初始化。如果 channel 可能为 nil,可以在 select 语句之前进行检查,或者使用 default 分支来避免阻塞。

改进后的代码:

package mainimport ("fmt""time"
)func main() {var ch chan int = make(chan int)gofunc() {time.Sleep(1 * time.Second)if ch != nil {ch <- 1}}()select {case val := <-ch:fmt.Println("FunTester: 接收到", val)default:fmt.Println("FunTester: 没有数据可接收")}fmt.Println("FunTester: 程序结束")
}

输出结果:

FunTester: 没有数据可接收
FunTester: 程序结束
http://www.dtcms.com/wzjs/525546.html

相关文章:

  • wordpress批量建站小程序推广平台
  • 在建工程项目查询宁波百度seo排名优化
  • 网站目录文件关键词制作软件
  • 荥阳网站建设西安网站推广
  • 动漫网站开发北京建设网站公司
  • 网站作弊天津seo排名费用
  • wordpress微信采集按钮怎么优化百度关键词
  • 建水网站开发百度搜索关键词排名优化技术
  • 网站建设默认字体永久免费建站系统
  • 黎城网站建设品牌推广计划书怎么写
  • 南阳网站建设.com网络推广公司哪家好
  • 网站不用域名比较好用的搜索引擎
  • 企业网站建设需要准备资料重庆自动seo
  • 香奈儿网站建设目标百度seo优化教程免费
  • 恶搞网站怎么做百度竞价关键词价格查询
  • 企业网站备案时间南昌seo管理
  • 单页网站产品今日热点新闻头条
  • 网站建设公司上海做网站公司排名谷歌seo外包公司哪家好
  • 网站建设讯美seo教程搜索引擎优化入门与进阶
  • 空包网网站怎么做的写一篇软文推广自己的学校
  • 网站的友情链接怎么做中国百强企业榜单
  • 企业建站找哪家短视频营销常用平台有
  • 天水网站开发采集站seo赚钱辅导班
  • 青州网站建设湖南优化电商服务有限公司
  • 做接口自动化是网站登录加密搜索引擎优化自然排名
  • 做网站答辩北京竞价托管代运营
  • 网站建设项目报价seo优化一般优化哪些方面
  • 怎么做网站在线客服谷歌搜索引擎 google
  • 国内wordpress 模板seo文章推广
  • 给网站做解答是干嘛的seo的培训班