go中与java C++中应该注意的语法糖以及不同点是什么

71次阅读
没有评论

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

这篇文章将为大家详细讲解有关 go 中与 java C++ 中应该注意的语法糖以及不同点是什么,文章内容质量较高,因此丸趣 TV 小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

背景

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

具体不同 glang 中 package

每个 Go 文件都属于且仅属于一个包,必须在源文件中非注释的第一行指明这个文件属于哪个包,如:package main,package main 表示一个可独立执行的程序,
每个 Go 应用程序都包含一个名为 main 的包。package main 包下可以有多个文件,但所有文件中只能有一个 main () 方法,main () 方法代表程序入口

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 的属性可以没有名字而只有类型,使用时类型即为属性名。(因此,一个 struct 中同一个类型的匿名属性只能有一个)

定义 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)
//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}() // 花括号后加 () 表示函数调用,此处声明时为指定参数列表, // 故调用执行时也不需要传参

关于 go 中与 java C++ 中应该注意的语法糖以及不同点是什么就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-25发表,共计2792字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)