背景

最近在用golang写k8s operator(其中波及到informer controler )用于外部调度平台用,刚好借此机会可能与java版本的 informer controller进行比照,因为之前对golang没怎么接触过,遇到了和java c++不同的语法糖,当初列举一下:

具体不同

golang中struct

golang中没有class的概念,然而有struct,而且能够给struct减少办法,如下:

type Member struct {    Id     int    `json:"id"`}//绑定到Member构造的办法,然而这种不会扭转member的值,因为构造体是值传递,当咱们调用setID时,办法接收器接管到是只是构造体变量的一个正本,通过正本对值进行修复,并不会影响调用者,因而,咱们能够将办法接收器定义为指针变量,就可达到批改构造体的目标func (m Member)setId(id int){    m.Id = id}m := Member{}m.setId(1)fmt.Println(m.Id)//输入为空//绑定到Member构造的办法,会扭转member的值 func (m *Member)setId(id int){    m.Id = id}m := Member{}m.setId(1)fmt.Println(m.Id)//输入为1

对于办法的接受者和接口如何被调用,参考如下:

  • 不论办法的接收者是值还是指针,对象的值和指针均能够调用该办法型,那么办法的接受者能够是值类型也能够是指针类型
  • 当办法的接收者是值时,不论是值调用还是指针调用,办法外部都是对原对象的正本进行操作,不会影响原对象型,那么办法的接受者必须也是值类型该办法才能够被调用
  • 当办法的接收者是指针时,不论是值调用还是指针调用,办法外部都是通过指针对原对象进行操作,会影响原对象

定义struct的tags

在定义strut的构造体时,能够增加tag,tag能够在运行时用到,以及造成json或者xml时用到如下:

type NetworkList struct {    Project  `json:",inline"`    f2 int    `json:"id,-"`    f3 string `json:"f3,omitempty"`    f4 string `json:"f4"`}type Project struct {    Key   string `json:"key"`    Value string `json:"value"`}

其中,

名词解释
json:",inline"示意内嵌类型的key和外层struct的key是平行关系,如NetworkList里的key和Project key在造成json的时候是平行关系,不是内嵌关系,也就是在同一级
json:"id,-"-(横杠) 示意公有字段,造成json的时候不包含该key
json:"f3,omitemptyomitempty示意该字段为空,则生成json时,不包含该key
json:"f4"示意生成json时,key为f4

golang的类型转换

c++ java 中有隐式类型转换,golang没有,golang中有强制类型转换和类型断言

  • 强制类型转换
package mainimport "fmt"func main() {    var a float32 = 5.6    var b int = 10    fmt.Println (a * float32(b))}
  • 类型断言
package mainimport "fmt"func main() {    var a interface{} =10    t,ok:= a.(int)    if ok{        fmt.Println("int",t)    }    t2,ok:= a.(float32)    if ok{        fmt.Println("float32",t2)    }}

golang中的interface{}

interface{}是空接口没有任何办法,且所有类型都实现了空接口,相当于java中的object,interface类型默认是一个指针

golang中的go关键字

go 关键字用来创立 goroutine (协程),是实现并发的要害

//go 关键字放在办法调用前新建一个 goroutine 并让他执行办法体go GetThingDone(param1, param2);//上例的变种,新建一个匿名办法并执行go func(param1, param2) {}(val1, val2)//间接新建一个 goroutine 并在 goroutine 中执行代码块go {    //do someting...}

golang中的defer关键字

  • defer 的执行形式相似其余语言中的析构函数,在函数体执行完结后依照调用程序的相同程序一一执行
  • 即便函数产生严重错误也会执行,相当于finally
  • 罕用于资源清理、文件敞开、解锁以及记录时间等操作
func main() {  fmt.Println("a")    defer fmt.Println("b")  defer fmt.Println("c")}//打印//a//c//b

golang中的init 函数

golang的init函数在该文件被被援用时才执行(是import时,不是调用包函数时)

package libimport "fmt"func init() {    fmt.Println("lib empty init ")}----package mainimport (    "Test/lib"    "fmt")func main() {    fmt.Println("wint")}// 输入//lib empty init  //wint 

匿名函数

该用法和java C++中差不多

func() {    //func body}()     //花括号后加()示意函数调用,此处申明时为指定参数列表,        //故调用执行时也不须要传参