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

西安免费自助建站模板北京短视频制作

西安免费自助建站模板,北京短视频制作,个人网站 icp 代理,如何刷网站排名什么是延期#xff1f; Defer 语句用于在存在 defer 语句的周围函数返回之前执行函数调用。该定义可能看起来很复杂#xff0c;但通过示例就很容易理解。 例子 package mainimport ( fmt )func finished() { fmt.Println(Finished finding largest Defer 语句用于在存在 defer 语句的周围函数返回之前执行函数调用。该定义可能看起来很复杂但通过示例就很容易理解。 例子 package mainimport ( fmt )func finished() { fmt.Println(Finished finding largest) }func largest(nums []int) { defer finished() fmt.Println(Started finding largest)max : nums[0]for _, v : range nums {if v max {max v}}fmt.Println(Largest number in, nums, is, max) }func main() { nums : []int{78, 109, 2, 563, 300}largest(nums) }Run in playground 上面是一个简单的程序用于查找给定切片的最大数量。该largest函数接受一个int切片作为参数并打印该切片的最大数量。函数的第一行包含语句defer finished()。这意味着该finished()函数将在函数返回之前被调用。运行该程序您可以看到打印出以下输出。 Started finding largest Largest number in [78 109 2 563 300] is 563 Finished finding largest 函数开始执行并打印上述输出的前两行。在它返回之前我们的延迟函数finished会执行并打印文本Finished finding largest 延迟方法 Defer 不仅仅限于函数。Defer方法调用也是完全合法的。 让我们编写一个小程序来测试一下。 package mainimport ( fmt )type person struct { firstName stringlastName string }func (p person) fullName() { fmt.Printf(%s %s,p.firstName,p.lastName) }func main() { p : person {firstName: John,lastName: Smith,}defer p.fullName()fmt.Printf(Welcome ) }Run in playground 在上面的程序中我们第21行调用了Defer。 程序的其余部分是不言自明的。该程序输出 Welcome John Smith 论据评价 延迟函数的参数在defer执行语句时计算而不是在实际函数调用完成时计算。 让我们通过一个例子来理解这一点。 package mainimport ( fmt )func printA(a int) { fmt.Println(value of a in deferred function, a) } func main() { a : 5defer printA(a)a 10fmt.Println(value of a before deferred function call, a)}Run in playground 在上面的程序中a的值最初为5。 当第 12行执行 defer 语句时。a的值是5因此这将是被当做printA延迟函数的参数。我们将第 1 3行中的值更改a为 10。该程序输出 value of a before deferred function call 10 value of a in deferred function 5 从上面的输出可以理解虽然执行 defer 语句后的a值发生了变化10但实际的延迟函数调用printA(a)仍然打印5。 延迟堆栈 当一个函数有多个延迟调用时它们会被压入堆栈并按后进先出LIFO顺序执行。 我们将编写一个小程序使用延迟堆栈反向打印字符串。 package mainimport ( fmt )func main() { name : Naveenfmt.Printf(Original String: %s\n, string(name))fmt.Printf(Reversed String: )for _, v : range name {defer fmt.Printf(%c, v)} }Run in playground 在上面的程序中使用for range循环迭代字符串并调用defer fmt.Printf(%c, v)这些延迟调用将被添加到堆栈中。 上图表示添加 defer 调用后堆栈的内容。堆栈是后进先出的数据结构。最后压入堆栈的 defer 调用将首先被拉出并执行。在这种情况下defer fmt.Printf(%c, n)将首先执行因此字符串将以相反的顺序打印。 该程序将输出 Original String: Naveen Reversed String: neevaN 延迟的实际使用 到目前为止我们看到的代码示例并未显示 defer 的实际用途。在本节中我们将研究 defer 的一些实际用途。 Defer 用于无论代码流如何都应该执行函数调用的地方。让我们通过使用WaitGroup的程序示例来理解这一点。我们将首先编写不使用 defer 的程序然后修改它以使用 defer 并了解 defer 有多么有用。 package mainimport ( fmtsync )type rect struct { length intwidth int }func (r rect) area(wg *sync.WaitGroup) { if r.length 0 {fmt.Printf(rect %vs length should be greater than zero\n, r)wg.Done()return}if r.width 0 {fmt.Printf(rect %vs width should be greater than zero\n, r)wg.Done()return}area : r.length * r.widthfmt.Printf(rect %vs area %d\n, r, area)wg.Done() }func main() { var wg sync.WaitGroupr1 : rect{-67, 89}r2 : rect{5, -67}r3 : rect{8, 9}rects : []rect{r1, r2, r3}for _, v : range rects {wg.Add(1)go v.area(wg)}wg.Wait()fmt.Println(All go routines finished executing) }Run in playground 在上面的程序中我们创建了一个rect结构体和area的方法。此方法检查矩形的长度和宽度是否小于零。如果是则打印相应的消息否则打印矩形的面积。 该main函数创建 3 个类型为rect的变量。然后将它们添加到rects 的切片中。 然后使用循环迭代该切片并在第 37 行中将area方法作为并发调用。37. WaitGroup用于确保 main 函数被阻塞直到所有 Goroutines 执行完毕。此 WaitGroup 作为参数传递给方法并且调用wg.Done()方法通知主函数 Goroutine 已完成其工作。如果您仔细观察您会发现调用*wg.Done()*发生在区域方法返回之前。 无论代码流采用的路径如何都应在方法返回之前调用 wg.Done()因此这些调用可以有效地由多个调用替换单个调用 在下面的程序中我们删除了wg.Done()上面程序中的 3 个调用并将其替换为defer wg.Done()的单个调用。这使得代码更加简单易懂。 package mainimport ( fmtsync )type rect struct { length intwidth int }func (r rect) area(wg *sync.WaitGroup) { defer wg.Done()if r.length 0 {fmt.Printf(rect %vs length should be greater than zero\n, r)return}if r.width 0 {fmt.Printf(rect %vs width should be greater than zero\n, r)return}area : r.length * r.widthfmt.Printf(rect %vs area %d\n, r, area) }func main() { var wg sync.WaitGroupr1 : rect{-67, 89}r2 : rect{5, -67}r3 : rect{8, 9}rects : []rect{r1, r2, r3}for _, v : range rects {wg.Add(1)go v.area(wg)}wg.Wait()fmt.Println(All go routines finished executing) }Run in playground 该程序输出 rect {8 9}s area 72 rect {-67 89}s length should be greater than zero rect {5 -67}s width should be greater than zero All go routines finished executing 在上面的程序中使用 defer 还有一个优点。假设我们area使用新if条件向该方法添加另一个返回路径。如果调用wg.Done()没有延迟我们必须小心并确保我们调用wg.Done()这个新的返回路径。但由于调用wg.Done()被Defer我们不必担心向该方法添加新的返回路径。 本教程到此结束。祝你有美好的一天。
http://www.zqtcl.cn/news/344572/

相关文章:

  • 博客网站设计及说明wordpress 显示 列表
  • 佛山制作手机网站莆田自助建站软件
  • 建邺做网站价格网站做换肤
  • 佛山有什么网站室内装饰设计怎么样
  • 智能建站与正常的网站购买 做网站 客户
  • 哪个是网络营销导向网站建设的基础微信商城开店需要费用吗
  • 宁波住房和建设局网站首页福州有做网站引流的吗
  • 国外科技类网站戴尔网站建设
  • 视频播放网站模板洞泾做网站公司
  • 深圳大学网站建设中美军事最新消息
  • gta5可用手机网站大全佛山网站建设服务
  • 智能建站软件哪个好智慧城市建设评价网站
  • 做网站用什么配资电脑织梦做的网站织梦修改网页模板
  • 手机网站制作吧网店营销策略
  • 管理员修改网站的参数会对网站的搜效果产生什么影响?网站建设新闻+常识
  • WordPress主题没有删除网站优化 工具
  • 建设外贸商城网站制作外国网站域名在哪查
  • 青浦练塘网站建设关键词优化的策略有哪些
  • 做网站链接怎么弄上海万户网络技术有限公司
  • 嵌入字体的网站网站结构和布局区别
  • 莆田网站建设五维网络有限公司零基础网站开发要学多久
  • 重庆官方网站查询系统2020最近的新闻大事10条
  • 中国网站建设公司排行榜成都彩票网站建设
  • 网站域名解析失败个人推广网站
  • 东莞网站建设网络公司排名卓业网站建设
  • 建立自己的网站平台的好处高校英文网站建设
  • 大力推进网站集约化建设兰州优秀网站推广
  • 手机wap网站怎样从微信公众号打开辽宁省住房和城乡建设厅网站上不去
  • 网站建设备案 优帮云四川建设设计公司网站
  • dede网站搬家 空间转移的方法网站建设多少钱一个平台