这篇转载的文章我运行不起来???尴尬,报的异常原文下面有评论,但是我还是无法解决

panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xc0000005 code=0x0 addr=0x0 pc=0x61ae2e]

goroutine 1 [running, locked to thread]:
main.main()
 

导言:

  • 本人(海东喵) 学过一堆 第三方桌面GUI库,但是那些库不是 BUG一堆,就是 功能有很大的欠缺
  • 今天我要推荐给大家的这款是以 Windows API 做的 GUI库,他的 性能功能都很完美目前没有太大的缺陷
  • 我研究了将近 3个月 了,发现功能上很接近 C# winform 了,所以开始写教程分享给想学GUI的同学。

前置安装:


 

go get github.com/akavel/rsrc
go get github.com/lxn/win
go get github.com/lxn/walk

代码实例:


 

package main

import (
    "syscall"

    "github.com/lxn/walk"
    "github.com/lxn/win"
)

func main() {
    window, _ := walk.NewMainWindow()

    // 设置窗体标题
    window.SetTitle(`你好世界!`)

    // 设置窗体的宽高
    window.SetWidth(400)
    window.SetHeight(400)

    // 设置窗体生成在屏幕的正中间
    // 窗体横坐标 = ( 屏幕宽度 - 窗体宽度 ) / 2
    // 窗体纵坐标 = ( 屏幕高度 - 窗体高度 ) / 2
    window.SetX((int(win.GetSystemMetrics(0)) - window.Width()) / 2)
    window.SetY((int(win.GetSystemMetrics(1)) - window.Height()) / 2)

    // 设置窗体为显示状态(默认:隐藏状态)
    window.Show()

    // 运行窗体
    window.Run()
}

创建清单文件 main.manifest


文件说明:

  • main.manifest应用程序配置元数据清单文件(不懂可以绕过,不用去理解也行)
  • main.manifest 保存在 main.go同级目录下
  • 直接复制 “文件内容” 即可,没特殊情况不用修改

文件内容:

 

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <assemblyIdentity version="1.0.0.0" processorArchitecture="*" name="SomeFunkyNameHere" type="win32"/>
    <dependency>
        <dependentAssembly>
            <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*"/>
        </dependentAssembly>
    </dependency>
    <application xmlns="urn:schemas-microsoft-com:asm.v3">
        <windowsSettings>
            <dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2, PerMonitor</dpiAwareness>
            <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">True</dpiAware>
        </windowsSettings>
    </application>
</assembly>

生成 / 编译:


第一步:将 main.manifest 生成为 main.syso

  • 这个步骤只需要运行一次, 调试/编译 只需一直执行 第二步
  • 生成的 main.syso可以拿到别的 GUI 项目中使用的
  • 除非你想修改 main.manifest 或者 图标文件 才要重新生成一次
  • 在当前窗口下 打开 cmd,运行如下命令:

 

rsrc -manifest main.manifest -o main.syso

备注:如果找不到rsrc命令,请在github.com\akavel\rsrc目录下执行go build,并将生成的rsrc.exe放入到GOROOT/bin目录下

第二步:编译成独立的 exe 文件

  • 不管 调试 还是 正式编译,都必须通过 双击 exe 文件运行,无法使用 go run main.go 直接运行
  • 调试:

 

go build
  • 正式编译:

 

go build -ldflags="-H windowsgui -w -s"

运行结果:


go语言核心编程 微盘 go语言gui编程_go语言核心编程 微盘

备注:直接使用go build生成exe后运行时会出现dos窗口,因为在编译的时候将编译窗口融合在了一起,因此在build的时候使用go build -ldflags="-H windowsgui" 这样就可以避免出现这种情况了。