1. 程式人生 > >Golang基礎學習(與java對比)

Golang基礎學習(與java對比)

Golang基礎

slice

  1. ​ 建立一個slice(切片)

    slice := []int {lenth, 'b', 'c', 'd'}

    與java陣列不同的是:

    arr := [5]int{1,2,3}

    必須定死長度,否則會報錯

    non-constant array bound length

    slice 有一種是java中資料和list的結合體的感覺

    對於slice有幾個有用的內建函式:

    • len 獲取slice的長度
    • cap 獲取slice的最大容量
    • appendslice裡面追加一個或者多個元素,然後返回一個和slice一樣型別的slice
    • copy 函式copy
      從源slicesrc中複製元素到目標dst,並且返回複製的元素的個數

總結:slice 和資料的區別在於 有沒有定義長度

map

  1. ​ 建立一個map(與java基本類似),只是通過maps1[key1]獲得結果的時候,有第二個引數(布林值),可以判斷是否這個key是不是存在,當然也可以只返回一個引數

    maps1 := make(map[string]string)
    key1 := "key1"
    maps1[key1] = key1
    s,ok := maps1[key1]
    if ok {
        fmt.Println("hava key [",s,"]")
    }

實現介面區別

golang

package main

type Dock struct {
    Sound string
}



func (this Dock) voice(a VoiceIFS) VoiceIFS {

    return this
}

package main

import "fmt"

type VoiceIFS interface {
    voice(VoiceIFS) VoiceIFS
}


func main()  {
    dock:= Dock{Sound : " ga ga ga "}

    var t VoiceIFS
    t = dock
    ifs := t.voice(dock)
    fmt.Println(ifs)
}




結果:

{ ga ga ga }

java

public interface VoiceIFS {
    VoiceIFS voice(VoiceIFS s) ;
}
public class Dock   implements VoiceIFS {

    private String sound ;

    public String getSound() {
        return sound;
    }

    public void setSound(String sound) {
        this.sound = sound;
    }

    @Override
    public VoiceIFS voice(VoiceIFS s) {
        return this;
    }

    @Override
    public String toString() {
        return "Dock{" +
                "sound='" + sound + '\'' +
                '}';
    }
}
public class TestVoiceIFS {

    public static void main(String[] args) {
        VoiceIFS s = new Dock();
        ((Dock) s).setSound(" ga ga ga");
        VoiceIFS voice = s.voice(s);

        System.out.println(voice);
    }

}

結果:

Dock{sound=' ga ga ga'}

總結:

java 實現結果需要implement 關鍵詞來指定實現具體介面,而golang的話只需要與某個介面中的某個方法名字相同即可,golang更加鬆散,但是給我的感覺來說還是java的設計相對來說好一點 結構比較清晰,且golang的介面名字估計不能相同,

### 通過switch type 判斷 介面型別

func main()  {
    doSomething(111,float32(1),"111")
}

func doSomething(item... interface{})  {
    for _,e := range item {
        v := reflect.ValueOf(e)
        typ := v.Interface()
        switch e.(type) {
        case int:
            i := typ.(int)
            i++
            fmt.Println("this is int interface,then do something...",i)
        case float32:
            f := typ.(float32)
            f += 1.08
            fmt.Println("this is float32 or float64 interface,then do something...",f)
        }
    }

}