为了账号安全,请及时绑定邮箱和手机立即绑定

评估来自 gomobile 绑定的 nil 值

评估来自 gomobile 绑定的 nil 值

Go
拉风的咖菲猫 2021-11-08 16:01:49
在 Android Java 中评估Go函数的nil返回值的正确方法是什么?这是我尝试过的:// ExportedGoFunction returns a pointer to a GoStruct or nil in case of failfunc ExportedGoFunction() *GoStruct {  return nil}然后我使用以下命令通过 gomobile 生成一个 .aar 文件:gomobile bind -v --target=android在我的 Java 代码中,我尝试将nil评估为null,但它不起作用。Java代码:GoLibrary.GoStruct goStruct = GoLibrary.ExportedGoFunction();if (goStruct != null) {   // This block should not be executed, but it is   Log.d("GoLog", "goStruct is not null");}免责声明:go 库中的其他方法完美无缺
查看完整描述

2 回答

?
哆啦的时光机

TA贡献1779条经验 获得超6个赞

为了将来可能的参考,截至2015 年 9 月,我提出了两种处理问题的方法。


第一个是从Go代码返回一个错误并在Java 中尝试/捕获错误。下面是一个例子:


// ExportedGoFunction returns a pointer to a GoStruct or nil in case of fail

func ExportedGoFunction() (*GoStruct, error) {

   result := myUnexportedGoStruct()

   if result == nil {

      return nil, errors.New("Error: GoStruct is Nil")

   }


   return result, nil

}

然后尝试/捕获Java 中的错误


try {

   GoLibrary.GoStruct myStruct = GoLibrary.ExportedGoFunction();

catch (Exception e) {

   e.printStackTrace(); // myStruct is nil   

}

这种方法既是惯用的Go又是Java,但即使它可以防止程序崩溃,它最终也会使用 try/catch 语句使代码膨胀,并导致更多的开销。


因此,基于用户@SnoProblem回答解决它的非惯用方法并正确处理我想出的空值是:


// NullGoStruct returns false if value is nil or true otherwise

func NullGoStruct(value *GoStruct) bool {

    return (value == nil) 

}

然后检查Java中的代码,如:


GoLibrary.GoStruct value = GoLibrary.ExportedGoFunction();

if (GoLibrary.NullGoStruct(value)) {

   // This block is executed only if value has nil value in Go

   Log.d("GoLog", "value is null");

}


查看完整回答
反对 回复 2021-11-08
?
万千封印

TA贡献1891条经验 获得超3个赞

查看 go mobile 的测试包,看起来您需要将空值转换为类型。


从 SeqTest.java 文件:


 public void testNilErr() throws Exception {

    Testpkg.Err(null); // returns nil, no exception

  }

编辑:也是一个非例外示例:


byte[] got = Testpkg.BytesAppend(null, null);

assertEquals("Bytes(null+null) should match", (byte[])null, got);

got = Testpkg.BytesAppend(new byte[0], new byte[0]);

assertEquals("Bytes(empty+empty) should match", (byte[])null, got);

它可能很简单:


GoLibrary.GoStruct goStruct = GoLibrary.ExportedGoFunction();

if (goStruct != (GoLibrary.GoStruct)null) {

   // This block should not be executed, but it is

   Log.d("GoLog", "goStruct is not null");

}

编辑:实用方法的建议:


您可以向库中添加一个实用程序函数来为您提供键入的nil值。


func NullVal() *GoStruct {

    return nil

}

仍然有点hacky,但它应该比多个包装器和异常处理更少的开销。


查看完整回答
反对 回复 2021-11-08
  • 2 回答
  • 0 关注
  • 175 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信