”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 如何使用 Go 构建简单的 Mac 应用程序

如何使用 Go 构建简单的 Mac 应用程序

发布于2024-07-29
浏览:576

我几年前开始使用 DarwinKit,因为 Go 没有与本机 Mac API 的绑定。我们慢慢地将项目转变为绑定和生成工具,以便有一天能够完全覆盖所有 Apple API。上周发布的 v0.5.0 是该项目迄今为止规模最大的:

  • 33 个框架的绑定,几乎完全覆盖:
    • 2,353 课程
    • 23,822方法和属性
    • 9,519 常量/枚举
    • 543 结构体
  • API 中 Go 原生内置类型的自动转换和使用
  • 支持块参数作为具有正确类型参数的 Go 函数
  • 预制委托实现,您可以简单地在
  • 上设置 Go 函数
  • 到 Objective-C 符号的一对一映射,同时仍然是 Go 的惯用语
  • 所有符号的文档,包括有关该符号的 Apple 官方文档的链接
  • 为赞助商提供的高质量示例入门应用程序不断增多

Demo Screenshots

这是一个使用 DarwinKit 在几行 Go 中构建本机 webview 窗口应用程序的快速示例:

package main

import (
    "github.com/progrium/darwinkit/objc"
    "github.com/progrium/darwinkit/macos"
    "github.com/progrium/darwinkit/macos/appkit"
    "github.com/progrium/darwinkit/macos/foundation"
    "github.com/progrium/darwinkit/macos/webkit"
)

func main() {
    // runs macOS application event loop with a callback on success
    macos.RunApp(func(app appkit.Application, delegate *appkit.ApplicationDelegate) {
        app.SetActivationPolicy(appkit.ApplicationActivationPolicyRegular)
        app.ActivateIgnoringOtherApps(true)

        url := foundation.URL_URLWithString("https://github.com/sponsors/darwinkitdev")
        req := foundation.NewURLRequestWithURL(url)
        frame := foundation.Rect{Size: foundation.Size{1440, 900}}

        config := webkit.NewWebViewConfiguration()
        wv := webkit.NewWebViewWithFrameConfiguration(frame, config)
        wv.LoadRequest(req)

        w := appkit.NewWindowWithContentRectStyleMaskBackingDefer(frame,
            appkit.ClosableWindowMask|appkit.TitledWindowMask,
            appkit.BackingStoreBuffered, false)
        objc.Retain(&w)
        w.SetContentView(wv)
        w.MakeKeyAndOrderFront(w)
        w.Center()

        delegate.SetApplicationShouldTerminateAfterLastWindowClosed(func(appkit.Application) bool {
            return true
        })
    })
}

在不到 40 行的时间内,我们制作了一个原生 Mac 应用程序,无需打开 XCode 或使用 Objective-C。我认为这可能是目前 Apple API 最好的绑定项目。甚至可能是在 Mac 上制作小型实用程序的最佳方式。很快甚至还有其他 Apple 设备。

未来

DarwinKit 缺少一大块:没有与 Apple 框架 函数 的绑定。幸运的是,大多数框架都是用 OOP 构建的,目前我们有很好的绑定。但有些框架,尤其是底层框架,大部分都是函数。虽然有一个涉及使用 CGO 的解决方法(DarwinKit 试图帮助您避免),但我们正在努力为每个框架函数生成本机 Go 函数绑定。

我们正在努力的另一件大事是让 DarwinKit 完全不使用 CGO!使用 purego,我们可以调用 Apple 框架,而无需涉及 CGO。这将缩短构建时间,生成更小的二进制文件,并允许在出于任何原因需要避免 CGO 的程序中使用 DarwinKit。

对于 iOS 和移动开发人员来说,我真的很想让它适用于 iOS。事实上,它已经应该了!但我们现在为 MacOS 生成绑定。如果有人想帮助将其引入 iOS,让人们可以使用 Go 制作 Apple 移动应用程序,请联系我们!

在那之前,请尝试使用我们目前拥有的内容构建一个应用程序。让我知道事情的后续!

版本声明 本文转载于:https://dev.to/progrium/how-i-build-simple-mac-apps-using-go-104j?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • Python高效去除文本中HTML标签方法
    Python高效去除文本中HTML标签方法
    在Python中剥离HTML标签,以获取原始的文本表示Achieving Text-Only Extraction with Python's MLStripperTo streamline the stripping process, the Python standard librar...
    编程 发布于2025-05-01
  • input: How Can I Automatically Drop All Overloads of a PostgreSQL Function?

output: PostgreSQL函数所有重载自动删除方法
    input: How Can I Automatically Drop All Overloads of a PostgreSQL Function? output: PostgreSQL函数所有重载自动删除方法
    没有参数知识 在文本文件中使用“创建或替换” syntax中的功能集合时,它可以在syntax上添加syntax,它可以在启动和删除parameters添加parameters添加或添加parameTers时,它会变得乏味。由于需要在删除函数时以确切顺序指定每个参数类型的原因。要简化此过程,请考虑...
    编程 发布于2025-05-01
  • 为什么HTML无法打印页码及解决方案
    为什么HTML无法打印页码及解决方案
    无法在html页面上打印页码? @page规则在@Media内部和外部都无济于事。 HTML:Customization:@page { margin: 10%; @top-center { font-family: sans-serif; font-weight: bo...
    编程 发布于2025-05-01
  • 如何检查对象是否具有Python中的特定属性?
    如何检查对象是否具有Python中的特定属性?
    方法来确定对象属性存在寻求一种方法来验证对象中特定属性的存在。考虑以下示例,其中尝试访问不确定属性会引起错误: >>> a = someClass() >>> A.property Trackback(最近的最新电话): 文件“ ”,第1行, attributeError:SomeClass实...
    编程 发布于2025-05-01
  • 如何使用Python有效地以相反顺序读取大型文件?
    如何使用Python有效地以相反顺序读取大型文件?
    在python 中,如果您使用一个大文件,并且需要从最后一行读取其内容,则在第一行到第一行,Python的内置功能可能不合适。这是解决此任务的有效解决方案:反向行读取器生成器 == ord('\ n'): 缓冲区=缓冲区[:-1] ...
    编程 发布于2025-05-01
  • Java中Lambda表达式为何需要“final”或“有效final”变量?
    Java中Lambda表达式为何需要“final”或“有效final”变量?
    Lambda Expressions Require "Final" or "Effectively Final" VariablesThe error message "Variable used in lambda expression shou...
    编程 发布于2025-05-01
  • 通过循环增量使字符串成为子序列
    通过循环增量使字符串成为子序列
    2825。使用循环增量使字符串成为子序列 [2 [2 您得到了两个 0- indexed strings str1 and str2。 在str1中的索引的设置递增到下一个字符循环返回如果可以通过执行操作,以及false否则,将str2成为str1的子序列。 注意:字符串的子序列是一个新的字符串...
    编程 发布于2025-05-01
  • Java是否允许多种返回类型:仔细研究通用方法?
    Java是否允许多种返回类型:仔细研究通用方法?
    在Java中的多个返回类型:一种误解类型:在Java编程中揭示,在Java编程中,Peculiar方法签名可能会出现,可能会出现,使开发人员陷入困境,使开发人员陷入困境。 getResult(string s); ,其中foo是自定义类。该方法声明似乎拥有两种返回类型:列表和E。但这确实是如此吗...
    编程 发布于2025-05-01
  • 如何简化PHP中的JSON解析以获取多维阵列?
    如何简化PHP中的JSON解析以获取多维阵列?
    php 试图在PHP中解析JSON数据的JSON可能具有挑战性,尤其是在处理多维数组时。 To simplify the process, it's recommended to parse the JSON as an array rather than an object.To do...
    编程 发布于2025-05-01
  • 在细胞编辑后,如何维护自定义的JTable细胞渲染?
    在细胞编辑后,如何维护自定义的JTable细胞渲染?
    在JTable中维护jtable单元格渲染后,在JTable中,在JTable中实现自定义单元格渲染和编辑功能可以增强用户体验。但是,至关重要的是要确保即使在编辑操作后也保留所需的格式。在设置用于格式化“价格”列的“价格”列,用户遇到的数字格式丢失的“价格”列的“价格”之后,问题在设置自定义单元格...
    编程 发布于2025-05-01
  • 左连接为何在右表WHERE子句过滤时像内连接?
    左连接为何在右表WHERE子句过滤时像内连接?
    左JOIN CONUNDRUM:WITCHING小时在数据库Wizard的领域中变成内在的加入很有趣,当将c.foobar条件放置在上面的Where子句中时,据说左联接似乎会转换为内部连接。仅当满足A.Foo和C.Foobar标准时,才会返回结果。为什么要变形?关键在于其中的子句。当左联接的右侧值...
    编程 发布于2025-05-01
  • 反射动态实现Go接口用于RPC方法探索
    反射动态实现Go接口用于RPC方法探索
    在GO 使用反射来实现定义RPC式方法的界面。例如,考虑一个接口,例如:键入myService接口{ 登录(用户名,密码字符串)(sessionId int,错误错误) helloworld(sessionid int)(hi String,错误错误) } 替代方案而不是依靠反射...
    编程 发布于2025-05-01
  • 如何将来自三个MySQL表的数据组合到新表中?
    如何将来自三个MySQL表的数据组合到新表中?
    mysql:从三个表和列的新表创建新表 答案:为了实现这一目标,您可以利用一个3-way Join。 选择p。*,d.content作为年龄 来自人为p的人 加入d.person_id = p.id上的d的详细信息 加入T.Id = d.detail_id的分类法 其中t.taxonomy =...
    编程 发布于2025-05-01
  • 如何干净地删除匿名JavaScript事件处理程序?
    如何干净地删除匿名JavaScript事件处理程序?
    删除匿名事件侦听器将匿名事件侦听器添加到元素中会提供灵活性和简单性,但是当要删除它们时,可以构成挑战,而无需替换元素本身就可以替换一个问题。 element? element.addeventlistener(event,function(){/在这里工作/},false); 要解决此问题,请考虑...
    编程 发布于2025-05-01

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3