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

Chromium 如何查找已经定义好的mojom函数实现c++

进程通信定义通常都是用.mojom文件或者idl文件格式

以content\common\frame.mojom里面的BeginNavigation函数为例。

一、如何查找BeginNavigation函数定义,在vscode里面直接搜索BeginNavigation,过滤条件

*.idl,*.mojom,*.cc

效果:

这样定义mojom找到了。

content\common\frame.mojom定义如下(截取部分):

  // Sent by the renderer to request a navigation.// |blob_url_token| should be non-null when this is a navigation to a blob:// URL. The token will then be used to look up the blob associated with the// blob URL. Without this by the time the navigation code starts fetching// the URL the blob URL might no longer be valid. |blob_url_token| is// not part of BeginNavigationParams because that struct needs to be// cloneable, and thus can't contain mojo interfaces.// If an invalid BlobURLToken is passed in, or if the token doesn't match the// url in |common_params|, the navigation will result in a network error.// |navigation_client| is passed to the renderer to allow for further control// of the navigation. Allows for Commit and Cancels/Aborts.// Passing the |initiator_policy_container_keep_alive_handle| is just a means// to ensure that the PolicyContainerHost of the initiator RenderFrameHost is// kept alive, even if the RenderFrameHost itself has already been deleted in// the meantime. If this can be ensured in other ways, it is safe to pass a// mojo::NullRemote. In particular, if the initiator LocalFrame is alive when// issuing this mojo call, there is no need to pass// |initiator_policy_container_keep_alive_handle|, since the initiator// PolicyContainerHost is kept alive by LocalFrame's PolicyContainer.// TODO(https://crbug.com/1467502): |navigation_client| should not be// optional. Make it mandatory.// |renderer_cancellation_listener| is a per-navigation interface used to// listen to the end of the renderer-initiated navigation cancelation window// for this navigation. See comment for NavigationRendererCancellationListener// for more details.BeginNavigation(blink.mojom.CommonNavigationParams common_params,blink.mojom.BeginNavigationParams begin_params,pending_remote<blink.mojom.BlobURLToken>? blob_url_token,pending_associated_remote<NavigationClient>? navigation_client,pending_remote<blink.mojom.PolicyContainerHostKeepAliveHandle>?initiator_policy_container_keep_alive_handle,pending_receiver<NavigationRendererCancellationListener>renderer_cancellation_listener);

注意mojom文件编译时候会自动生成以下两个文件

out\Debug\gen\content\common\frame.mojom.cc

out\Debug\gen\content\common\frame.mojom.h

二、在vscode搜索BeginNavigation实现代码

第一部分、out\Debug\gen\+对应mojom文件相对目录.h这样存放

 例子:  out\Debug\gen\content\common\frame.mojom.h

              out\Debug\gen\content\common\frame.mojom.cc

    1)、发送方会调用在 ::mojo::internal::SendMojoMessage前设置好message.set_method_name("BeginNavigation");

知道此处打断点即可,可以不用想继续搜索发送方是谁了。

   看下规律frame.mojom.cc

void FrameHostProxy::BeginNavigation(::blink::mojom::CommonNavigationParamsPtr in_common_params, ::blink::mojom::BeginNavigationParamsPtr in_begin_params, ::mojo::PendingRemote<::blink::mojom::BlobURLToken> in_blob_url_token, ::mojo::PendingAssociatedRemote<::content::mojom::NavigationClient> in_navigation_client, ::mojo::PendingRemote<::blink::mojom::PolicyContainerHostKeepAliveHandle> in_initiator_policy_container_keep_alive_handle, ::mojo::PendingReceiver<NavigationRendererCancellationListener> in_renderer_cancellation_listener) {
#if BUILDFLAG(MOJO_TRACE_ENABLED)TRACE_EVENT1("mojom", "Send content::mojom::FrameHost::BeginNavigation", "input_parameters",[&](perfetto::TracedValue context){auto dict = std::move(context).WriteDictionary();perfetto::WriteIntoTracedValueWithFallback(dict.AddItem("common_params"), in_common_params,"<value of type ::blink::mojom::CommonNavigationParamsPtr>");perfetto::WriteIntoTracedValueWithFallback(dict.AddItem("begin_params"), in_begin_params,"<value of type ::blink::mojom::BeginNavigationParamsPtr>");perfetto::WriteIntoTracedValueWithFallback(dict.AddItem("blob_url_token"), in_blob_url_token,"<value of type ::mojo::PendingRemote<::blink::mojom::BlobURLToken>>");perfetto::WriteIntoTracedValueWithFallback(dict.AddItem("navigation_client"), in_navigation_client,"<value of type ::mojo::PendingAssociatedRemote<::content::mojom::NavigationClient>>");perfetto::WriteIntoTracedValueWithFallback(dict.AddItem("initiator_policy_container_keep_alive_handle"), in_initiator_policy_container_keep_alive_handle,"<value of type ::mojo::PendingRemote<::blink::mojom::PolicyContainerHostKeepAliveHandle>>");perfetto::WriteIntoTracedValueWithFallback(dict.AddItem("renderer_cancellation_listener"), in_renderer_cancellation_listener,"<value of type ::mojo::PendingReceiver<NavigationRendererCancellationListener>>");});
#endifconst bool kExpectsResponse = false;const bool kIsSync = false;const bool kAllowInterrupt = true;const bool is_urgent = false;const uint32_t kFlags =((kExpectsResponse) ? mojo::Message::kFlagExpectsResponse : 0) |((kIsSync) ? mojo::Message::kFlagIsSync : 0) |((kAllowInterrupt) ? 0 : mojo::Message::kFlagNoInterrupt) |((is_urgent) ? mojo::Message::kFlagIsUrgent : 0);mojo::Message message(internal::kFrameHost_BeginNavigation_Name, kFlags, 0, 0, nullptr);mojo::internal::MessageFragment<::content::mojom::internal::FrameHost_BeginNavigation_Params_Data> params(message);params.Allocate();mojo::internal::MessageFragment<typename decltype(params->common_params)::BaseType> common_params_fragment(params.message());mojo::internal::Serialize<::blink::mojom::CommonNavigationParamsDataView>(in_common_params, common_params_fragment);params->common_params.Set(common_params_fragment.is_null() ? nullptr : common_params_fragment.data());MOJO_INTERNAL_DLOG_SERIALIZATION_WARNING(params->common_params.is_null(),mojo::internal::VALIDATION_ERROR_UNEXPECTED_NULL_POINTER,"null common_params in FrameHost.BeginNavigation request");mojo::internal::MessageFragment<typename decltype(params->begin_params)::BaseType> begin_params_fragment(params.message());mojo::internal::Serialize<::blink::mojom::BeginNavigationParamsDataView>(in_begin_params, begin_params_fragment);params->begin_params.Set(begin_params_fragment.is_null() ? nullptr : begin_params_fragment.data());MOJO_INTERNAL_DLOG_SERIALIZATION_WARNING(params->begin_params.is_null(),mojo::internal::VALIDATION_ERROR_UNEXPECTED_NULL_POINTER,"null begin_params in FrameHost.BeginNavigation request");mojo::internal::Serialize<mojo::InterfacePtrDataView<::blink::mojom::BlobURLTokenInterfaceBase>>(in_blob_url_token, &params->blob_url_token, &params.message());mojo::internal::Serialize<::content::mojom::NavigationClientAssociatedPtrInfoDataView>(in_navigation_client, &params->navigation_client, &params.message());mojo::internal::Serialize<mojo::InterfacePtrDataView<::blink::mojom::PolicyContainerHostKeepAliveHandleInterfaceBase>>(in_initiator_policy_container_keep_alive_handle, &params->initiator_policy_container_keep_alive_handle, &params.message());mojo::internal::Serialize<mojo::InterfaceRequestDataView<::content::mojom::NavigationRendererCancellationListenerInterfaceBase>>(in_renderer_cancellation_listener, &params->renderer_cancellation_listener, &params.message());MOJO_INTERNAL_DLOG_SERIALIZATION_WARNING(!mojo::internal::IsHandleOrInterfaceValid(params->renderer_cancellation_listener),mojo::internal::VALIDATION_ERROR_UNEXPECTED_INVALID_HANDLE,"invalid renderer_cancellation_listener in FrameHost.BeginNavigation request");#if defined(ENABLE_IPC_FUZZER)message.set_interface_name(FrameHost::Name_);message.set_method_name("BeginNavigation");
#endif// This return value may be ignored as false implies the Connector has// encountered an error, which will be visible through other means.::mojo::internal::SendMojoMessage(*receiver_, message);
}
2)、接收方BeginNavigation 定义如下out\Debug\gen\content\common\frame.mojom.cc
  有类似这样的字样就是实现方 impl->BeginNavigation
    case internal::kFrameHost_BeginNavigation_Name: {DCHECK(message->is_serialized());internal::FrameHost_BeginNavigation_Params_Data* params =reinterpret_cast<internal::FrameHost_BeginNavigation_Params_Data*>(message->mutable_payload());bool success = true;::blink::mojom::CommonNavigationParamsPtr p_common_params{};::blink::mojom::BeginNavigationParamsPtr p_begin_params{};::mojo::PendingRemote<::blink::mojom::BlobURLToken> p_blob_url_token{};::mojo::PendingAssociatedRemote<::content::mojom::NavigationClient> p_navigation_client{};::mojo::PendingRemote<::blink::mojom::PolicyContainerHostKeepAliveHandle> p_initiator_policy_container_keep_alive_handle{};::mojo::PendingReceiver<NavigationRendererCancellationListener> p_renderer_cancellation_listener{};FrameHost_BeginNavigation_ParamsDataView input_data_view(params, message);if (success && !input_data_view.ReadCommonParams(&p_common_params))success = false;if (success && !input_data_view.ReadBeginParams(&p_begin_params))success = false;if (success) {p_blob_url_token =input_data_view.TakeBlobUrlToken<decltype(p_blob_url_token)>();}if (success) {p_navigation_client =input_data_view.TakeNavigationClient<decltype(p_navigation_client)>();}if (success) {p_initiator_policy_container_keep_alive_handle =input_data_view.TakeInitiatorPolicyContainerKeepAliveHandle<decltype(p_initiator_policy_container_keep_alive_handle)>();}if (success) {p_renderer_cancellation_listener =input_data_view.TakeRendererCancellationListener<decltype(p_renderer_cancellation_listener)>();}if (!success) {ReportValidationErrorForMessage(message,mojo::internal::VALIDATION_ERROR_DESERIALIZATION_FAILED,FrameHost::Name_, 5, false);return false;}// A null |impl| means no implementation was bound.DCHECK(impl);impl->BeginNavigation(
std::move(p_common_params), 
std::move(p_begin_params), 
std::move(p_blob_url_token), 
std::move(p_navigation_client), 
std::move(p_initiator_policy_container_keep_alive_handle), 
std::move(p_renderer_cancellation_listener));return true;}

  第二部分、子进程定义

                   content\renderer\render_frame_impl.cc

  GetFrameHost()->BeginNavigation(MakeCommonNavigationParams(frame_->GetSecurityOrigin(), std::move(info),load_flags, has_download_sandbox_flag, from_ad,is_history_navigation_in_new_child_frame,request_destination),std::move(begin_navigation_params), std::move(blob_url_token),std::move(navigation_client_remote),std::move(initiator_policy_container_keep_alive_handle),std::move(renderer_cancellation_listener_receiver));

其中GetFrameHost()和FrameHostProxy对应关系很是巧妙。

mojom::FrameHost* RenderFrameImpl::GetFrameHost() {

  if (!frame_host_remote_.is_bound())

    GetRemoteAssociatedInterfaces()->GetInterface(&frame_host_remote_);

  return frame_host_remote_.get();

}

FrameHost和FrameHostProxy是同一个类吗?

先看mojo::AssociatedRemote<mojom::FrameHost> frame_host_remote_;定义

其中用模板对象AssociatedRemote初始化,那么看下定义

template <typename Interface>class AssociatedRemote {public:using InterfaceType = Interface;using PendingType = PendingAssociatedRemote<Interface>;using Proxy = typename Interface::Proxy_;

mojo::AssociatedRemote类的Proxy替换完之后是mojom::FrameHost::Proxy_;

那么在看FrameHost定义

class CONTENT_EXPORT FrameHost: public FrameHostInterfaceBase {public:using IPCStableHashFunction = uint32_t(*)();static const char Name_[];static IPCStableHashFunction MessageToMethodInfo_(mojo::Message& message);static const char* MessageToMethodName_(mojo::Message& message);static constexpr uint32_t Version_ = 0;static constexpr bool PassesAssociatedKinds_ = true;static inline constexpr uint32_t kSyncMethodOrdinals[] = {0};static constexpr bool HasUninterruptableMethods_ = false;using Base_ = FrameHostInterfaceBase;using Proxy_ = FrameHostProxy;

其中将using Proxy_ = FrameHostProxy;

至此FrameHost和FrameHostProxy完成了关联 其实是一个巧妙的用了模板和using。

这样在mojo::AssociatedRemote类带哦用get函数时候直接获取的是FrameHostProxy。

  typename Interface::Proxy_* get() const {

    DCHECK(is_bound())

        << "Cannot issue Interface method calls on an unbound AssociatedRemote";

    return internal_state_.instance();

  }

  第三部分、主进程定义

content\browser\renderer_host\render_frame_host_impl.cc

void RenderFrameHostImpl::BeginNavigation(blink::mojom::CommonNavigationParamsPtr unvalidated_common_params,blink::mojom::BeginNavigationParamsPtr begin_params,mojo::PendingRemote<blink::mojom::BlobURLToken> blob_url_token,mojo::PendingAssociatedRemote<mojom::NavigationClient> navigation_client,mojo::PendingRemote<blink::mojom::PolicyContainerHostKeepAliveHandle>initiator_policy_container_host_keep_alive_handle,mojo::PendingReceiver<mojom::NavigationRendererCancellationListener>renderer_cancellation_listener) {TRACE_EVENT("navigation", "RenderFrameHostImpl::BeginNavigation",ChromeTrackEvent::kRenderFrameHost, this, "url",unvalidated_common_params->url.possibly_invalid_spec());// Only active and prerendered documents are allowed to start navigation in// their frame.if (lifecycle_state() != LifecycleStateImpl::kPrerendering) {// If this is reached in case the RenderFrameHost is in BackForwardCache// evict the document from BackForwardCache.if (IsInactiveAndDisallowActivation(DisallowActivationReasonId::kBeginNavigation)) {return;}}

     

总结:搜索其他模块也是类似,debug/gen目录是mojom文件具体实现,其他的是发送和接收实现,找到对应参数定义函数即可。

相关文章:

Chromium 如何查找已经定义好的mojom函数实现c++

进程通信定义通常都是用.mojom文件或者idl文件格式 以content\common\frame.mojom里面的BeginNavigation函数为例。 一、如何查找BeginNavigation函数定义&#xff0c;在vscode里面直接搜索BeginNavigation&#xff0c;过滤条件 *.idl,*.mojom,*.cc 效果&#xff1a; 这样…...

图文深入理解Oracle DB Scheduler(续)-调度的创建

List item 今天是国庆假期最后一天。窗外&#xff0c;秋雨淅淅沥沥淅淅下个不停。继续深宅家中&#xff0c;闲来无事&#xff0c;就多写几篇博文。 本篇承接前一篇&#xff0c;继续图文深入介绍Oracle DB Scheduler。本篇主要介绍调度的创建。 1. 创建基于时间的作业 • 可以…...

基于Springboot的宠物咖啡馆平台的设计与实现(源码+定制+参考)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…...

Conda答疑

文章目录 优雅的使用Conda管理python环境1. conda info -e 和conda env list区别2.conda创建环境 创建的新环境在哪个文件夹下3. 自定义路径4. anaconda 新建环境 包是来自哪里4.1. 默认 Anaconda 仓库4.2. Conda-Forge4.3. 镜像源4.4. 自定义频道4.5. 总结 5. conda config --…...

Python 工具库每日推荐【PyPDF2】

文章目录 引言Python PDF 处理库的重要性今日推荐:PyPDF2 工具库主要功能:使用场景:安装与配置快速上手示例代码代码解释实际应用案例案例:PDF文件合并案例分析高级特性加密和解密PDF添加水印扩展阅读与资源优缺点分析优点:缺点:总结【 已更新完 TypeScript 设计模式 专栏…...

Nacos的应用

什么是nacos&#xff1f; Nacos是一个开源的动态服务发现&#xff0c;配置管理和服务治理平台。主要用于构建原生应用和微服务架构。它是阿里巴巴开源的项目&#xff0c;整合了配置管理&#xff0c;服务管理&#xff0c;服务发现的功能&#xff0c;核心价值在于帮助用户在云平…...

CSS圆角

在制作网页的过程中&#xff0c;有时我们可能需要实现圆角的效果&#xff0c;以前的做法是通过切图&#xff08;将设计稿切成便于制作成页面的图片&#xff09;&#xff0c;使用多个背景图像来实现圆角。在 CSS3 出现之后就不需要这么麻烦了&#xff0c;CSS3 中提供了一系列属性…...

信息安全工程师(37)防火墙概述

前言 防火墙是一种网络安全系统&#xff0c;旨在监控和控制网络流量&#xff0c;根据预定义的安全规则决定是否允许数据包的传输。 一、定义与功能 定义&#xff1a;防火墙是网络安全的第一道防线&#xff0c;由硬件设备和软件系统共同构成&#xff0c;位于外网与内网之间、公共…...

多元化网络团队应对复杂威胁

GenAI、ML 和 IoT 等技术为威胁者提供了新的工具&#xff0c;使他们更容易针对消费者和组织发起攻击。 从诱骗受害者陷入投资骗局的Savvy Seahorse &#xff0c;到使用 ChatGPT 之类的程序感染计算机并阅读电子邮件的自我复制 AI 蠕虫&#xff0c;新的网络威胁几乎每天都在出现…...

Observer(观察者模式)

1. 意图 定义对象间的一种一对多的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;所有依赖于它的对象都得到通知并被自动更新。 在观察者模式中&#xff0c;有两类对象&#xff1a;被观察者&#xff08;Subject&#xff09;和观察者&#xff08;Observer&#xf…...

Python深度学习进阶与前沿应用:注意力机制、Transformer模型、生成式模型、目标检测算法、图神经网络、强化学习等

近年来&#xff0c;伴随着以卷积神经网络&#xff08;CNN&#xff09;为代表的深度学习的快速发展&#xff0c;人工智能迈入了第三次发展浪潮&#xff0c;AI技术在各个领域中的应用越来越广泛。为了帮助广大学员更加深入地学习人工智能领域最近3-5年的新理论与新技术&#xff0…...

24.1 prometheus-exporter管理

本节重点介绍 : exporter 流派 必须和探测对象部署在一起的1对多的远端探针模式 exporter管控的难点 1对1 的exporter 需要依托诸如 ansible等节点管理工具 &#xff0c;所以应该尽量的少 1对1的exporter改造成探针型的通用思路 exporter 流派 必须和探测对象部署在一起的…...

【Arduino IDE安装】Arduino IDE的简介和安装详情

目录 &#x1f31e;1. Arduino IDE概述 &#x1f31e;2. Arduino IDE安装详情 &#x1f30d;2.1 获取安装包 &#x1f30d;2.2 安装详情 &#x1f30d;2.3 配置中文 &#x1f30d;2.4 其他配置 &#x1f31e;1. Arduino IDE概述 Arduino IDE&#xff08;Integrated Deve…...

『网络游戏』自适应制作登录UI【01】

首先创建项目 修改场景名字为SceneLogin 创建一个Plane面板 - 将摄像机照射Plane 新建游戏启动场景GameRoot 新建空节点重命名为GameRoot 在子级下创建Canvas 拖拽EventSystem至子级 在Canvas子级下创建空节点重命名为LoginWnd - 即登录窗口 创建公告按钮 创建字体文本 创建输入…...

用Manim简单解释奇异值分解(SVD)和图像处理方面的应

一&#xff0c;介绍 奇异值分解&#xff08;SVD&#xff09;是一种重要的矩阵分解技术&#xff0c;在统计学、信号处理和机器学习等领域有广泛应用。对于任意给定的矩阵 A&#xff08;可以是任意形状的矩阵&#xff09;&#xff0c;SVD将其分解为三个特定的矩阵的乘积&#x…...

红外变电站分割数据集,标注为json格式,总共有5类,避雷器(289张),绝缘子(919张),电流互感器(413张),套管(161张),电压互感器(153张)

红外变电站分割数据集&#xff0c;标注为json格式&#xff0c;总共有5类 避雷器&#xff08;289张&#xff09;&#xff0c;绝缘子&#xff08;919张&#xff09;&#xff0c;电流互感器&#xff08;413张&#xff09;&#xff0c;套管&#xff08;161张&#xff09;&#xff0…...

HBase 性能优化 详解

HBase 是基于 Hadoop HDFS 之上的分布式 NoSQL 数据库&#xff0c;具有高伸缩性和强大的读写能力。然而&#xff0c;由于其分布式架构和复杂的数据存储模式&#xff0c;在高并发、大规模数据场景下&#xff0c;HBase 性能优化至关重要。从底层原理和源代码层面理解 HBase 的特性…...

杭电2041-2050

2041 这里进入递归专题了 #include<bits/stdc.h> #include<iostream> //简单递归 using namespace std; long long int M[45]; int main() {int n;M[1]1;M[2]1;for(int i3;i<45;i){M[i]M[i-1]M[i-2];}while(cin>>n){while(n--){int m;cin>>m;cout…...

Ambari搭建Hadoop集群 — — 问题总结

Ambari搭建Hadoop集群 — — 问题总结 一、部署教程&#xff1a; 参考链接&#xff1a;基于Ambari搭建大数据分析平台-CSDN博客 二、问题总结&#xff1a; 1. VMwear Workstation 查看网关 2. 资源分配 参考&#xff1a; 硬盘&#xff1a;master&#xff08;29 GB&#xff…...

如何用python抓取豆瓣电影TOP250

1.如何获取网站信息&#xff1f; &#xff08;1&#xff09;调用requests库、bs4库 #检查库是否下载好的方法&#xff1a;打开终端界面&#xff08;terminal&#xff09;输入pip install bs4, 如果返回的信息里有Successfully installed bs4 说明安装成功&#xff08;request…...

椭圆曲线密码学(ECC)

一、ECC算法概述 椭圆曲线密码学&#xff08;Elliptic Curve Cryptography&#xff09;是基于椭圆曲线数学理论的公钥密码系统&#xff0c;由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA&#xff0c;ECC在相同安全强度下密钥更短&#xff08;256位ECC ≈ 3072位RSA…...

2024年赣州旅游投资集团社会招聘笔试真

2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

微服务商城-商品微服务

数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生&#xff0c;我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要&#xff0c;而您认真负责的教学态度&#xff0c;让课程的每一部分都充满了实用价值。 尤其让我…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 &#x1f4dd; 在上一篇文章中&#xff0c;我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源&#xff0c;方便后续将资源打包到一个可执行文件中。 2.embed介绍 &#x1f3af; Go 1.16 引入了革命性的 embed 包&#xff0c;彻底改变了静态资源管理的…...

算法岗面试经验分享-大模型篇

文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer &#xff08;1&#xff09;资源 论文&a…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用

文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么&#xff1f;1.1.2 感知机的工作原理 1.2 感知机的简单应用&#xff1a;基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

华为OD机考-机房布局

import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...

WebRTC从入门到实践 - 零基础教程

WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC&#xff1f; WebRTC&#xff08;Web Real-Time Communication&#xff09;是一个支持网页浏览器进行实时语音…...