Golang(2)-类型系统

Go 语言类型系统详细教程 Go 语言的类型系统设计精良,提供了丰富的类型和强大的特性。基础类型满足了基本的数据表示需求,复合类型允许构建复杂的数据结构,指针类型提供了直接操作内存的能力,接口类型实现了多态和代码的解耦。类型转换虽然需要显式进行,但通过遵循注意事项和最佳实践,可以有效避免数据丢失、运行时错误,确保代码的健壮性和可读性。在实际开发中,需根据场景选择合适的转换方式,优先使用标准库函数,合理处理错误,并通过注释明确转换逻辑,充分发挥 Go 语言类型系统的优势。 阅读详情


更多关于Golang核心编程知识的文章请看:Golang核心编程(0)-目录页


对于面向对象编程的支持Go 语言设计得非常简洁而优雅。简洁之处在于,Go语言并没有沿
袭传统面向对象编程中的诸多概念,比如继承、虚函数、构造函数和析构函数、隐藏的 this 指
针等。优雅之处在于,Go语言对面向对象编程的支持是语言类型系统中的天然组成部分。整个
类型系统通过接口串联,浑然一体。

一、什么是类型系统

1.1、Go语言的类型系统

顾名思义,类型系统是指一个语言的类型体系结构。一个典型的类型系统通常包含如下基本内容:

  • 基础类型,如 byte 、 int 、 bool 、 float 等;
  • 基础类型,如 byte 、 int 、 bool 、 float 等;
  • 复合类型,如数组、结构体、指针等;
  • 可以指向任意对象的类型( Any 类型);
  • 值语义和引用语义;
  • 面向对象,即所有具备面向对象特征(比如成员方法)的类型;
  • 接口。
1.2、Java语言的类型系统

类型系统描述的是这些内容在一个语言中如何被关联。因为Java语言自诞生以来被称为最纯正的面向对象语言,所以我们就先以Java语言为例讲一讲类型系统。

在Java语言中,存在两套完全独立的类型系统:一套是值类型系统,主要是基本类型,如 byte 、
int 、 boolean 、 char 、 double 等,这些类型基于值语义;一套是以 Object 类型为根的对象类型系统,这些类型可以定义成员变量和成员方法,可以有虚函数,基于引用语义,只允许在堆上创建(通过使用关键字 new )。Java语言中的 Any 类型就是整个对象类型系统的根—— java.lang.Object类型,只有对象类型系统中的实例才可以被 Any 类型引用。

二、为类型添加方法

Go语言中的大多数类型都是值语义,并且都可以包含对应的操作方法。在需要
的时候,你可以给任何类型(包括内置类型)“增加”新方法。而在实现某个接口时,无需从该接口继承(事实上,Go语言根本就不支持面向对象思想中的继承语法),只需要实现该接口要求的所有方法即可
。任何类型都可以被 Any 类型引用。 Any 类型就是空接口,即 interface{} 。

2.1、为基本类型添加方法

在Go语言中,你可以给任意类型(包括内置类型,但不包括指针类型)添加相应的方法,例如:

type Integer int
func (a Integer) Less(b Integer) bool {
	return a < b
}

在这个例子中,我们定义了一个新类型 Integer ,它和 int 没有本质不同,只是它为内置的int 类型增加了个新方法 Less() 。这样实现了 Integer 后,就可以让整型像一个普通的类一样使用:

func main() {
var a Integer = 1
if a.Less(2) {
	fmt.Println(a, "Less 2")
}
}
2.2、传递指针参数和值参数的区别

Go语言中的面向对象最为直观,也无需支付额外的成本。如果要求对象必须以指针传递,这有时会是个额外成本,因为对象有时很小(比如4字节),用指针传递并不划算。

只有在你需要修改对象的时候,才必须用指针。它不是Go语言的约束,而是一种自然约束。

func (a *Integer) Add(b Integer) {
	*a += b
}

这里为 Integer 类型增加了 Add() 方法。由于 Add() 方法需要修改对象的值,所以需要用指针引用。 调用如下:

func main() {
   var a Integer = 1
   a.Add(2)
   fmt.Println("a =", a)
}

运行该程序,得到的结果是: a=3 。如果你实现成员方法时传入的不是指针而是值(即传入Integer ,而非 *Integer ),如下所示:

func (a Integer) Add(b Integer) {
	a += b
}

那么运行程序得到的结果是 a=1 ,也就是维持原来的值。

究其原因,是因为Go语言和C语言一样,类型都是基于值传递的。要想修改变量的值,只能传递指针。

三、结构体

Go语言的结构体(struct)和其他语言的类(class)有同等的地位,但Go语言放弃了包括继承在内的大量面向对象特性,只保留了组合(composition)这个最基础的特性。

组合甚至不能算面向对象特性,因为在C语言这样的过程式编程语言中,也有结构体,也有组合。组合只是形成复合类型的基础。

3.1、结构体的定义
type Rect struct {
	x, y float64
	width, height float64
}
3.2、结构体的初始化
	rect1 := new(Rect)
	rect2 := &Rect{}
	rect3 := &Rect{0, 0, 100, 200}
	rect4 := &Rect{width: 100, height: 200}

在Go语言中,未进行显式初始化的变量都会被初始化为该类型的零值,例如 bool 类型的零值为 false , int 类型的零值为0, string 类型的零值为空字符串。

在Go语言中没有构造函数的概念,对象的创建通常交由一个全局的创建函数来完成,以NewXXX 来命名,表示“构造函数”:

func NewRect(x, y, width, height float64) *Rect {
	return &Rect{x, y, width, height}
}
3.3、可见性

Go语言对关键字的增加非常吝啬,其中没有 private 、 protected 、 public 这样的关键
字。要使某个符号对其他包(package)可见(即可以访问),需要将该符号定义为以大写字母开头,如:

type Rect struct {
	X, Y float64
	Width, Height float64
}

这样, Rect 类型的成员变量就全部被导出了,可以被所有其他引用了 Rect 所在包的代码访问到。

从零实现反激式电源仿真:LTspice高级应用实例 深入解析反激式开关电源的建模与仿真过程,利用LTspice实现从零搭建电路,精准验证电路仿真效果,提升电源设计效率与可靠性。 阅读详情

相关推荐

FreeRTOS CLI实战:5分钟搞定GD32串口终端移植(附LED控制源码)

本文详细介绍了如何在GD32芯片上快速移植FreeRTOS CLI(Command Line Interface)终端,实现串口交互式调试。通过DMA+空闲中断配置和LED控制命令实战,开发者可在5分钟内构建高效嵌入式调试工具,显著提升现场维护效率。

weixin_28707365的博客 450

Go语言基础08(面向对象(方法))

Go语言基础(面向对象)一、面向对象程序设计思想1.1 对象1.2 对象的状态1.3 对象的操作二、Method 方法2.1 Method 的基本定义 一、面向对象程序设计思想 \quad Go语言支持面向对象程序设计思想。面向对象(Object Oriented, OO)就是将要研究的事物抽象成对象,然后对对象的状态和行为进行定义。 1.1 对象 \quad 在Go语言里,对象(Object)可以是最简单的内置数据类型,或者是复杂的结构体。对象不仅能表示具体的事物,还能表示抽象的规则、计划或事件。 ...

m0_52650517的博客 582

OpenCV快速入门:绘制图形、图像金字塔和感兴趣区域

OpenCV是一个强大的计算机视觉库,广泛应用于图像处理、计算机视觉和机器学习等领域。本文将介绍OpenCV中的一些基础功能,包括如何绘制图形、创建图像金字塔以及如何处理感兴趣区域(ROI)。

吾家有猫名探花的博客 1963

Golang随手记

1、slice和数组的区别 (1)go是有数组的,只是平时用切片比较多。数组大小一旦创建就不能改变,数组长度大于元素个数的时候会用0补位,这跟其他语言是相通的。 (2)切片slice可以看作是对数组的一切操作,它是一个引用数据类型,其数据结构包括底层数组的地址,以及元素可操作长度len或可扩容长度cap。 (3)要想突破slice的扩容cap限制进行无限扩容就需要使用append()函数进行操作。如果append追加的元素后slice的总长度不超过底层数组的总长度,那么slice引用的地址不会发生改变,反之

javanmsl的博客 820

华为 S2600T 存储 3 种网络端口(H4/H5/串口)用途解析与故障恢复实战

本文深度解析华为S2600T存储设备的三种关键网络端口(H4/H5/串口)的功能用途与故障恢复方法。通过详细的配置指南和实战案例,帮助管理员掌握管理接口(H4)的日常运维、维护接口(H5)的高级应用以及串口的应急操作,提升存储设备的可靠性和维护效率。

weixin_30899023的博客 339

华为OD机试2025C卷 - 精准核酸检测 (C++ & Python & JAVA & JS & GO)

华为OD机试2025C卷 精准核酸检测,提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解

qq_45776114的博客 1710

Golang系列(二)之面向对象编程

面向对象编程:        把一组数据结构和处理它们的方法组成对象(object),把相同行为的对象归纳为类(class),通过类的封装(encapsulation)隐藏内部细节,通过继承(inheritance)实现类的特化(specialization)[方法的重写,子类不同于父类的特性]/泛化(generalization)[共性,子类都拥有父类的特性],通过多态(polymorph

胡伟煌的博客 5836

ArcGIS Pro 3.4 二次开发 - 布局

本文介绍了在ArcGIS Pro SDK 3.4和.NET 8环境下操作布局工程项的相关方法。主要内容包括:引用布局工程项和关联布局,在新视图中打开或激活已有布局视图,引用活动布局视图,导入/移除布局工程项,创建基本布局或带参考线的自定义布局,修改布局页面尺寸,以及创建圆形图形元素等操作。重点演示了如何通过CIM(Core Infrastructure Model)进行高级布局配置,并详细说明了圆形图形元素的创建过程,包括几何构建、符号设置和图形生成。所有涉及UI线程的操作都遵循ArcGIS Pro SDK

Winemonk 795

go是面向对象语言吗?

转载链接:https://segmentfault.com/a/1190000001832282#articleHeader5原文链接:http://spf13.com/post/is-go-object-oriented前言面向对象的含义引入了对象(object)、类(class)、继承(inheritance)、子类(subclass)、虚方法(virtual method)、协程(corou...

每天进步一点点。。。的博客 1万+

在Android中实现SIM卡的读写操作

在上述代码中,我们创建了一个PhoneStateListener的实例,并重写了onSimStateChanged方法来处理SIM卡状态改变的事件。然后,我们通过调用telephonyManager的listen方法注册了这个监听器,并指定了要监听的事件类型为SIM卡状态的改变。在上述代码中,我们调用telephonyManager的sendUssdRequest方法来发送USSD命令,并通过TelephonyManager.UssdResponseCallback来处理USSD响应和发送失败的情况。

2301_79326510的博客 927

Vue+OpenLayers:解决中国境内OpenStreetMap地图加载问题

然而,在使用OpenLayers和Vue框架搭建地图应用时,很多中国开发者可能会遇到一个常见问题:OpenStreetMap(OSM)地图无法正常加载。为了解决这个问题,我们可以使用其他方式获取地图数据,比如使用国内的地图服务提供商。通过使用国内地图服务商提供的地图数据,我们可以解决OpenStreetMap地图加载问题。然后,我们创建一个OpenLayers地图对象,并指定地图图层的源为国内地图服务商提供的地图URL。属性,可以将地图的中心点和缩放级别调整到我们需要的位置。

CodeWhizZ的博客 8275

GO语言学习笔记———object

GO独特的面向对象 1、GO面向对象与c++、java、python这些经典面向对象语言不同,它没有class这个关键字也没有继承,所以它不算面向对象,个人觉得只能算是用结构体和指针模拟面向对象的思想 封装一个类: type student struct { gender string age int name string class string } 对象初始化的三种...

weixin_43256892的博客 1328

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Go语言的类型系统(2),这些年Golang面试的那些套路

这次我们定义的变量bill是指针类型的,用指针类型的变量来调用noify方法的时候,依然能够输出bill的name属性值。看到这里或许你有些疑惑,不是说方法notify中的变量u就等同于变量bill吗,为啥bill是一个指针类型的时候还能够正确输出name属性值呢。当我们通过bill.notify()调用方法的时候,notify方法中的u变量的值就等同于变量bill。因为变量u是bill的一个副本,所以改变它里面属性的值,是不会影响bill本身的值的。1024b (备注Go)**

2401_84267735的博客 786

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Go进阶概览 - 【2.6 类型系统的安全与限制】

在之前的章节中,我们讲到了基础数据类型的内存布局、动态类型的底层结构及内存分配、切片及`map`的底层结构及原理。 本节我们将针对类型系统的安全及限制进行探讨,主要针对设计原则、安全性、灵活性以及局限性进行探讨。

Swxctx 1149

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

reflect2类型系统深度剖析:TypeByName的实现原理与Go反射优化终极指南

在Go语言开发中,反射(reflection)是一个强大但性能敏感的特性。**reflect2**作为标准库reflect的高性能替代方案,通过TypeByName等高级功能为开发者提供了更高效的反射操作体验。本文将深入剖析reflect2的TypeByName实现原理,揭示其如何避免runtime reflect.Value开销,成为Go反射优化的终极解决方案。 ## 🔍 为什么需要refl

gitblog_00479的博客 342

BurntSushi/toml v2版本路线图:全面解析Go TOML解析器的未来创新特性

作为Go语言社区最受欢迎的TOML解析器库之一,BurntSushi/toml凭借其简洁的API设计和出色的性能赢得了众多开发者的青睐。随着TOML配置格式在云原生应用、容器化部署和配置文件管理中的广泛应用,BurntSushi/toml项目团队正在积极规划v2版本的重大更新。本文将深入解析v2版本的路线图、创新特性以及对Go开发者的影响。 ## 🔍 当前版本现状与v2版本的必要性 Burn

gitblog_00024的博客 729

c2go高级技巧:10个提升转换质量的最佳实践

c2go是一款强大的C到Go代码转换工具,能够帮助开发者快速将C项目迁移到Go语言环境。本文将分享10个经过实践验证的高级技巧,帮助你显著提升转换质量和效率,轻松应对复杂的代码迁移挑战。 ## 1. 深入理解类型系统差异 C和Go的类型系统存在显著差异,这是转换过程中最容易出现问题的环节。特别注意以下几点: - 无符号整数处理:C中的`unsigned int`在Go中需对应`uint`类型

gitblog_01403的博客 440

深入解析c2go:如何利用Clang AST实现C到Go的精准转换

c2go是一款强大的C到Go代码转换工具,它利用Clang AST(抽象语法树)实现C代码到Go代码的精准转换。本文将详细介绍c2go的工作原理、核心技术以及如何使用这款工具将C代码高效地转换为Go代码。 ## c2go简介:C到Go转换的终极解决方案 🚀 c2go是一个开源项目,旨在提供C到Go的自动化代码转换功能。它通过解析C代码生成Clang AST,然后将其转换为Go AST,最终生

gitblog_01415的博客 374

go-json核心组件解析:编码器、解码器与运行时类型系统

go-json 是 Go 语言中最快的 JSON 编码器/解码器库之一,完全兼容标准库 encoding/json。本文深入解析其三大核心组件:高性能编码器、优化解码器和运行时类型系统,帮助开发者理解其卓越性能背后的技术原理。🚀 ## 为什么 go-json 如此快速? go-json 通过创新的技术架构实现了比标准库快 2-5 倍的性能提升。它不仅仅是简单的优化,而是重新设计了整个 JSO

gitblog_00961的博客 363

Go 开发关键技术指南 | 为什么你要选择 GO?(内含超全知识大图)

作者 | 杨成立(忘篱) 阿里巴巴高级技术专家 关注“阿里巴巴云原生”公众号,回复 Go 即可查看清晰知识大图! 导读:从问题本身出发,不局限于 Go 语言,探讨服务器中常常遇到的问题,最后回到 Go 如何解决这些问题,为大家提供 Go 开发的关键技术指南。我们将以系列文章的形式推出《Go 开发的关键技术指南》,共有 4 篇文章,本文为第 1 篇。 Go 开发指南大图 Overvi...

阿里巴巴云原生的博客 605

Go开发关键技术指南

Go开发关键技术指南 原图链接地址:https://www.processon.com/view/link/5df22829e4b010171a411e7d#map 感谢阿里巴巴云原生微信公众号转载了这篇文章,给了很重要的改进建议,从Markdown转微信公众号也做了大量工作,配图和排版让阅读变成一种享受。如果你更习惯微信阅读,可以读下面四章: Go 开发关键技术指南 | 为什么你要选择 G...

OSSRS 8714

Golang 基础 《Go web编程》 读书笔记 第一章

第一章:Go 环境配置 Go 环境配置: Go是一种新的语言,一种并发的、带垃圾回收的、快速编译的语言。 它可以在一台计算机上用几秒钟的时间编译一个大型的Go程序。 Go为软件构造提供了一种模型,它使依赖分析更加容易,且避免了大部分C风格include文件与库的开头。 Go是静态类型的语言,它的类型系统没有层级。因此用户不需要在定义类型之间的关系上花费时间,这样感觉起...

jiaotangdasuan的博客 216

golang类型系统

Go语言的类型系统旨在提供一个安全、高效且并发友好的开发环境。它通过强调静态类型、强类型、显式类型转换以及零值初始化来减少运行时错误。同时,通过接口实现多态,避免了传统面向对象继承的复杂性,使得代码更加简洁和可维护。Go的类型系统是其成功和流行的重要基石之一。

mirana的专栏 1664

golang调用webview,webview2,go-webview2

golang调用webview,webview2,go-webview2

猛犸象 3124

Go 和 Golang 有什么关系?

大家好,我是煎鱼。最近天气也冷了,掐指一算是招聘季了,无论是校招、社招、HR、面试官们都蠢蠢欲动。这不,我有一个朋友的 HR 朋友都有起名困难了,一看 Go 语言的工作说明(Job Des...

EDDYCJY的博客 1万+

探索Golang的类型系统秘密

1.背景介绍 Golang是一种现代编程语言,它在性能、安全性和可维护性方面具有显著优势。Golang的类型系统是其核心特性之一,它为开发人员提供了一种强大的类型检查和代码优化机制。然而,Golang的类型系统仍然存在一些神秘之处,这使得许多开发人员难以充分利用其潜力。 在本文中,我们将探索Golang的类型系统秘密,揭示其背后的概念和原理。我们将讨论Golang类型系统的核心概念,以及如何使...

AI天才研究院 998
上一篇: Golang(5)-函数和错误处理
下一篇: Golang(5)-接口
BoringRong
BoringRong 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 2万+粉丝 386原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BoringRong

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值