Go Web编程实战(5)----面向对象编程(一)

简介: Go Web编程实战(5)----面向对象编程(一)

前言


Go语言中,并没有类的概念,但这并不意味着Go语言不支持面向对象编程,毕竟面向对象只是一种编程思想。


封装


属性

其实,学习过C语言都应该清楚,结构体是一个类类的结构,也就是说结构体是类的一种简化形式。所以,如果我们需要使用Go语言定义一个三角形类,可以这样写:

type Triangle struct {
  Bottom float32
  Height float32
}


方法

既然有了类,那类的方法如何定义呢?其实Go语言中,也有方法。


方法是作用在接收者上的一个函数,接收者是某种类型的变量。因此,方法是一种特殊类型的函数。示例如下:

//语法
func (recv recv_type)methodName(parameter_list)(return_value_list){
  //方法内容
}
//示例
type Triangle struct {
  Bottom float32
  Height float32
}
func (t *Triangle) Area() float32 {
  return (t.Bottom * t.Height) / 2
}
func main() {
  r :=Triangle{6,8}
  fmt.Println(r.Area())
}


以上代码运行的结果为:24


访问权限

在许多面向对象的语言中,属性与方法都有私有与公有的区别,这就是访问权限。比如Java,可以用public、private来定义访问权限。


但Go语言肯定是没有public与private,它是通过字母大小写来控制访问权限的。大家也会发现,我们上面的Bottom与Height都是大写,所以大写是公有属性,小写是私有。


这里就不举例了,大家可以通过编译器试试,可以发现小写的,根本不会提示。强制写入代码运行,肯定也会报错。


另外,我们还常常在Java语言的实体类中,定义get与set方法。下面,我们来通过Go语言实现get与set方法:

type Triangle struct {
  bottom float32
  height float32
}
func (s *Triangle) GetBottom() float32  {
  return s.bottom
}
func (s *Triangle) SetBottom(bottom float32){
  s.bottom=bottom
}
func main() {
  r :=Triangle{6,8}
  r.SetBottom(8)
  fmt.Println(r.GetBottom())
  fmt.Println(r.bottom,r.height)
}


继承

在Go语言中,同样也没有继承关键字extend,而是使用在结构体中内嵌匿名类型的方法来实现继承。例如,顶一个动物接口和一个老虎结构体,让老虎结构体包含一个动物接口的匿名字段。

type Animal interface {
  GetName()
  SetName()
}
type Tiger struct {
  Animal
}
func (t *Tiger) Working()  {
  t.GetName()
  t.SetName()
}


多态

在面向对象中,多态的特征是不同对象中同种行为的不同实现方式。在Go语言中,可以使用接口实现这个特征。示例如下:

//三角形结构体
type Triangle struct {
  Bottom float32
  Height float32
}
//正方体结构体
type Cube struct {
  sideLen float32
}
//定义了一个包含Area()方法的接口Shape,让三角形与正方行都实现这个接口里的Area()方法。
type Shape interface {
  Area() float32
}
func (t *Triangle) Area() float32 {
  return (t.Bottom * t.Height) / 2
}
func (c *Cube) Area() float32  {
  return c.sideLen * c.sideLen
}
func main() {
  r :=&Triangle{6,8}
  c :=&Cube{5}
  s :=[]Shape{r,c}
  for n,_ :=range s{
  fmt.Println("图形数据:",s[n])
  fmt.Println("图形面积",s[n].Area())
  }
}


如上面代码所示,通过不同对象调用Area()方法,产生了不同的接口,间接实现的多态。

相关文章
|
5天前
|
Java 应用服务中间件 测试技术
深入探索Spring Boot Web应用源码及实战应用
【5月更文挑战第11天】本文将详细解析Spring Boot Web应用的源码架构,并通过一个实际案例,展示如何构建一个基于Spring Boot的Web应用。本文旨在帮助读者更好地理解Spring Boot的内部工作机制,以及如何利用这些机制优化自己的Web应用开发。
31 3
|
1天前
|
缓存 监控 安全
Django框架在大型Web应用中的架构设计与实战
【5月更文挑战第18天】Django框架在构建大型Web应用中扮演重要角色,采用分层架构(数据、业务逻辑、表示层)和多应用组织模式,结合缓存策略(如Memcached、Redis)提升性能。通过异步处理、分布式部署提高响应速度和扩展性。关注数据分区、安全设计及监控日志,确保系统高效、稳定。Django为复杂业务提供坚实基础,助力打造卓越Web系统。
18 7
|
2天前
|
JSON JavaScript 前端开发
web前端入门到实战:32道常见的js面试题,2024年最新秋招是直接面试吗
web前端入门到实战:32道常见的js面试题,2024年最新秋招是直接面试吗
|
2天前
|
JavaScript 前端开发 程序员
web前端入门到实战:32道常见的js面试题(1),面试哪些
web前端入门到实战:32道常见的js面试题(1),面试哪些
|
4天前
|
负载均衡 Go 调度
使用Go语言构建高性能的Web服务器:协程与Channel的深度解析
在追求高性能Web服务的今天,Go语言以其强大的并发性能和简洁的语法赢得了开发者的青睐。本文将深入探讨Go语言在构建高性能Web服务器方面的应用,特别是协程(goroutine)和通道(channel)这两个核心概念。我们将通过示例代码,展示如何利用协程处理并发请求,并通过通道实现协程间的通信和同步,从而构建出高效、稳定的Web服务器。
|
5天前
|
存储 人工智能 测试技术
python自动化测试实战 —— CSDN的Web页面自动化测试
python自动化测试实战 —— CSDN的Web页面自动化测试
194 0
|
5天前
|
监控 安全 Shell
记一次应急靶场实战--web1
本次应急靶机题目训练主要是为了应对接下来的护网面试和比赛,顺便提高一下自己对应急和溯源的实战能力,这里有两个逗比的事情发生,一是用D盾分析的时候,电脑环境监测到了,把要分析的马杀了,二是,发现无法使用脚本,在自己本机实验,电脑差点搞崩,还好佬在制作时候只是单次运行会占用.切记不要本机实验,一定要在虚拟机中进行测试.
|
5天前
|
JSON 监控 安全
Golang深入浅出之-Go语言中的反射(reflect):原理与实战应用
【5月更文挑战第1天】Go语言的反射允许运行时检查和修改结构,主要通过`reflect`包的`Type`和`Value`实现。然而,滥用反射可能导致代码复杂和性能下降。要安全使用,应注意避免过度使用,始终进行类型检查,并尊重封装。反射的应用包括动态接口实现、JSON序列化和元编程。理解反射原理并谨慎使用是关键,应尽量保持代码静态类型。
25 2
|
5天前
|
数据库连接 Go 数据库
【Go 语言专栏】Go 语言中的错误注入与防御编程
【4月更文挑战第30天】本文探讨了Go语言中的错误注入和防御编程。错误注入是故意引入错误以测试系统异常情况下的稳定性和容错性,包括模拟网络故障、数据库错误和手动触发错误。防御编程则强调编写代码时考虑并预防错误,确保程序面对异常时稳定运行。Go语言的错误处理机制包括多返回值和自定义错误类型。结合错误注入和防御编程,可以提升软件质量和可靠性,打造更健壮的系统。开发人员应重视这两方面,以实现更优质的软件产品。
|
5天前
|
缓存 监控 测试技术
【Go语言专栏】使用Go语言构建高性能Web服务
【4月更文挑战第30天】本文探讨了使用Go语言构建高性能Web服务的策略,包括Go语言在并发处理和内存管理上的优势、基本原则(如保持简单、缓存和并发控制)、标准库与第三方框架的选择、编写高效的HTTP处理器、数据库优化以及性能测试和监控。通过遵循最佳实践,开发者可以充分利用Go语言的特性,构建出高性能的Web服务。