一个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 the server...")
    listener,err:=net.Listen("tcp","0.0.0.0:50000")
    if err!=nil{
        fmt.Println("Listen Error:",err.Error())
                return
    }
    for{
                conn,err:=listener.Accept()
                if err!=nil{
                        fmt.Println("Accept Error:",err.Error())
                        return
        }
        go doServerStuff(conn)
    }
}
通过关键字go即可完成并发的处理 ,go语言的哲学就是引入尽可能少的关键字和特性,编写最少的代码完成更多的功能,并且还提供了很好的工程管理和单元测试,一个go命令搞定一切,不需要任何类似Makefile或build.xml或pom.xml(maven使用的) 之类的项目文件。因此go语言的作者们认为,c++没什么好学的,值得学习的是c语言。
上面的代码中需要注意的是:
1.struct的变量名要大写
2.收到 socket的包之后要进行json解码,需传入实际的数据长度,如json.Unmarshal(buf[:size],&person)

Java代码:
import java.net.*;
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 InputStreamReader(socket.getInputStream()));
            out=new PrintWriter(socket.getOutputStream(),true);
            out.println(jsonObj);
            String line=in.readLine();
            System.out.println("Object read from golang side:");
            jsonObj=JSONObject.fromObject(line);
            System.out.println(jsonObj.get("Id")); 
            socket.close();
        }
        catch(IOException e){
            System.out.println(e);
        }
    }
}
这样可以传递任意数据,即使go语言一方,不按照Java传递的数据格式定义结构体,也可以解析出部分能对应出的字段,方便而简单。
go语言可以使用gdb调试,也可以直接嵌套C语言,所以不用担心支持go的库少,c语言可以搞定就行了,而且c的数据类型可以很容易的转换成go的数据类型,go也支持指针,支持goto,不久的将来可以在编译器级别支持多核编程。
<think>嗯,用户想了解GolangJavaC语言之间的主要区别适用场景。首先,我需要回忆这三种语言的特点。C语言是古老的系统级语言,主要用于底层开发,比如操作系统嵌入式系统。GolangGoogle推出的,强调简洁并发,适合网络服务分布式系统。Java是面向对象的企业级语言,跨平台,有强大的生态系统。 接下来,用户可能需要知道它们在设计哲学上的差异。C注重效率硬件控制,手动内存管理。Java有JVM自动管理内存,面向对象,跨平台。Golang编译为本地代码,语法简洁,内置并发支持。 然后要比较性能。C最快,但需要手动优化。Golang性能接近C,但并发模型更好。Java由于JVM可能有启动延迟,但JIT优化后性能不错。引用中提到Golang在特定场景性能更好,但多数情况下与Java差异不大,需要指出这点。 语法方面,C的语法较基础,需要更多代码。Java较冗长,但结构化好。Golang简洁,比如没有类,用结构体方法。 并发模型是关键区别。C需要依赖线程库,Java有线程并发包,Golanggoroutinechannel,更轻量级。 内存管理方面,C手动,JavaGolang自动GC,但GC机制不同,Golang的GC更高效,延迟低。 生态系统部分,Java最丰富,适合企业应用。Golang的生态在云原生方面强,如DockerK8s。C的库底层,适合系统开发。 适用场景需要分情况讨论。C适合底层嵌入式。Java适合大型企业应用安卓。Golang适合高并发云服务。引用中的资料提到Golang适合高性能并发Java适合企业级应用,需要引用[^1][^3]。 最后,生成相关问题,可能涉及如何选择语言,具体场景下的性能比较,学习曲线等。确保问题覆盖用户可能关心的其他方面,比如内存管理细节或并发实现的例子。</think>### Golang vs Java vs C: 主要区别与适用场景 #### 1. **语言设计哲学** - **C语言**:面向过程,强调底层控制硬件操作,语法简洁但需要手动管理内存。 - **Java**:面向对象,基于JVM实现“一次编写,到处运行”,依赖垃圾回收机制[^2]。 - **Golang**:结合过程式与并发编程,语法极简,内置协程(goroutine)通道(channel)支持高并发。 #### 2. **性能对比** - **C语言**:直接编译为机器码,性能最高,但依赖开发者的优化能力。 - **Golang**:编译为本地代码,性能接近C语言,协程模型在高并发场景下效率显著[^3]。 - **Java**:通过JIT编译优化,长期运行性能接近本地代码,但启动延迟较高[^4]。 #### 3. **语法特性** - **C语言**:需手动管理指针内存,代码灵活性高但易出错,例如: ```c int* arr = (int*)malloc(10 * sizeof(int)); ``` - **Java**:强类型、面向对象,代码结构清晰但较冗长,例如: ```java public class Main { public static void main(String[] args) { List<Integer> list = new ArrayList<>(); } } ``` - **Golang**:语法类似C但更简洁,例如: ```go func main() { slice := make([]int, 0) } ``` #### 4. **并发模型** - **C语言**:依赖第三方库(如pthread)实现多线程,复杂性高。 - **Java**:通过`java.util.concurrent`包提供线程池锁机制。 - **Golang**:原生支持协程(goroutine),通过`go`关键字启动,例如: ```go go func() { fmt.Println("并发执行") }() ``` #### 5. **内存管理** - **C语言**:完全手动管理(`malloc/free`),易引发内存泄漏。 - **Java/Golang**:自动垃圾回收(GC),但Golang的GC延迟更低(通常<1ms)。 #### 6. **生态系统** - **C语言**:适用于操作系统、嵌入式开发,标准库功能有限。 - **Java**:企业级框架丰富(如Spring、Hibernate),安卓开发主流语言。 - **Golang**:云原生领域占优(如Docker、Kubernetes),适合微服务API开发[^3]。 #### 7. **适用场景** - **C语言**:操作系统内核、嵌入式系统、高性能计算。 - **Java**:大型企业应用、安卓应用、金融系统。 - **Golang**:高并发服务(如实时通信)、云平台工具、分布式系统。 ---
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值