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 的一个非常好的案例