java與golang語法比較(一)

變量聲明與賦值

  • Java
int i;    // 聲明
    int j = 1; // 聲明+賦值
  • Go
var i int    // 聲明
    i := 1        // 聲明+賦值
  1. 變量聲明:var是關鍵字,格式:var 變量名稱 變量類型
  2. 變量聲明與賦值: := 符號支持自動推導類型

異常處理

  • Java
// 聲明
int execute(){
    throw new RuntimeException(」msg」); // 有錯誤
    return 0;    // 無錯誤
}
// 處理
try{
    int code = execute();
}catch(Exception e){
    // TODO 異常狀況如何處理
}
  • Go
// 聲明
func Execute() (int , error) {
        return 1,error.New(「msg」) // 有錯誤
        return 0 // 無錯誤
}
// 處理
if code,err=c.Execute();err!=nil {
    // TODO 異常狀況如何處理
}
  1. go的異常是作爲函數返回值的,經過判斷是否存在error,來判斷異常。 (不可以像Java同樣拋出異常)
  2. go的if語句支持初始條件,即先執行if以後的語句(分號以前),再執行分號以後的判斷語句,此語句常常用於異常處理。
  3. go的大括號必須在行末
  4. go函數或者變量爲」公有」,首字母大寫,」私有」則小寫。

參數傳遞

  • Javajava

    略,見Go實現中的註釋函數

  • Gothis

package main // 入口必須是main
import "fmt"    // 引包

type People struct {    // 結構體,相似Java中的class
        age int    // 變量聲明,變量類型放在後面
        name string
}
// 相似Java方法的函數
func change(p People){    // func爲關鍵字
        p.age = 18
}
// 傳遞指針
func change2(p *People){
        p.age = 18
}
func main(){
        p := People{22,"lsq"}    // 新建對象並賦值
        change(p)    // 調用函數change,傳遞對象
        fmt.Println(p)    // 控制檯打印
        change2(&p)    // 調用函數change2,傳遞指針
        fmt.Println(p)
}
// 執行結果
{22 'lsq'}
{18 'lsq'}
  1. change函數是傳遞的對象,函數調用的時候,會拿到對象的拷貝。
  2. change2函數是傳遞的指針,函數調用的時候,會拿到一個指向改對象的指針。
  3. go沒有引用傳遞

多態

此例有點長,是一個求面積的問題,針對與圓形和矩形兩種類型
  • Java
import java.lang.Math;
public class Polymorphism{
        public static class Rectangle implements Areable{    //矩形
                double width;
                double height;
                public Rectangle(double width,double height){   
                        this.width = width;
                        this.height = height;}
                public double area(){
                        return width * height;}
        }
        public static class Circle implements Areable{ // 圓形
                double radius;
                public Circle(double radius){
                        this.radius = radius;}
                public double area(){
                        return radius * radius * Math.PI;}
        }

        public static interface Areable{
              double area();
        }
public static void main(String[] args){
      Areable arear = new Rectangle(5.0,5.0);
      Areable areac = new Circle(2.5);
      System.out.println(arear.area());
      System.out.println(areac.area());
    }
}
  • Go
package main
import (
        "fmt"
        "math"
)

type Rectangle struct {    // 矩形
        width float64
        height float64
}
type Circle struct {    // 圓形
        radius float64
}

type Areable interface{    // 接口:一組method簽名的組合,經過interface來定義對象的一組行爲。
//  只要是實現了interface中的全部的method的結構體,就能夠認爲是這個interface的實例,Duck typing
        area() float64
}
func (r Rectangle) /* 函數的接受者Receiver */ area() float64 /* 返回值類型*/ {    
        return r.width * r.height
}

func (c Circle) /* 函數的另外一個接受者Receiver */  area() float64 /* 返回值類型*/{  
        return c.radius * c.radius * math.Pi
}

func main(){
        ra := Rectangle{5,5}
        ca := Circle{2.5}
        fmt.Println(ra.area())
        fmt.Println(ca.area())
}
相關文章
相關標籤/搜索