包含golanglong的词条

本文目录一览:

如何Golang开发Android应用

如何Golang开发Android应用:

一丶准备

1.一台Linux 64的机器

2.一个带有AndroidStudioIDE的开发机器

因为环境配置实在复杂,所以引入的docker。

docker pull codeskyblue/docker-goandroid

docker run --rm -ti codeskyblue/docker-goandroid bash

cd example; echo "view example projects

docker起来之后,什么就都配置好了,NDK,java,GO的环境变量了,等等,并且还预装了vim,gradle,tmux,git,syncthing,svn

二丶代码

1.写代码之前,先约定下目录结构

go的代码都放在src/golib下,编译使用make.bash编译脚本,看下这个文件树

.

|-- app.iml

|-- build.gradle

|-- libs/armeabi-v7a # go编译生成的so文件

|               `-- libgojni.so

|-- main.go_tmpl # 一个模板文件,先不用管它

|-- make.bash # 编译脚本,用来生成.so和Java代码

`-- src

   |-- golib

   |   |-- hi

   |   |   |-- go_hi#1438;#1438;#1438; # 自动生成的代码

   |   |   |   `-- go_hi.go

   |   |   `-- hi.go # 需要编写的代码

   |   `-- main.go

   `-- main

       |-- AndroidManifest.xml

       |-- java

       |   |-- go # 自动生成的代码

       |   |   |-- Go.java

       |   |   |-- Seq.java

       |   |   `-- hi

       |   |       `-- Hi.java

       |   `-- me/shengxiang/gohello # 主要的逻辑代码

       |                      `-- MainActivity.java#1438;#1438;#1438;

       `-- res

2.写了一个例子

git clone

3.编译下,试试行不行(就算不行问题应该也不大,因为大问题都被消灭了)

cd GoHello/app

./make.bash

../gradlew build

4.一切顺利的话在build/outputs/apk下应该可以看到app-debug.apk这个文件。

编译好的放到qiniu上了,可以点击下载看看

下面可以尝试改改

打开hi.go这个文件

hi.go的内容,比较简单,写Go代码主要就是这部分

// Package hi provides a function for saying hello.

package hi

import "fmt"

func Hello(name string) {

   fmt.Printf("Hello, %s!\n", name)

   return "(Go)World"

}

5.文件末尾添加下面这行代码

func Welcome(name string) string {

   return fmt.Sprintf("Welcome %s to the go world", name)

}

使用./make.bash重新编译下

6.打开MainActivity.java 修改下OnClickListener事件

button.setOnClickListener(new View.OnClickListener() {

       @Override

       public void onClick(View v) {

           String message = Hi.Welcome("yourname");

           Toast.makeText(MainActivity.this, message, Toast.LENGTH_LONG).show();

       }

   });

编译运行下,把生成的apk安装到手机上试试。

如何在golang 中调用c的静态库或者动态库

Cgo 使得Go程序能够调用C代码. cgo读入一个用特别的格式写的Go语言源文件, 输出Go和C程序, 使得C程序能打包到Go语言的程序包中.

举例说明一下. 下面是一个Go语言包, 包含了两个函数 -- Random 和 Seed -- 是C语言库中random和srandom函数的马甲.

package rand

/*

#include stdlib.h

*/ import "C" func Random() int { return int(C.random()) } func Seed(i int) { C.srandom(C.uint(i)) }

我们来看一下这里都有什么内容. 开始是一个包的导入语句.

rand包导入了"C"包, 但你会发现在Go的标准库里没有这个包. 那是因为C是一个"伪包", 一个为cgo引入的特殊的包名, 它是C命名空间的一个引用.

rand 包包含4个到C包的引用: 调用 C.random和C.srandom, 类型转换 C.uint(i)还有引用语句.

Random函数调用libc中的random函数, 然后回返结果. 在C中, random返回一个C类型的长整形值, cgo把它轮换为C.long. 这个值必需转换成Go的类型, 才能在Go程序中使用. 使用一个常见的Go类型转换:

func Random() int { return int(C.random()) }

这是一个等价的函数, 使用了一个临时变量来进行类型转换:

func Random() int { var r C.long = C.random() return int(r) }

Seed函数则相反. 它接受一个Go语言的int类型, 转换成C语言的unsigned int类型, 然后传递给C的srandom函数.

func Seed(i int) { C.srandom(C.uint(i)) }

需要注意的是, cgo中的unsigned int类型写为C.uint; cgo的文档中有完整的类型列表.

这个例子中还有一个细节我们没有说到, 那就是导入语句上面的注释.

/*

#include stdlib.h

*/ import "C"

Cgo可以识别这个注释, 并在编译C语言程序的时候将它当作一个头文件来处理. 在这个例子中, 它只是一个include语句, 然而其实它可以是使用有效的C语言代码. 这个注释必需紧靠在import "C"这个语句的上面, 不能有空行, 就像是文档注释一样.

Strings and things

与Go语言不同, C语言中没有显式的字符串类型. 字符串在C语言中是一个以0结尾的字符数组.

Go和C语言中的字符串转换是通过C.CString, C.GoString,和C.GoStringN这些函数进行的. 这些转换将得到字符串类型的一个副本.

下一个例子是实现一个Print函数, 它使用C标准库中的fputs函数把一个字符串写到标准输出上:

package print // #include stdio.h // #include stdlib.h import "C" import "unsafe" func Print(s string) { cs := C.CString(s) C.fputs(cs, (*C.FILE)(C.stdout)) C.free(unsafe.Pointer(cs)) }

在C程序中进行的内存分配是不能被Go语言的内存管理器感知的. 当你使用C.CString创建一个C字符串时(或者其它类型的C语言内存分配), 你必需记得在使用完后用C.free来释放它.

调用C.CString将返回一个指向字符数组开始处的指错, 所以在函数退出前我们把它转换成一个unsafe.Pointer(Go中与C的void 等价的东西), 使用C.free来释放分配的内存. 一个惯用法是在分配内存后紧跟一个defer(特别是当这段代码比较复杂的时候), 这样我们就有了下面这个Print函数:

func Print(s string) { cs := C.CString(s) defer C.free(unsafe.Pointer(cs)) C.fputs(cs, (*C.FILE)(C.stdout)) }

构建 cgo 包

如果你使用goinstall, 构建cgo包就比较容易了, 只要调用像平常一样使用goinstall命令, 它就能自动识别这个特殊的import "C", 然后自动使用cgo来编译这些文件.

如果你想使用Go的Makefiles来构建, 那在CGOFILES变量中列出那些要用cgo处理的文件, 就像GOFILES变量包含一般的Go源文件一样.

rand包的Makefile可以写成下面这样:

include $(GOROOT)/src/Make.inc

TARG=goblog/rand

CGOFILES=\ rand.go\ include $(GOROOT)/src/Make.pkg

然后输入gomake开始构建.

更多 cgo 的资源

cgo的文档中包含了关于C伪包的更多详细的说明, 以及构建过程. Go代码树中的cgo的例子给出了更多更高级的用法.

一个简单而又符合Go惯用法的基于cgo的包是Russ Cox写的gosqlite. 而Go语言的网站上也列出了更多的的cgo包.

最后, 如果你对于cgo的内部是怎么运作这个事情感到好奇的话, 去看看运行时包的cgocall.c文件的注释吧.

golang json:怎么替代yaml:

安装EasyDataTransform在Mac上就可以解决。

安装EasyDataTransform在Mac上,开始轻松的数据转换,将要显示重复项的Excel电子表格拖到EasyDataTransform上。将添加一个粉红色的输入项请注意右侧窗格中的JSON数据已自动“展平”到表格中。

您可以将右窗格中的Format下拉菜单设置为Long或Wide,具体取决于您希望表格具有更多行还是更多列,确保选择了粉红色的输入项,单击左窗格中的ToFile按钮,将出现一个窗口。设置新文件名和位置。选择YAML文件作为文件类型。添加并选择了一个绿色输出项。YAML文件会立即创建,无需“运行”任何内容您可以在右侧窗格中更改YAML文件编码。

本文链接:https://my.lmcjl.com/post/19740.html

展开阅读全文

4 评论

留下您的评论.