小编xrf*_*ang的帖子

go 1.16:如何在 go:embed 中使用带前缀

我有一个VueJS用于提供 Web 界面的 go 项目。在构建项目时,我首先使用npm run build编译前端代码,该代码是在gui/dist我的项目目录下生成的。然后我使用此代码来提供静态内容:

//go:embed gui/dist/*
var dist embed.FS

gui := http.FileServer(http.FS(dist))
http.Handle("/", gui)
http.HandleFunc("/api/", func(w http.ResponseWriter, r *http.Request) {
    msg := fmt.Sprintf("TODO: %s", r.URL)
    http.Error(w, msg, http.StatusNotImplemented)
})

svr := http.Server{
    Addr:         fmt.Sprintf(":%v", cf.HTTPPort),
    ReadTimeout:  time.Minute,
    WriteTimeout: time.Minute,
}
assert(svr.ListenAndServe())
Run Code Online (Sandbox Code Playgroud)

问题是,在浏览器中打开站点时,它显示了一个浏览文件界面,即以gui开头,然后进入dist,然后显示该index.html文件,该文件是一个空白页面,因为它需要诸如 之类的文件/css/...,而go Web 服务器在/gui/dist/css/....

我尝试使用http.StripPrefix()但显然它不是为了处理这种情况,或者我没有正确使用它:

http.Handle("/", http.StripPrefix("/gui/dist", gui))
Run Code Online (Sandbox Code Playgroud)

这生成了一个404 page not found.

embed go

9
推荐指数
1
解决办法
821
查看次数

是否可以检测 writer 是否为 tty?

Bash 有一个“神奇的行为”,如果你输入“ls”,通常你会得到彩色的输出,但是如果你将输出重定向到一个文件,颜色代码就会消失。如何使用Go实现这种效果。例如使用以下语句:

fmt.Println("\033[1;34mHello World!\033[0m")
Run Code Online (Sandbox Code Playgroud)

我可以看到彩色文本,但如果我将输出通过管道传输到文件,颜色将被保留,这不是我想要的。

顺便说一句,这个问题大多与Go无关,我只是想在我的Go程序中达到效果。

console colors go tty

9
推荐指数
2
解决办法
3171
查看次数

docker:启动容器时设置运行用户

我使用官方的 golang docker 映像来编译我的 go 程序,并将生成的可执行文件放在映射到我的主机目录的卷上。

问题是 docker 生成的文件属于 root:root,这非常烦人,因为我不想通过 sudo 运行我的脚本。

我搜索了使 docker 容器以非 root 身份运行的解决方案,但我发现的方法需要更改 Dockerfile 并将用户添加到映像中,例如

http://gbraad.nl/blog/non-root-user-inside-a-docker-container.html

有没有办法让docker容器以主机上的当前用户身份运行,即用户A运行此镜像将生成属于A:A的文件,用户B生成属于B:B的文件,而A和B都是用户在主机上定义(即卷所在的位置),而不需要通过 Dockerfile 将 A 和 B 添加到映像中?

docker

8
推荐指数
2
解决办法
9459
查看次数

Android:如何获取前台应用的进程ID

首先,请注意,这个问题是一样的一切“的Android应用前景”的问题,我就发现SO,请阅读:-)

我正在尝试使用 golang 编写一个供我自己使用的 android 应用程序,而不使用 android-sdk 或 ndk(这是关键点)。这很简单,只需使用golang编写一个http服务,为arm CPU编译它,瞧我的应用程序正在运行,只需访问http://localhost即可访问。

出于我的应用程序的目的,我需要知道当前正在运行的前台应用程序,以精确定义它:

  1. 前台应用程序是占据屏幕的应用程序,或具有“活动”的应用程序(请原谅我不是 android 开发人员)。

  2. 前台应用程序(例如服务)所依赖的任何东西都不是我感兴趣的。

  3. 如果手机已锁定/屏幕关闭,我希望解决方案告诉我没有前台应用程序。

而且由于我不使用任何 android,只是将手机视为 LINUX 机器,我希望该解决方案使用本机 LINUX 方式,例如通过检查 /proc,或调用任何已安装的 android 命令行工具(包括通过这些命令发送消息)线工具),但使用任何 SDK/NDK 方式,因此我必须使用 java 或将这些东西合并到我的应用程序中。

android go

7
推荐指数
1
解决办法
552
查看次数

SvelteKit 依赖 NodeJS 吗?

SvelteKit 为多页面应用程序提供了一个“骨架”,其中两个功能对我来说特别有趣:1)路由系统(src/routes);2)服务器端渲染。

我的问题是:SvelteKit 依赖 NodeJS 吗?我使用 Go 作为后端服务器,它与 VueJS 前端配合得很好。我只是简单地将 webpack(dist 文件夹)的输出复制到我的 go 源代码树并将其编译为单个可执行文件。

这适用于 SvelteKit 吗?

编辑

背景:我主要是一名 Go 程序员。在认识 Svelte 之前,我纯粹使用 Bootstrap + vanilla JS 进行前端开发。我尝试过VueJS,但放弃了。这个问题的目的是问:值得学习 SvelteKit 还是仅仅学习 Svelte?

换句话说,SSR 对我来说“很高兴拥有”。但是,如果“路由”架构没有 Node 就无法工作,那么我觉得我最好选择 Svelte,或者,还有其他选择 SvelteKit 的理由吗?

svelte sveltekit

7
推荐指数
1
解决办法
3661
查看次数

ffmpeg:如何重新采样音频文件

我需要将 44KHz立体声 m4a音频文件转换为 22KHz单声道 mp3 VBR 文件,如何在 Linux 终端上使用 ffmpeg 来做到这一点?谢谢。

audio ffmpeg

6
推荐指数
1
解决办法
1万
查看次数

是否可以通过使用 TinyGo 编译 Go 二进制文件来使其更小?

TinyGo主页称它是为微控制器(或 MCU)设计的。我想知道是否可以使用TinyGo将go编译成ARM/Linux系统的小二进制文件?

目前UPX --best --lzma,我的go代码编译成arm二进制文件大约1MB,我希望使它更小,因为系统存储有限。

go tinygo

5
推荐指数
1
解决办法
3626
查看次数

如何检查ffmpeg硬件加速状态

关于 ffmpeg 硬件加速的几个问题(我认为这与这个问题不是同一个问题):

  1. 如何判断我的 ffmpeg 版本是否支持硬件加速,以及它支持哪些加速功能?

  2. 从转码过程的输出中,我可以判断 ffmpeg 是否使用硬件加速吗?

  3. 我正在使用 ffmpeg 从摄像机中提取 H265 视频,并将其转换为 H264 HLS 块。现在的问题是转码过程过于占用CPU。我希望使用硬件加速。由于应用程序的原因,我无法使用昂贵的GPU,例如NVidia cuda平台。如果仅使用 CPU 自带的 Intel HD 显卡,转码 H265 => H264 时是否可以显着降低 CPU 使用率?预计性能增益是多少(%)?

谢谢。

ffmpeg hardware-acceleration

5
推荐指数
1
解决办法
2万
查看次数

如何通过 utc 偏移量加载位置

我想通过 UTC 偏移量加载位置,例如

func main() {
    L, err := time.LoadLocation("UTC+8")
    if err != nil {
        panic(err)
    }
    fmt.Println(L)
}
Run Code Online (Sandbox Code Playgroud)

代码出现恐慌:panic: unknown time zone UTC+8

如何通过 UTC 偏移量(不是本地也不是 UTC,而是另一个位置)获取位置对象,而不必以 IANA 时区格式指定,例如“America/New_York”

我的目的很简单:我有一个在固定位置运行的网络服务器,我可以轻松获取当地时间。现在我想根据访问者的位置(通过 url 参数发送,例如http://myserver.com/do_something?timezone=-8)进行时间计算。

timezone go

4
推荐指数
1
解决办法
1754
查看次数

Go 1.18 中的“any”类型是什么?

在 Visual Studio Code 中,自动完成工具(我猜是gopls?)提供以下模板:

m.Range(func(key, value any) bool {
    
})
Run Code Online (Sandbox Code Playgroud)

哪里m是 a sync.Map. 该类型any无法识别,但被放在那里。

什么是any?我可以放入我想要的类型并希望 Go 1.18 为我做隐式类型转换吗?例如:

m.Range(func(k, v string) { ... })
Run Code Online (Sandbox Code Playgroud)

这将给出k,v作为回调中的字符串,而不必自己进行类型转换?

generics go any

4
推荐指数
1
解决办法
2万
查看次数

忽略 JSON Marshal 上不支持的类型错误

这是我的代码:

func dump(w io.Writer, val interface{}) error {
    je := json.NewEncoder(w)
    return je.Encode(val)   
}

type example struct {
    Name string
    Func func() 
}

func main() {
    a := example{
        Name: "Gopher",
        Func: func() {},
    }
    err := dump(os.Stdout, a)
    if err != nil {
        panic(err)
    }
}
Run Code Online (Sandbox Code Playgroud)

该程序将恐慌 json: unsupported type: func()

我的问题是,如何将任何内容编码到 json 中,而忽略那些编码无法处理的内容。比如上面的数据结构,我希望输出是:{"Name": "Gopher"}

重要提示:转储funtion,它的值是一个interface{},也就是不知道是什么样的数据就会收到,所以小把戏,比如json:"-"不是我想要的。

如果传递给 dump() 的数据不可编组,例如dump(func(){}),只返回空字符串是完全可以接受的。

两年后编辑:

@TehSphinX 提供的答案有一段我想避免的代码:

func (s example) MarshalJSON() ([]byte, error) {
    return …
Run Code Online (Sandbox Code Playgroud)

json go

3
推荐指数
1
解决办法
8731
查看次数

iota 的确切含义是什么?

在下面的代码中:

const (
    signature uint32 = 0xae3179fb
    dhkxGroup = 2

    ReplySuccessful byte = iota
    ReplyBufferCorrupted
    ReplyDecryptFailed
    ReplySessionExpired
    ReplyPending
)
Run Code Online (Sandbox Code Playgroud)

ReplySuccessful被编译成2,而我认为它应该definitly是。如果我移动signaturedhkxGroup低于ReplyPending,则ReplySuccessful变为 0。

为什么是这样?

附注。对我来说,使用 iota 的唯一“好处”是您可以省略分配给以后常量的值,以便您可以轻松修改/插入新值。但是,如果 iota 没有固定为零,则可能会导致大问题,尤其是在执行诸如通信协议之类的事情时。

go iota

2
推荐指数
1
解决办法
106
查看次数