返回顶部
首页 > 资讯 > 后端开发 > GO >golang中有类吗
  • 490
分享到

golang中有类吗

2023-07-04 23:07:57 490人浏览 安东尼
摘要

这篇文章主要介绍“golang中有类吗”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Golang中有类吗”文章能帮助大家解决问题。golang中没有类。golang不是一门纯面向对象编程语言,它没有

这篇文章主要介绍“golang中有类吗”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Golang中有类吗”文章能帮助大家解决问题。

golang中没有类。golang不是一门纯面向对象编程语言,它没有class(类)的概念,也就没有继承的说法,但Go也可以模拟面向对象的编程方式。在Go中,可以将struct比作其它语言中的class;通过struct定义结构体,表征一类对象,例“type person struct {...}”。

面向对象三大特征:封装,继承,多态。

Go不是一门纯面向对象编程语言,它没有class(类)的概念,也就没有继承的说法。但Go也可以模拟面向对象的编程方式,即可以将struct比作其它语言中的class。

对象

Go没有class的概念,通过struct定义结构体,表征一类对象。

type person struct {Age  intName string}

对象是状态与行为的有机体。例如下面的java代码:

public class Person {    int age;    String name;    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }}

不同于Java,Go的方法不需要跟类的数据绑定在一个class的定义里面,只需要定义在同一个包内。这一点可能初学Go的同学,会感觉很奇怪。

type person struct {Age  intName string}func (p *person) GetAge() int {return p.Age}func (p *person) SetAge(age int)  {p.Age = age}func (p *person) GetName() string {return p.Name}func (p *person) SetName(name string) {p.Name = name}

构造函数

Go没有构造函数,对象的数据载体就是一个struct。Java支持构造函数,构造函数名字就跟类名字一样,多个构造函数通过函数重载实现。

而Go构造函数则通过工厂函数进行模拟。实例如下:

type person struct {Age  intName string}func newPersonByName(name string) *person {return &person{Name: name,}}func newPersonByAge(age int) *person {return &person{Age: age,}}

需要注意的是,person结构体的名称首字母要小写,避免外部直接越过模拟的构造函数

访问权限

Java有四种访问权限,如下所示:

java访问控制符

publicprotected

friendly

(default)

private
同一个类yesyesyesyes
同一个包yesyesyesno
不同包子类yesyesnono
不同包非子类yesnonono

Go则做了简化,可见性的最小粒度是包。也就是说,Go保留两种,friendly和public。Go的变量名如果首字母是小写,则代表包内可见;如果首字母是大写,则代表任何地方都可见。

封装

封装,把抽象出来的结构体跟操作结构体内部数据的函数绑定在一起。外部程序只能根据导出的函数api(public方法)修改结构体的内部状态。

封装有两个好处:

隐藏实现:我们只希望使用者直接使用API操作结构体内部状态,而无需了解内部逻辑。就好像一座冰山,我们只看到它露出水面的那一部分。

保护数据:我们可以对数据的修改和访问施加安全措施,调用setter方法的时候,我们可以对参数进行校验;调用getter方法,我们可以增加访问日志等等。

一个简单的bean定义如下所示:

type person struct {Age  intName string}func NewPerson(age int, name string) *person{return &person{age, name}}func (p *person) SetAge(age int)  {p.Age = age}func (p *person) SetName(name string) {p.Name = name}func main() {p:= NewPerson(10, "Lily")p.SetName("Lucy")p.SetAge(18)}

需要注意的是,Go的方法是一种特殊的函数,只是编译器的一种语法糖,编译器瞧瞧帮我们把对象的引用作为函数的第一个参数。例如,下面的代码是等价的

func main() {p:= NewPerson(10, "Lily")p.SetName("Lily1")// 等价于下面的写法// p是一个引用,函数引用setNameFunc := (*person).SetNamesetNameFunc(p, "Lily2")fmt.Println(p.Name)}

继承

继承,子类继承父类,则获得父类的特征和行为。继承的主要目的是为了重用代码。Java实现代码重用的两大利器,就是继承和组合。

Go没有class的概念,谈不上继承。但Go可以通过匿名组合来模拟继承。

如下所示,Cat通过匿名聚合了Animal结构体,就自动获得了Animal的move()和Shout()方法:

type Animal struct {Name string}func (Animal) move()  {fmt.Println("我会走")}func (Animal) shout()  {fmt.Println("我会叫")}type Cat struct {Animal // 匿名聚合}func main() {cat := &Cat{Animal{"猫"}}cat.move()cat.shout()}

多态

多态,申明为基类的变量,可以在运行期指向不同的子类,并调用不同子类的方法。多态的目的是为了统一实现。

我们通过接口来实现多态。在java里,我们通过interface来定义接口,通过implements来实现接口。

interface Animal {    void move();    void shout();}class Dog implements Animal {    @Override    public void move() {        System.out.println("我会走");    }    @Override    public void shout() {        System.out.println("我会叫");    }}

而Go则是通过鸭子类型推断,只要某个对象长得想鸭子,叫起来像鸭子,那么它就是鸭子。也就是说,Go的接口是比较隐匿的,只要某个对象实现来接口申明的所有方法,那么就认为它属于该接口。

type Animal interface {move()shout()}type Cat struct {Animal // 匿名聚合}func (Cat)move()  {fmt.Println("猫会走")}func (Cat)shout()  {fmt.Println("猫会叫")}type Dog struct {Animal  // 匿名聚合}func (Dog)move()  {fmt.Println("狗会走")}func (Dog)shout()  {fmt.Println("狗会叫")}func main() {cat := Cat{}dog := Dog{}    // 申明接口数组 animals := []Animal{cat, dog}for _,ele := range animals {        // 统一访问ele.move()ele.shout()}}

关于“golang中有类吗”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网GO频道,小编每天都会为大家更新不同的知识点。

您可能感兴趣的文档:

--结束END--

本文标题: golang中有类吗

本文链接: https://lsjlt.com/news/348360.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • golang中有类吗
    这篇文章主要介绍“golang中有类吗”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“golang中有类吗”文章能帮助大家解决问题。golang中没有类。golang不是一门纯面向对象编程语言,它没有...
    99+
    2023-07-04
  • golang 有类吗
    Golang是一门以C语言为基础的编程语言,也被称为Go语言。与其他一些编程语言不同,Golang的设计目标是在增强程序员生产力的同时,提供更高的安全性和并发性能。它的设计思路主要体现在简洁易懂的语法、强大的标准库和高效的并发机制上。那么,...
    99+
    2023-05-14
  • golang有工厂类吗
    这篇文章主要介绍“golang有工厂类吗”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“golang有工厂类吗”文章能帮助大家解决问题。golang没有有工厂类,因为golang不支持类(class)...
    99+
    2023-07-04
  • golang有抽象类吗
    今天小编给大家分享一下golang有抽象类吗的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。golang没有抽象类。golan...
    99+
    2023-07-04
  • golang中有没有类
    golang中没有类。golang不是一门纯面向对象编程语言,它没有class(类)的概念,也就没有继承的说法,但Go也可以模拟面向对象的编程方式。在Go中,可以将struct比作其它语言中的class;通过struct定义结构体,表征一类...
    99+
    2023-05-14
    go语言 Golang
  • golang有in吗
    本文小编为大家详细介绍“golang有in吗”,内容详细,步骤清晰,细节处理妥当,希望这篇“golang有in吗”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。golang没有in。golang中即没有提供类似Py...
    99+
    2023-07-05
  • golang有vm吗
    标题:golang有vm吗?解析golang的虚拟机实现原理摘要:Golang是一种新兴的编程语言,拥有强大的并发和内存管理能力,因此受到越来越多的开发者的青睐。在golang的世界中,是否也有虚拟机(VM)的存在呢?本文将从golang的...
    99+
    2023-05-15
  • golang 没有类
    概述Go语言是一种快速、开源的编程语言,由21世纪初Google公司开发。它在不久后便受到了广大程序员的欢迎,成为当今热门的编程语言之一。然而,与其他编程语言不同的是,Go语言并没有类(class)的概念。这篇文章将深入地探讨Go语言没有类...
    99+
    2023-05-16
  • golang有进程吗
    golang有进程。进程就是程序在操作系统中的一次执行过程,是由系统进行资源分配和调度的基本单位;进程是一个动态概念,是程序在执行过程中分配和管理资源的基本单位,每一个进程都有一个自己的地址空间。go语言支持多进程,它线程模型是MPG模型,...
    99+
    2023-05-14
    go语言 Golang 进程
  • golang有缓存吗
    Golang是一种开源的编程语言,支持并发和并行编程,在处理高并发请求时非常出色。就像其他编程语言一样,Golang也有着自己的缓存机制来提升程序的性能和响应速度。那么,究竟Golang有缓存吗?本文将为您解答这个问题。Golang语言本身...
    99+
    2023-05-15
  • Golang中有指针吗?怎么用?
    Golang是一门现代化的编程语言,简称Go,它采用了静态类型、并发性强、效率高、开发效率高的特点,成为了现代Web应用开发中的一个重要语言,吸引了许多程序员的关注。在Golang中,指针是一种非常重要的数据类型。指针可以存储变量的内存地址...
    99+
    2023-05-14
  • golang有迭代器吗
    golang有迭代器,其提供了多种类型的迭代器,可以用于遍历数组、切片、映射和通道等数据结构,通过使用迭代器,可以简化代码并提高代码的可读性,无论是遍历数组和切片,还是遍历映射和通道,迭代器都是一种非常有用的工具,在编写golang代码时,...
    99+
    2023-07-17
  • golang有拦截器吗
    golang没有提供内置的拦截器,但可以利用函数、接口和结构体等语言特性来实现类似的功能,以下是常用拦截器实现方式:1、函数式拦截器,通过在请求到达处理程序之前及其之后调用函数来实现拦截器;2、接口式拦截器,通过定义一个接口,并在目标处理程...
    99+
    2023-07-18
  • golang有宏概念吗
    golang没有直接支持宏的概念,但提供了一些替代宏的功能和特性,以帮助开发者更加灵活地使用和重用代码。使用Go语言的“text/template”库和“go generate”命令,可以在开发过程中自动生成一些代码,这种方式类似于宏的思想...
    99+
    2023-07-25
  • golang中有哪些类型的断言
    golang中有哪些类型的断言?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。package mainimport ("github...
    99+
    2023-06-15
  • 有golang的工作流吗
    golang的工作流:1、Cadence是开源工作流引擎,提供简单强大的方式来定义并发性和分布式性的工作流;2、Temporal是开源的工作流和事件驱动的编程框架,提供简单而灵活的方式来编写可靠的工作流应用程序;3、GoFlow是轻量级的工...
    99+
    2023-07-19
  • golang拦截器有用吗
    golang拦截器有用,其用途:1、身份验证和权限控制,拦截器可以用于处理用户身份验证和权限控制;2、日志记录,拦截器可以用于记录请求和响应的详细信息;3、缓存,拦截器可以用于缓存数据,以提高应用程序的性能和响应速度;4、错误处理,拦截器可...
    99+
    2023-07-19
  • golang服务器有用吗
    golang服务器有用,在当今应用程序和网站开发中具有重要的价值和优势,其高并发性能、出色的性能优化能力以及简单易学的语法特性,使得golang成为构建高性能和可靠的服务器的理想选择。通过使用golang,开发者能够快速构建和扩展能够处理大...
    99+
    2023-07-19
  • golang没有解释器吗
    golang没有解释器,在golang中,代码被编译成二进制文件,这意味着它是一种编译型语言。与解释器相比,编译器将源代码翻译成可执行的机器代码,然后在运行时直接执行,解释器则逐行读取和解释源代码,然后逐行执行,由于解释器需要解析和执行每一...
    99+
    2023-07-19
  • golang改名有必要吗
    随着计算机科学的不断发展,编程语言的种类也不断扩展和变化。每一种编程语言都有自己的特点,而golang(原名为Go)也不例外。Golang是由Google开源的一种静态强类型的编程语言,于2009年首次发布,其诞生的使命是解决开发大规模网络...
    99+
    2023-05-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作