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()方法,产生了不同的接口,间接实现的多态。

相关文章
|
20天前
|
Go
go创建web服务
go创建web服务
22 4
|
26天前
|
存储 算法 Go
go语言并发实战——日志收集系统(七) etcd的介绍与简单使用
go语言并发实战——日志收集系统(七) etcd的介绍与简单使用
|
2天前
|
前端开发 API 开发者
Python Web开发者必看!AJAX、Fetch API实战技巧,让前后端交互如丝般顺滑!
【7月更文挑战第13天】在Web开发中,AJAX和Fetch API是实现页面无刷新数据交换的关键。在Flask博客系统中,通过创建获取评论的GET路由,我们可以展示使用AJAX和Fetch API的前端实现。AJAX通过XMLHttpRequest发送请求,处理响应并在成功时更新DOM。Fetch API则使用Promise简化异步操作,代码更现代。这两个工具都能实现不刷新页面查看评论,Fetch API的语法更简洁,错误处理更直观。掌握这些技巧能提升Python Web项目的用户体验和开发效率。
15 7
|
26天前
|
监控 Go
go语言并发实战——日志收集系统(八) go语言操作etcd以及利用watch实现对键值的监控
go语言并发实战——日志收集系统(八) go语言操作etcd以及利用watch实现对键值的监控
go语言并发实战——日志收集系统(八) go语言操作etcd以及利用watch实现对键值的监控
|
26天前
|
存储 Go 索引
go语言并发实战——日志收集系统(一) 项目前言
go语言并发实战——日志收集系统(一) 项目前言
go语言并发实战——日志收集系统(一) 项目前言
|
22天前
|
前端开发 JavaScript API
探索现代Web开发中的动态数据交互——前端与后端整合实战
本文探讨了现代Web开发中前端与后端整合的关键技术点,通过实际案例演示了如何利用JavaScript和Node.js实现动态数据交互,全面解析从数据请求到响应的全过程。
|
19天前
|
中间件 开发者 C++
Django中间件探索:揭秘中间件在Web应用中的守护角色与实战应用
Django中间件探索:揭秘中间件在Web应用中的守护角色与实战应用
|
23天前
|
存储 Apache 文件存储
在Apache环境下为Web网站增设访问控制:实战指南
在Apache服务器上保护网站资源涉及启用访问控制模块(`mod_authz_core`和`mod_auth_basic`),在`.htaccess`或`httpd.conf`中设定权限,如限制对特定目录的访问。创建`.htpasswd`文件存储用户名和密码,并使用`htpasswd`工具管理用户。完成配置后重启Apache服务,访问受限目录时需提供有效的用户名和密码。对于高安全性需求,可考虑更复杂的认证方法。【6月更文挑战第20天】
75 4
|
23天前
|
安全 Ubuntu 应用服务中间件
NGINX环境下实现Web网站访问控制的实战指南
在NGINX中设置基于IP的访问控制可提升网站安全性。步骤包括安装NGINX、备份配置文件、编辑`/etc/nginx/sites-available/default`,添加`allow`和`deny`指令限制特定IP访问,如`allow 192.168.1.100; deny all;`,然后测试配置并重启服务。成功后,仅允许的IP能访问网站,否则会收到403错误。这为Web安全提供基础保障,还可扩展实现更多高级控制策略。【6月更文挑战第20天】
86 3
|
26天前
|
消息中间件 存储 监控
go语言并发实战——日志收集系统(六) 编写日志收集系统客户端
go语言并发实战——日志收集系统(六) 编写日志收集系统客户端