On this page
    
    
                                                
                                                article
                                                
                                                
                                            
                                                
                                            
                                            Fyne-趣味整活项目
全部代码
package main
import (
 "time"
 "fyne.io/fyne/v2"
 "fyne.io/fyne/v2/app"
 "fyne.io/fyne/v2/container"
 "fyne.io/fyne/v2/dialog"
 "fyne.io/fyne/v2/widget"
)
func main() {
 // 创建一个 Fyne 应用
 a := app.New()
 // 创建一个窗口
 customFont := fyne.NewStaticResource("NotoSansHans.ttf", loadFont("NotoSansHans-Regular.ttf"))
 a.Settings().SetTheme(&myTheme{font: customFont})
 win := a.NewWindow("高端检测器")
 // 创建一个按钮
 btn := widget.NewButton("检测是否开机", func() {
  // 创建一个进度条
  progress := widget.NewProgressBarInfinite()
  progressContainer := container.NewVBox(progress)
  // 显示加载动画
  loadingDialog := dialog.NewCustom("正在检测...", "取消", progressContainer, win)
  loadingDialog.Show()
  // 模拟加载时间
go func(){
 time.Sleep(10 * time.Second) // 10 秒模拟加载时间
 // 关闭加载动画并弹出结果窗口
 loadingDialog.Hide()
 dialog.ShowInformation("结果", "电脑是开机的", win)
}()
 })
 // 设置窗口内容
 win.SetContent(container.NewVBox(btn))
 win.Resize(fyne.Size{Width: 400, Height: 200})
 win.CenterOnScreen()
 win.ShowAndRun()
}
      Go goroutine 简单概念
Goroutine 是 Go 语言中的一种轻量级线程, 由 Go 运行时管理。Goroutine 使得并发编程变得更加简单和高效,可以通过关键字 go 启动。
当然, 每一个并发执行的活动称为goroutine。当一个程序启动时, 只有一个goroutine来调用main函数, 称之为主goroutine。
特点
- 
轻量级:
- Goroutine 非常轻量级, 可以在同一个程序中启动成千上万个 Goroutine, 而不会造成过多的内存开销。
 
 - 
易于使用:
- 只需在函数调用前加上 
go关键字, 即可启动一个新的 Goroutine。 
 - 只需在函数调用前加上 
 - 
并发执行:
- Goroutine 可以并发执行, 不同的 Goroutine 之间可以独立运行, 互不干扰。
 
 - 
调度器管理:
- Go 运行时会自动管理 Goroutine 的调度, 充分利用多核处理器的优势。
 
 
Goroutine 示例
以下是一个简单的 Goroutine 示例:
package main
import (
 "fmt"
 "time"
)
func sayHello() {
 for i := 0; i < 5; i++ {
  fmt.Println("Hello")
  time.Sleep(1 * time.Second)
 }
}
func main() {
 go sayHello() // 启动一个新的 Goroutine 执行 sayHello 函数
 // 主 Goroutine 继续执行其他代码
 for i := 0; i < 5; i++ {
  fmt.Println("World")
  time.Sleep(1 * time.Second)
 }
 // 等待 sayHello 函数执行完成
 time.Sleep(6 * time.Second)
}
      输出情况:
由于 sayHello 函数在一个新的 goroutine 中执行, 而 main 函数继续执行, 两个函数的输出将会交错在一起。具体的输出可能会有所不同, 有可能是如下面这样
  World
Hello
World
Hello
...
  
  而Up主的案例是这样。
  World
Hello
Hello
World
World
Hello
Hello
World
World
Hello
  
  上文这就是 Goroutine 的一个非常好的案例