go和java如何交互_⼀个java和golang(go语⾔)通信的例
⼦。
go语⾔是⼀个系统级语⾔,好处⾮常多。虽然是⼀个静态编译型语⾔,但可以像动态语⾔⼀样写程序,语⾔本⾝可以提供编写应⽤程序所需的基本组件,⽽不⽤引⼊第三⽅的包。如果了解c++、java、python等,会对其简洁和强⼤有更深的认识,c++实在过于繁琐,java也没有想象的简单,python的效率和go不是⼀个数量级的。那么多的特性,印象最深的就是其对并发的⽀持,优雅⽽⾼效。⼀般情况下并发通过进程、线程、基于异步IO的回调来实现,进程和线程不能⼤量的创建,如超过1万个系统资源就不堪重负了,回调可以尽可能少的创建线程,但⽤法不太符合⾃然习惯,⽐如boost
的asio就是⼀个很好的处理并发的框架,使⽤得当可以写出⾼效优雅的服务器程序。⽽go则在语⾔级别⽀持协程,协程是⼀种轻量级线程,可以创建百万个⽽不会耗尽系统的资源。仅举⼀简单例⼦,go语⾔写的服务器程序会解析来⾃Java的json格式的数据,修改后返回:
go代码:
package main
import (
"fmt"
"net"
"encoding/json"
)
type Person struct{
Name string
Id int
Lks []string
}
func doServerStuff(conn net.Conn){
remote:=conn.RemoteAddr().String()
fmt.Println(remote," connected!")
for {
buf:=make([]byte,512)
size,err:=conn.Read(buf)
if err!=nil{
fmt.Println("Read Error:",err.Error());
return
}
//fmt.Println("data from client:",string(buf),"size:",size)
var person Person
err=json.Unmarshal(buf[:size],&person)
if err!=nil{
fmt.Println("Unmarshal Error:",err.Error());
return
}
fmt.Println("Person after Unmarshal:",person)
person.Id+=2
buf,err=json.Marshal(person)
if err!=nil{
fmt.Println("Marshal Error:",err.Error());
return
}
conn.Write(buf)
conn.Close()
break
}
}
func main(){
fmt.Println("Starting ")
listener,err:=net.Listen("tcp","0.0.0.0:50000")
if err!=nil{
fmt.Println("Listen Error:",err.Error())
go和java后端开发劣势return
}
for{
conn,err:=listener.Accept()
if err!=nil{
fmt.Println("Accept Error:",err.Error())
return
}
go doServerStuff(conn)
}
}
通过关键字go即可完成并发的处理 ,go语⾔的哲学就是引⼊尽可能少的关键字和特性,编写最少的代
码完成更多的功能,并且还提供了很好的⼯程管理和单元测试,⼀个go命令搞定⼀切,不需要任何类似Makefile或l或l(maven使⽤的)之类的项⽬⽂件。因此go语⾔的作者们认为,c++没什么好学的,值得学习的是c语⾔。
上⾯的代码中需要注意的是:
1.struct的变量名要⼤写
2.收到 socket的包之后要进⾏json解码,需传⼊实际的数据长度,如json.Unmarshal(buf[:size],&person) Java代码:
import java.*;
import java.io.*;
import net.sf.json.JSONObject;
public class JSonTest {
/**
* @param args
*/
private static Socket socket;
private static BufferedReader in;
private static PrintWriter out;
public static void main(String[] args) {
// TODO Auto-generated method stub
JSONObject jsonObj=new JSONObject();
jsonObj.put("Name","liangyongs");
jsonObj.put("Id", 31);
String[] likes={"java","golang","clang"};
jsonObj.put("Lks", likes);
System.out.println("Object before sending to golang side:");
System.out.println(jsonObj);
try{
socket=new Socket("127.0.0.1",50000);
in=new BufferedReader(new InputStream()));
out=new OutputStream(),true);
out.println(jsonObj);
String adLine();
System.out.println("Object read from golang side:");
jsonObj=JSONObject.fromObject(line);
System.out.("Id"));
socket.close();
}
catch(IOException e){
System.out.println(e);
}
}
}
这样可以传递任意数据,即使go语⾔⼀⽅,不按照Java传递的数据格式定义结构体,也可以解析出部分能对应出的字段,⽅便⽽简单。
go语⾔可以使⽤gdb调试,也可以直接嵌套C语⾔,所以不⽤担⼼⽀持go的库少,c语⾔可以搞定就⾏了,⽽且c的数据类型可以很容易的转换成go的数据类型,go也⽀持指针,⽀持goto,不久的将来可以
在编译器级别⽀持多核编程。
有疑问加站长联系(⾮本⽂作者)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论