当前位置: 首页 > article >正文

golang学习笔记19-面向对象(一):面向对象的引入

注:本人已有C,C++,Python基础,只写本人认为的重点。
这节开始就是面向对象的内容了,为方便复用结构体等类型,本人定义了一个utils包,用于定义这些类型,之后的文章也会用到,希望读者注意。
(1)golang也支持面向对象编程(OOP),但是和传统的面向对象编程有区别,并不是纯粹的面向对象语言。所以我们说golang支持面向对象编程特性是比较准确的。
(2)golang没有类(class),go的结构体(struct)和其它编程语言的类(class)有同等的地位,你可以理解golang是基于struct来实现OOP特性的。
(3)golang面向对象编程非常简洁,去掉了传统OOP语言的方法重载、构造函数和析构函数、隐藏的this指针等等
(4)golang仍然有面向对象编程的继承,封装和多态的特性,只是实现的方式和其它OOP语言不一样,比如继承:go没有extends 关键字,继承是通过匿名字段来实现。
结构体的作用和C/C++一样,其在go中的定义如下:

package utils

import "fmt"

//为方便其他包使用,结构体名和字段名的首字母都要大写
type Person struct {
	Name string
	Age  int
	Sex  string
}

和切片,map一样,结构体也有三种创建方式:

package main

import (
	"course/chap10oop/utils"
	"fmt"
)

func main() {
	// 1. 直接创建,创建后赋值
	var person1 utils.Person // 创建结构体实例
	person1.Name = "李华"
	person1.Age = 30
	person1.Sex = "女"
	fmt.Println("Person 1:", person1)

	// 2. 创建时赋值属性
	// 2.1 不指定字段,但按顺序赋值
	person2 := utils.Person{"王伟", 25, "男"}
	fmt.Println("Person 2:", person2)

	// 2.2 不按顺序,但指定字段赋值
	person3 := utils.Person{Age: 28, Name: "张敏", Sex: "女"}
	fmt.Println("Person 3:", person3)

	// 3. 创建指针后赋值
	// 3.1 用 & 创建指针
	person4 := &utils.Person{} // 创建结构体指针
	person4.Name = "李四"
	person4.Age = 30
	person4.Sex = "男"
	fmt.Println("Person 4:", *person4) // 解引用打印

	// 3.2 用 & 创建指针,同时赋值
	person5 := &utils.Person{Name: "王五", Age: 25, Sex: "女"}
	fmt.Println("Person 5:", *person5) // 解引用打印

	// 3.3 用 new 创建指针
	person6 := new(utils.Person) // 使用 new 创建指针
	person6.Name = "陈刚"
	person6.Age = 26
	person6.Sex = "男"
	fmt.Println("Person 6:", *person6) // 解引用打印
}

注意:go编译器会自动处理结构体指针,使结构体的访问和不使用指针一样,即还是能用.访问和修改结构体指针指向的内容,这点到方法那里还有应用。
一些细节:
1.结构体是用户单独定义的类型,和其它类型进行转换时需要有完全相同的字段(名字、个数和类型)。
2.结构体进行 type 重新定义(相当于取别名),go认为是新的数据类型,但是相互间可以强转。
示例如下:

package main

import (
	"course/chap10oop/utils"
	"fmt"
)

// 定义另一个结构体,字段完全相同
type person2 struct {
	Name string
	Age  int
	Sex  string
}

// 定义一个结构体,作为类型别名
type person3 utils.Person

func main() {
	// 【1】结构体是用户单独定义的类型,和其它类型进行转换时
	//需要有完全相同的字段(名字、个数和类型)
	p1 := utils.Person{Name: "李华", Age: 30}
	p2 := person2{Name: "王伟", Age: 25}
	fmt.Println("person2:", p2)
	// 将 Person 转换为 person2,字段完全相同
	p2 = person2(p1) // 强制转换
	fmt.Println("person2:", p2)

	// 尝试将 person2 转换为 Person,字段完全相同
	p1 = utils.Person(p2) // 强制转换
	fmt.Println("Person:", p1)

	// 【2】结构体进行 type 重新定义(相当于取别名),go 认为是
	//新的数据类型,但是相互间可以强转
	p3 := person3{Name: "张敏", Age: 22}

	// Person3 和 Person 之间可以强转
	p4 := utils.Person(p3) // 强制转换
	fmt.Println("Converted Person:", p4)

	// 直接使用别名
	fmt.Println("person3:", p3)
}


http://www.kler.cn/news/327363.html

相关文章:

  • 9.30学习
  • 南沙C++信奥赛陈老师解一本通题: 1963:【13NOIP普及组】小朋友的数字
  • Redis 性能优化的高频面试题及答案
  • HAProxy 安全配置
  • 正则表达式中的贪婪模式和非贪婪模式
  • [大语言模型-论文精读] 大语言模型是单样本URL分类器和解释器
  • 相互作用的检索增强 3D 分子生成扩散模型 - IRDiff 评测
  • 滚雪球学MySQL[5.1讲]:事务与并发控制
  • 如何使用ssm实现钢铁集团公司安全管理系统的构建与实现
  • 基于小步大步法(BSGS)的同态加密多项式求值
  • 滚雪球学Oracle[2.1讲]:Oracle数据库安装与配置
  • 新品上市!智能无线接入型路由器ZX7981EP,WIFI6技术双频频段
  • 解锁微信小程序新技能:ECharts动态折线图搭配WebSocket,数据刷新快人一步!
  • 数据库 - Mongo数据库
  • 第166天:应急响应-拒绝服务钓鱼指南DDOS压力测试邮件反制分析应用日志
  • ubuntu server 常用配置
  • Spring面试内容大纲
  • ios内购支付-支付宝APP支付提现
  • 互联网前后端分离的开发场景,一般会员和数据权限的判断是放在前端还是后端?
  • 【08】纯血鸿蒙HarmonyOS NEXT星河版开发0基础学习笔记-Scroll容器与Tabs组件
  • 大屏娱乐体验新标杆:海信发布全新一代AI电视
  • 解决MySQL命令行中出现乱码问题
  • Mysql高级篇(中)——多版本并发控制 MVCC
  • 字体文件压缩
  • 深入 Spring RestTemplate 源码:掌握 HTTP 通信核心技术
  • dockerfile部署springboot项目(构建镜像:ebuy-docker:v1.0)
  • Java高效编程(7):消除过时的对象引用
  • 【计算机网络】详解HTTP请求和响应格式常见请求方法Header报头响应报文状态码URL
  • \?拉普拉斯到底在讲什么\?控制理论\?倒立摆/
  • Linux: network: /proc/net/sockstat 解读