Go和Java的对比学习

对象

我们都知道java是一门面向对象的程序设计语言,它的主要思想就是类和对象;但是Go却不然,他并不是一门面向对象的语言,却有点和C语言相似,有点面向过程的意思。

那么Go语言能不能处理关于面向对象的问题呢,答案是肯定的。Go语言可以使用结构体来构建对象类型,从而实现面向对象的程序设计。

public class students {
	private String id;
	private String name;
	private String age;
	private String address;
	public students(){
	}
	public students(String id,String name,String age,String address) {
		this.id = id;
		this.name = name;
		this.age = age;
		this.address = address;
	}
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getAge() {
		return age;
	}
	public void setAge(String age) {
		this.age = age;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
}
public class manager {
	public static void main(String[] args) {
		students s = new students();
		s.setId("20185734");
		s.setName("msl");
		s.setAge("20");
		s.setAddress("shandong");
	}
}
type student struct {
   id string
   name string
   age string
   address string
}
func main(){
	var s student
	s.id = "20185734"
	s.name = "msl"
	s.age = "20"
	s.address = "shandong"
}

对于同样一个student类,java可以通过类的形式描述它的属性,然而golang需要用结构体来表示。另外,java可以通过private关键字限制对类里面元素的修改,安全性相对较高,但是运行效率会低。

指针

Go语言是有指针的,java则没有,例如在

type LinkNode struct {
    Data Elem
    Next *LinkNode
}

实现链表功能。

并发

Go 语言支持并发,我们只需要通过 go 关键字来开启 goroutine 即可。
goroutine 是轻量级线程,goroutine 的调度是由 Golang 运行时进行管理的。

在过程式编程中,当调用一个过程的时候,需要等待其执行完才返回。而调用一个协程的时候,不需要等待其执行完,会立即返回。协程十分轻量,Go语言可以在一个进程中执行有数以十万计的协程,依旧保持高性能。

package main

import (
        "fmt"
        "time"
)

func say(s string) {
        for i := 0; i < 5; i++ {
                time.Sleep(100 * time.Millisecond)
                fmt.Println(s)
        }
}

func main() {
        go say("world")
        say("hello")
}

由于这两个函数是在不同的线程中运作的,因此就不会有输出的固定顺序。

但是java中不存在协程一说。

错误处理

Go语言的错误处理是一个接口,例如如下实例:

type DivideError struct {
    dividee int
    divider int
}

func (de *DivideError) Error() string {
    strFormat := 
    `Cannot proceed, the divider is zero.
    dividee: %d
    divider: 0`
    
    return fmt.Sprintf(strFormat, de.dividee)
}

func Divide(varDividee int, varDivider int) (result int, errorMsg string) {
    if varDivider == 0 {
            dData := DivideError{
                    dividee: varDividee,
                    divider: varDivider,
            }
            errorMsg = dData.Error()
            return
    } else {
            return varDividee / varDivider, ""
    }

}

func main() {
    if result, errorMsg := Divide(100, 10); errorMsg == "" {
            fmt.Println("100/10 = ", result)
    }
    if _, errorMsg := Divide(100, 0); errorMsg != "" {
            fmt.Println("errorMsg is: ", errorMsg)
    }
}

然而在java中的错误处理主要是使用try{}catch{}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值