Golang编译为WASM在浏览器端运行时读取CSV返回空数组问题
问题根因
读取结果为空的核心问题出在Go侧包装函数的字节复制逻辑:
你声明的dst是长度为0的nil切片,而js.CopyBytesToGo不会自动为目标切片扩容,仅会复制目标切片当前长度可容纳的字节数。由于初始dst长度为0,实际从JS侧Uint8Array复制到Go侧的字节数为0,传入GetSprints的inputFile是空切片,csv.NewReader读取空字节流自然返回空数组。
修复方案
在调用js.CopyBytesToGo前,先根据JS侧传入的Uint8Array的实际长度初始化Go切片,保证目标切片有足够空间容纳全部文件字节,修改后的包装函数代码如下:
// userstory.go func getSprintsWrapper() js.Func { getSprintsFunc := js.FuncOf(func(this js.Value, args []js.Value) interface{} { // 入参合法性校验,避免传参错误触发panic if len(args) < 1 || args[0].Type() != js.TypeObject || args[0].Get("length").IsUndefined() { // 可根据业务需求返回结构化错误给JS侧 return nil } // 按JS侧Uint8Array的实际长度分配Go侧切片空间 fileLen := args[0].Get("length").Int() dst := make([]byte, fileLen) // 执行字节复制 js.CopyBytesToGo(dst, args[0]) return GetSprints(dst) }) return getSprintsFunc }
额外注意:WASM运行在浏览器沙箱中,不要使用log.Fatal这类会直接终止进程的调用,否则会直接导致整个WASM模块崩溃,建议出错时将错误信息封装为JS值返回给前端处理。
相关实现说明
Go编译为WASM在浏览器端解析本地文件是非常成熟的用法,除CSV解析外,Excel处理、图片编解码、大日志分析等场景都有大量落地实现。整体逻辑和你当前的方案一致:从JS侧File对象拿到ArrayBuffer转Uint8Array传入Go侧,复制字节流后直接用Go原生的各类解析库处理字节内容即可,不需要额外适配特殊的文件系统API。
内容的提问来源于stack exchange,提问作者Fabrizio Armango
相关产品推荐
相关产品推荐

