java中oop与aop
在过去的几年中,Go获得了巨大的普及。 对于某些很棒的新技术,例如OpenShift,Docker和Kubernetes,它是最好的编程语言之一。 Golang或Google Go通常被称为Google Go,它是由一些著名的系统研究人员特别设计的,包括Plan 9的成名者Rob Pike和C的创建者之一Ken Thompson。
对不起,我的双关语,但是这种语言有很多“用”的地方。 Google已开始将其用于内部项目。 在Web开发和脚本社区中,人们对Go语言产生了极大的兴趣。 该语言还具有成熟的实现,在考虑新的编程语言时,易于监督。
在谈论语言的类型系统时 ,它是编程语言的一个非常重要的功能,它使您能够组织应用程序数据。 除此之外,该语言还因其至少遵循其类型系统的方法而闻名。 它还提供了各种内置类型,例如string,int和float64和bool。
Go支持复合类型,例如数组,切片,地图,通道等。 Go的复杂类型由其他类型组成-内置类型和用户定义类型。 让我们举个例子–复合类型“ map(string)string”显示字符串值的完整范围。 在每个单个字符串值中,都需要一个字符串键,因为在这里,可以使用相应的键轻松保存值。 让我们看一下Go的键入系统与Java中的面向对象编程有何不同。
在Java中,局部变量主要存储在堆栈中。 在C,C ++和其他应用了调用堆栈的语言中,它也是真实的。 此语言不可豁免。 除此之外,您还可以轻松地从函数返回指向局部变量的指针。
在C语言中,这是一个致命的错误。 但是,在Go中,编译器知道分配的“对象”正在潜逃该方法,并根据该方法对其进行分配。 因此,该语言将继续函数和指针的返回,而该指针和指针将指向没有可靠数据的已经废弃的存储位置。
因此,写以下内容是合法的:
package main
import (
"fmt"
)
type Record struct {
i int
}
func returnLocalVariableAddress() *Record {
return ℜcord{1}
}
func main() {
r := returnLocalVariableAddress()
fmt.Printf("%d", r.i)
}
在Go中,结构是开发用户定义的具体类型的方法。 但是,与其他编程语言相比,结构类型的设计是完全独特的。 换句话说,结构是一组不同的字段或属性。
但是,Java语言提供了class关键字,而Go不提供“ class”关键字。 Go提供了结构的轻量版本,而不是class关键字。 如果结构名称以大写字母开头,则该结构是导出到其他程序包中的一种类型。
在Go编程语言中,无需在结构字段上使用getter和setter。 如果字段名称以大写字母开头,则可以从同一软件包中轻松检索它们,也可以从其他软件包中访问它们。
您可以在函数内部编写函数,并且可以像使用函数语言一样返回函数,并且函数中的局部变量可以作为闭包中的变量。
package main
import (
"fmt"
)
func CounterFactory(j int) func() int {
i := j
return func() int {
i++
return i
}
}
func main() {
r := CounterFactory(13)
fmt.Printf("%d\n", r())
fmt.Printf("%d\n", r())
fmt.Printf("%d\n", r())
}
Go和JavaScript一样都是面向对象的,它的闭包和函数是一等公民。 实际上,这种语言不仅仅具有界面和结构。 的确,它们不是完全的类。 它们是值类型。
这些仅传递值。 无论它们存储在内存中的何处,数据都只有纯数据,没有对象标头就是这样。 Go中的结构很像C中的结构,即包含不同的字段; 它们不能互相扩展,也不能包含方法。
查看更多:
面向对象的功能有所不同。 除了在类定义中包含方法外,您还可以在定义方法本身时指定适用于其的结构。 结构还包含其他一些结构。
如果没有该字段的名称,则可以通过隐式成为其名称的类型来引用它。 除此之外,您可以只引用属于顶级结构的字段或任何技术。
这是一个例子:
package main
import (
"fmt"
)
type A struct {
a int
}
func (a *A) Printa() {
fmt.Printf("%d\n", a.a)
}
type B struct {
A
n string
}
func main() {
b := B{}
b.Printa()
b.A.a = 5
fmt.Printf("%d\n", b.a)
}
这几乎是一种遗产。 当您同意可以使用该方法的结构时,可以指定该结构本身或指向该结构的指针。 如果此方法正在执行到该结构,则该方法将访问调用方结构的副本。
但是,如果将该方法应用于指向该结构的指针,则该指针将被传递。 在最后的情况下,可以定制方法或技术的结构。 两种方法均可用于满足接口的需求。
说到Go,它非常紧凑且不容忍。 有些字符在其他语言中根本没用。 自从C发明以来的最近40年中,我们习惯了它们以及遵循该语法的所有其他语言。
但是,仅因为它很旧并不意味着它是好的。 我们都知道,使用if语句中的代码分支周围的{and}可以很好地解决拖尾的else问题。 如果我们有大括号,则没有必要将条件括在括号之间。 看下面的代码:
...
if a == nil {
fmt.Println("a is nil")
} else {
fmt.Printf("%d\n", a.a)
}
...
没有要求。 Go甚至不允许。 您会注意到没有分号。 您可以使用它们,但不需要。 在源代码上,插入它们是预处理步骤,并且很有效。
多数情况下,它们还是很混乱。 为了声明一个新变量并为其赋值,可以使用:=
。 在表达式的右侧,它通常显示类型,因此无需编写var x typeOfX =
表达式。
除此之外,如果您导入一个包并分配一个变量,但之后不使用它,那是一个错误。 在编译时,可以很容易地将其检测为代码错误,并且编译失败。
Go有自己的小怪癖。 乍一看,这些东西听起来也很怪异,但是开发人员可以从中掌握这些东西。
- 库的源代码将被导入到项目的源代码中。
- 公共功能和变量以大写形式作为其各种关键字,例如public和private。
- 语言中以注释说明的形式内置了代码生成支持。
- 缺乏仿制药。
简而言之,Go是一种令人兴奋且有趣的语言。 但是,即使在语言级别,它也不能替代Java。 这两种语言都不能提供相同类型的任务-Java是企业开发语言,而Go是系统编程语言。 如果您有任何疑问,可以与熟悉Go和Java语言的经验丰富的开发人员联系。
翻译自: https://jaxenter.com/go-typing-system-java-oop-133912.html
java中oop与aop