You need to enable JavaScript to run this app.
最新活动
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

为什么要从协议调用函数而不是从结构体?

在swift中,协议通常用于定义一些特定的方法或属性,但是协议本身并不能包含实现。如果需要在多个结构体中使用相同的方法或属性,可以使用协议来定义,而不是在每个结构体中都重新实现一遍。这样可以避免代码重复,并增加代码可读性和可维护性。下面是一个示例:

protocol Person { func sayHello() }

struct Student: Person { func sayHello() { print("Hello, I am a student.") } }

struct Teacher: Person { func sayHello() { print("Hello, I am a teacher.") } }

let student = Student() student.sayHello()

let teacher = Teacher() teacher.sayHello()

在这个示例中,我们定义了一个名为Person的协议,并在Student和Teacher结构体中实现了它的方法。然后我们创建了一个student实例和一个teacher实例,并调用了它们的sayHello方法来执行打招呼的操作。由于Student和Teacher都实现了Person协议中的sayHello方法,所以它们都可以被视为Person类型,并在代码中使用。这种方式可以使代码更加灵活,易于维护和扩展。

本文内容通过AI工具匹配关键字智能整合而成,仅供参考,火山引擎不对内容的真实、准确或完整作任何形式的承诺。如有任何问题或意见,您可以通过联系service@volcengine.com进行反馈,火山引擎收到您的反馈后将及时答复和处理。
展开更多
面向开发者的云福利中心,ECS 60元/年,域名1元起,助力开发者快速在云上构建可靠应用

社区干货

万字长文带你漫游数据结构世界|社区征文

### 为什么有了原码还要反码和补码?我们知道加减法是高频的运算,人可以很直观的看出加号减号,马上就可以算出来,但是计算机如果区分不同的符号,那么加减就会比较复杂,比如正数+正数,正数-正数,正数-负数,负数+负数... 垃圾回收器会收集这种没有被引用的节点,帮我们回收掉了这部分内存,但是为了加快垃圾回收的速度,一般不需要的节点我们需要置空,比如 `node = null`, 如果在`C++` 程序中,那么就需要手动回收了,否则容易造成内存泄漏...

Kubernetes 观测:基于 eBPF 的云原生深度可观测性实践

这给在多协议、多语言场景下统一所有业务线的接入造成了极大挑战。同时,传统 APM 方案也无法对基础设施实施插桩。传统基于 cadvisor 的容器观测方案只能看到 Kernel 主动暴露的数据,而 Kernel 对于 **微服务... 建连起始于用户空间的 socket 框架函数,再来到内核态 L4 层,经过关键函数 tcp\_v4\_connect ,最后建立连接;* 连接建立之后,后续的数据包也是先从用户空间出发,在 L4 层,会经过关键的 tcp\_sendmsg 函数,层层调用之...

sonic:基于 JIT 技术的开源全场景高性能 JSON 库

## 为什么要自研 JSON 库JSON(JavaScript Object Notation) 以其简洁的语法和灵活的自描述能力,被广泛应用于各互联网业务。但是 JSON 由于本质是一种文本协议,且没有类似 Protobuf 的强制模型约束(schema),编解码... (Go struct)与 JSON 语法,将读取到的 value 绑定到对应的模型字段上去,同时完成数据解析与校验;- **查找(get)& 修改(set)** :指定某种规则的查找路径(一般是 key 与 index 的集合),获取需要的那部分 JSON valu...

一文理解 HyperLogLog(HLL) 算法 | 社区征文

这就是利用概率论来估算基数所依据的基本原理。在上述过程中涉及了一个重要步骤,就是将每个待观察的数据进行 hash 操作。为什么需要 hash 操作,而不是直接观察数据本身对应的二进制串呢?这是因为游戏要求每次取... 这是因为每个 HLL 结构体本质上就是一个桶数组。假设要将桶数组 a 和 b 合并成桶数组 c,只需要从 a、b 的对应位置取最大值即可,使用 Python 代码描述如下:```pythondef hll_merge(a, b): m = len(a) c ...

特惠活动

热门爆款云服务器

100%性能独享,更高内存性能更佳,学习测试、web前端、企业应用首选,每日花费低至0.55元
60.00/1212.00/年
立即购买

域名注册服务

cn/top/com等热门域名,首年低至1元,邮箱建站必选
1.00/首年起32.00/首年起
立即购买

DCDN国内流量包100G

同时抵扣CDN与DCDN两种流量消耗,加速分发更实惠
2.00/20.00/年
立即购买

为什么要从协议调用函数而不是从结构体? -优选内容

万字长文带你漫游数据结构世界|社区征文
### 为什么有了原码还要反码和补码?我们知道加减法是高频的运算,人可以很直观的看出加号减号,马上就可以算出来,但是计算机如果区分不同的符号,那么加减就会比较复杂,比如正数+正数,正数-正数,正数-负数,负数+负数... 垃圾回收器会收集这种没有被引用的节点,帮我们回收掉了这部分内存,但是为了加快垃圾回收的速度,一般不需要的节点我们需要置空,比如 `node = null`, 如果在`C++` 程序中,那么就需要手动回收了,否则容易造成内存泄漏...
Kubernetes 观测:基于 eBPF 的云原生深度可观测性实践
这给在多协议、多语言场景下统一所有业务线的接入造成了极大挑战。同时,传统 APM 方案也无法对基础设施实施插桩。传统基于 cadvisor 的容器观测方案只能看到 Kernel 主动暴露的数据,而 Kernel 对于 **微服务... 建连起始于用户空间的 socket 框架函数,再来到内核态 L4 层,经过关键函数 tcp\_v4\_connect ,最后建立连接;* 连接建立之后,后续的数据包也是先从用户空间出发,在 L4 层,会经过关键的 tcp\_sendmsg 函数,层层调用之...
sonic:基于 JIT 技术的开源全场景高性能 JSON 库
## 为什么要自研 JSON 库JSON(JavaScript Object Notation) 以其简洁的语法和灵活的自描述能力,被广泛应用于各互联网业务。但是 JSON 由于本质是一种文本协议,且没有类似 Protobuf 的强制模型约束(schema),编解码... (Go struct)与 JSON 语法,将读取到的 value 绑定到对应的模型字段上去,同时完成数据解析与校验;- **查找(get)& 修改(set)** :指定某种规则的查找路径(一般是 key 与 index 的集合),获取需要的那部分 JSON valu...
一文理解 HyperLogLog(HLL) 算法 | 社区征文
这就是利用概率论来估算基数所依据的基本原理。在上述过程中涉及了一个重要步骤,就是将每个待观察的数据进行 hash 操作。为什么需要 hash 操作,而不是直接观察数据本身对应的二进制串呢?这是因为游戏要求每次取... 这是因为每个 HLL 结构体本质上就是一个桶数组。假设要将桶数组 a 和 b 合并成桶数组 c,只需要从 a、b 的对应位置取最大值即可,使用 Python 代码描述如下:```pythondef hll_merge(a, b): m = len(a) c ...

为什么要从协议调用函数而不是从结构体? -相关内容

字节开源 Monoio :基于 io-uring 的高性能 Rust Runtime

实现出来的代码要比 Async、Await 语法糖去展开的要易读。下面是手动生成状态机的样例。如果用 Async 语法写,可能直接一个 async 函数返回一个 1 就可以;我们手动编写需要自定义一个结构体,并为这个结构体实现 Fut... 调用两次 do http,最后再把两个结果再加一起。这时候如果要手动去实现的话,就会稍微复杂一些,因为会涉及到两个 await 点。一旦涉及到 await,其本质上就变成一个状态机。为什么是状态机呢?因为每次 await 等...

深入剖析 split locks,i++ 可能导致的灾难

为什么会出现这个问题呢?就是因为 ADD 指令不是原子操作,会产生两次内存操作。那怎么解决这个问题呢?既然 ADD 指令在硬件上不是原子的,那么就从软件上加锁来实现原子操作,使 CoreB 的的内存操作在 CoreA 的内存操... QEMU 中的函数 qatomic_inc(ptr),把参数 ptr 指向的内存数据进行进行加 1。```#define qatomic_inc(ptr) ((void) __sync_fetch_and_add(ptr, 1))```原理是调用 GCC 内置的__sync_fetch_and_add 函数,...

【GMP3.11】Webhook通道接入

因此需要客户接口请求响应的数据结构可以直接给出,或者可以直接给出示例curl命令或示例报文数据,而不是只能给出黑盒sdk或代码实现。 客户接口请求参数全部都可以从cdp取出、通过触达配置进行配置、从webhook模板结构中抽取,或者经过简单纯计算过程转换得到,如字符串拼接、值映射等操作。 推送过程必须是一次性完成的,即调用一次接口就可以完成对于一个人(或多个人)的触达,而没有任何前置或后置接口调用操作。 客户自定义接口示...

热门爆款云服务器

100%性能独享,更高内存性能更佳,学习测试、web前端、企业应用首选,每日花费低至0.55元
60.00/1212.00/年
立即购买

域名注册服务

cn/top/com等热门域名,首年低至1元,邮箱建站必选
1.00/首年起32.00/首年起
立即购买

DCDN国内流量包100G

同时抵扣CDN与DCDN两种流量消耗,加速分发更实惠
2.00/20.00/年
立即购买

【社区征文】Compose 为什么可以跨平台?

在架构上从下到上分成多层:- **Compose Compiler**:Kotlin 编译器插件,负责对 Composable 函数的静态检查以及代码生成等。- **Compose Runtime**:负责 Composable 函数的状态管理,以及执行后的渲染树生成和更新... 而不是直接删除。这样可以保证后续元素在 Node Tree 中的对应节点的保留,实现 Node Tree 的增量更新,实现局部刷新,提升性能。# Compose Phases 我们结合前面的介绍,整体看一下 Compose 从源码到上屏的全过程:...

KubeAdmiral支持提供代理 API 供用户访问成员集群资源

type Aggregations struct { metav1.TypeMeta `json:",inline"`}// +k8s:conversion-gen:explicit-from=net/url.Values// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object// Cluster... 代表了调用**`ConnectCluster`**函数的起始点。1. **GetTlsConfigForCluster**: 用于获取与集群相关的TLS配置。TLS配置是用于安全通信的必要配置。1. **Construct Location & Proxy Transport**: 通过对应集群...

CloudWeGo 易用性建设:提升 Go 语言云原生工程效率之路

我们将所有的配置统一收敛到一个结构体,使用 withOption 的形式注入到 Hertz engine 上。**03** **生态建设**----------------------------------------目前我们将一些通用的能力以中间件的形式提供给了大家,这样开发者可以更好的关注业务逻辑,只需要调用中间件就可以使用这些通用的能力。截止当前,我们已经提供了包括认证/授权、安全、性能、HTTP 通用能力、治理观测拓展能力等各类超过 20 个...

Client-go 源码分析之 SharedInformer 及实战| 社区征文

Informer 中主要包含 Controller、Reflector、DeltaFIFO、LocalStore、Lister 和 Processor 六个组件,这篇文章主要从 Controller 来讲,单独拿 Controller 来将,注意 Informer 中的 Controller 和我们 K8s 内部传统... 这里的informer实现是shareIndexInformer NewSharedInformerFactory调用了NewSharedInformerFactoryWithOptions,将返回一个sharedInformerFactory对象```gotype sharedInformerFactory struct { client ...

Android 音频架构| 社区征文

当我们调用某一API时最终是怎么驱动硬件工作的呢?下面我们先看看系统各层音频相关模块及功能。## 1. 各层音频模块![image-20210923112940712-2367782-2367793.png](https://p1-juejin.byteimg.com/tos-cn-i... 这些Struct数据类型内部大多只是函数指针的定义,是一个个句柄。当AudioFlinger/AudioPolicyService初始化时,它们会去寻找系统中最匹配的实现(这些实现驻留在以audio.primary.*,audio.a2dp.*为名的各种库中)来填充这...

API 发布历史

函数说明 2024-03-26 DeleteMediaTosFile QueryMoveObjectTaskInfo SubmitMoveObjectTask 新增媒资管理模块 3 个 API 批量删除 DirectUrl 模式文件 查询跨空间文件迁移任务状态 提交跨空间文件迁移任务 GetMed... Canvas 渲染画布设置结构体新增 Index 和 Ratio 参数 视频剪辑参数 2024 年 01 月发布时间 API 说明 相关文档 2024-01-17 -- Output 编码输出参数结构体新增 CanvasWithMax、CanvasWithRatio、AudioPhaseDetect ...

特惠活动

热门爆款云服务器

100%性能独享,更高内存性能更佳,学习测试、web前端、企业应用首选,每日花费低至0.55元
60.00/1212.00/年
立即购买

域名注册服务

cn/top/com等热门域名,首年低至1元,邮箱建站必选
1.00/首年起32.00/首年起
立即购买

DCDN国内流量包100G

同时抵扣CDN与DCDN两种流量消耗,加速分发更实惠
2.00/20.00/年
立即购买

产品体验

体验中心

云服务器特惠

云服务器
云服务器ECS新人特惠
立即抢购

白皮书

一图详解大模型
浓缩大模型架构,厘清生产和应用链路关系
立即获取

最新活动

爆款1核2G共享型服务器

首年60元,每月仅需5元,限量秒杀
立即抢购

火山引擎增长体验专区

丰富能力激励企业快速增长
查看详情

数据智能VeDI

易用的高性能大数据产品家族
了解详情

一键开启云上增长新空间

立即咨询