关于golang:go系列2-关于go中与java-C中应该注意的语法糖以及不同点

53次阅读

共计 2301 个字符,预计需要花费 6 分钟才能阅读完成。

背景

最近在用 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,omitempty omitempty 示意该字段为空,则生成 json 时,不包含该 key
json:”f4″ 示意生成 json 时,key 为 f4

golang 的类型转换

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

  • 强制类型转换
package main

import "fmt"

func main() {
    var a float32 = 5.6
    var b int = 10
    fmt.Println (a * float32(b))
}
  • 类型断言
package main

import "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 lib
import "fmt"
func init() {fmt.Println("lib empty init")
}
----
package main

import (
    "Test/lib"
    "fmt"
)

func main() {fmt.Println("wint")
}
// 输入
//lib empty init  
//wint 

匿名函数

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

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

正文完
 0