当前位置: 首页 > 工具软件 > pogo-Go > 使用案例 >

java中oop与aop_Go的打字系统与Java中的OOP有何不同

颛孙晗昱
2023-12-01

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

 类似资料: