从零自制docker-8-【构建实现run命令的容器】
文章目录
- log "github.com/sirupsen/logrus"
- `args...`
- go module
- import第三方包失败
- package和 go import的导入
- go build . 和go run
- cli库
- `log.SetFormatter(&log.JSONFormatter{})`
- error和nil的关系
- cmd.Wait()和cmd.Start()
- arg……
- context.Args().Get(0)
- syscall.Exec和os/exec.Command
- `syscall.Exec`
- mountflags
- syscall.Mount
- 请注意,只有包中首字母大写的函数(public函数)才能被其他包调用。首字母小写的函数(private函数)只能在包内部使用
- 代码
- 最终效果
- 问题
log “github.com/sirupsen/logrus”
log “github.com/sirupsen/logrus”: 这是引入了 github.com/sirupsen/logrus 包,并将其重命名为 log
args...
假设我们有一个切片 myArgs := []string{"arg1", "arg2", "arg3"}
,我们想将这个切片作为参数传递给 exec.Command()
函数。
如果直接传递 myArgs
作为参数,那么 exec.Command()
函数会将整个切片作为一个单独的参数:
cmd := exec.Command("/path/to/executable", myArgs)
这相当于执行命令 /path/to/executable ["arg1" "arg2" "arg3"]
。
但是如果我们使用 args...
语法,就可以将切片中的每个元素都作为独立的参数传递给 exec.Command()
函数:
cmd := exec.Command("/path/to/executable", myArgs...)
这相当于执行命令 /path/to/executable "arg1" "arg2" "arg3"
。
args...
语法会将切片 myArgs
中的每个元素都作为独立的参数传递给 exec.Command()
函数。这种方式更加灵活,可以方便地将任意长度的参数列表传递给外部命令。
另一个例子是:
args := []string{"-flag1", "value1", "-flag2", "value2"}
cmd := exec.Command("/path/to/executable", args...)
这会将 args
切片中的 6 个元素全部作为独立的参数传递给 /path/to/executable
命令。
总之,args...
语法可以将一个切片展开为多个独立的参数,传递给需要接受多个参数的函数,在处理命令行参数时非常有用。
go module
三种包管理方式参考连接
go get下载的第三方包的位置
在GOMODULE模式下,go get命令会将依赖包下载到$GOPATH/pkg/mod目录下
go module包管理方式(推荐使用)
GO111MODULE
是一个用来控制 Go Modules 行为的环境变量。在 Go 1.11 版本之后,Go 引入了 Go Modules 来管理依赖关系和版本控制。GO111MODULE
环境变量可以设置为以下几个值:
-
GO111MODULE=on
:这是启用 Go Modules 的模式。当设置为on
时,Go 将会使用 Go Modules 来管理依赖关系,无需再依赖 GOPATH。 -
GO111MODULE=off
:这是禁用 Go Modules 的模式。当设置为off
时,Go 将使用传统的 GOPATH 模式来管理依赖关系。 -
GO111MODULE=auto
:这是自动模式。在自动模式下,Go 将根据当前目录是否包含 go.mod 文件来决定是否启用 Go Modules。如果在项目根目录下存在 go.mod 文件,则会启用 Go Modules,否则使用 GOPATH 模式。
因此,当设置 GO111MODULE=''
(即空字符串)时,表示未显式设置 GO111MODULE 环境变量,Go 将根据自动模式来决定是否启用 Go Modules,具体行为取决于当前项目的目录结构和是否存在 go.mod 文件。
go mod tidy:检测该文件夹目录下所有引入的依赖,写入 go.mod 文件。删除错误或者不使用的modules,下载没download的package(下载到$GOPATH/pkg/mod)
import第三方包失败
go env -w GOPROXY=https://goproxy.cn,direct
再尝试
package和 go import的导入
go import导入包详解
golang使用同目录下的文件,golang中的package使用简介
在golang 里面一个目录为一个package, 一个package级别的func, type, 变量, 常量, 这个package下的所有文件里的代码都可以随意访问, 也不需要首字母大写。
引用当前目录得其它子目录中的文件可以import这个文件所在的文件夹相对位置,也可以import 当前目录/子目录中的package
Go语言中的包Package详解
包分为两种,一种是main函数(可执行文件)一种是库函数的包
可执行程序的包,编译完成后会生成一个可执行文件、静态库的包编译之后会生成一个.a为后缀的文件(在$GOPATH/pkg/里),自己不能执行只能被可执行包引用。
可执行程序的包必须以main作为包名,静态库的包名没有
main包和其他类库通过静态链接,最终形成的可执行文件是没有任何外部依赖的。
go build . 和go run
go build .将当前目录所有的文件都会编译并生成一个可执行程序
go run 编译单个程序并运行,此时如果多个package为main的程序有相互依赖,那么go run 其中一个会报错,因为用了其他package为main的程序
cli库
Go 每日一库之 cli
log.SetFormatter(&log.JSONFormatter{})
假设我们有一个简单的 Go 程序,用于记录一些基本的日志信息:
package mainimport ("log"
)func main() {// 设置日志输出格式为 JSON 格式log.SetFormatter(&log.JSONFormatter{})// 记录一些日志信息log.Println("This is an informational message")log.Printf("User %s logged in", "John Doe")log.Fatalf("Failed to connect to database: %s", "connection refused")
}
在这个例子中,我们首先使用 log.SetFormatter(&log.JSONFormatter{})
将日志输出格式设置为 JSON 格式。
然后,我们分别使用 log.Println()
、log.Printf()
和 log.Fatalf()
记录了三条不同级别的日志信息。
当我们运行这个程序时,日志输出将会是 JSON 格式,类似于以下内容:
{"level":"info","msg":"This is an informational message","time":"2024-04-07T12:34:56Z"}
{"level":"info","msg":"User John Doe logged in","time":"2024-04-07T12:34:56Z"}
{"level":"error","msg":"Failed to connect to database: connection refused","time":"2024-04-07T12:34:56Z"}
与默认的文本格式相比,JSON 格式的日志输出包含了更多的元信息,如日志级别(level
)、消息内容(msg
)和时间戳(time
)。这种结构化的日志格式更加方便后续的处理和分析,特别是在需要机器解析日志的场景下。
总之,log.SetFormatter(&log.JSONFormatter{})
是一个非常实用的方法,可以帮助我们更好地管理和处理 Go 程序的日志信息。
error和nil的关系
error
类型和nil
的关系是这样的:
error
类型是Go语言中一个接口,用来表示一个错误情况。一个实现了Error()
方法的值,即使没有实现任何具体的行为,也被称为一个error
值。nil
是Go语言中的一个特殊值,它表示的是空值或不存在的值,对于error
类型的值来说,nil
表示没有错误发生。
在函数返回值中,当函数执行正确,没有遇到错误时,我们通常会用nil
来表示。例如:
func someFunction() error {// 函数执行成功,没有错误return nil
}
当函数执行遇到错误时,我们会返回一个非nil
的error
值,例如:
func someFunction() error {// 函数执行失败,返回一个错误return errors.New("Some error occurred.")
}
所以,error
类型和nil
的关系是:nil
表示error
类型的值为非错误状态,非nil
的error
表示存在错误。在函数返回时,如果error
值为nil
,则表示函数执行成功,否则表示有错误发生。
cmd.Wait()和cmd.Start()
err变量在调用cmd.Wait()方法后得到返回值。当调用cmd.Start()时,该方法会启动命令并在后台执行。如果在启动命令时发生了错误(例如命令不存在、权限不足等),cmd.Start()会立即返回一个非nil的错误值。
而cmd.Wait()方法的作用是等待命令执行完毕。当命令执行结束后,此方法会返回。返回值有两个含义:
若命令执行成功结束,err将为nil。
若在命令执行过程中出现任何错误(比如命令被信号终止、超时退出等),err将包含相应的错误信息。
因此,在你的代码片段中,err = cmd.Wait()这一行会阻塞直到外部命令执行完毕,然后返回一个表示命令执行结果(成功与否及退出状态)的错误值。
arg……
在Go语言中,os/exec
包提供了执行外部命令的功能。这里的代码片段是用于创建一个可执行命令的实例。
args := []string{"init", cmd}
是定义了一个字符串切片(slice),它存储了要执行的命令及其参数。在这个例子中:
"init"
:是一个命令参数,表示要执行的子命令为 “init”。cmd
:是一个变量,通常代表另一个命令参数。具体的值取决于程序上下文中的赋值情况。
然后,command := exec.Command("/proc/self/exe", args...)
这一行是用来创建一个新的 *Cmd
结构体实例,这个实例代表了一个待执行的命令。
"/proc/self/exe"
是一个特殊路径,在Linux系统中指向当前正在运行的可执行文件。也就是说,这里实际上是打算执行与当前进程相同的一个新进程,并且传入参数 args
。
args...
是Go语言中的变长参数语法,它会将字符串切片 args
扩展为多个单独的参数传递给 exec.Command
函数。
所以整个语句的作用是,根据给定的参数列表 args
,执行与当前进程相同的新的命令行程序,并且第一个参数是 “init”,第二个参数是变量 cmd
的值。
context.Args().Get(0)
在Go语言中,这段代码片段是基于第三方命令行工具库(如urfave/cli
或cobra
)来定义一个命令行命令init
的结构体。在这些库中,cli.Context
对象包含了从命令行输入解析出来的所有信息。
context.Args().Get(0)
这一行代码在用户调用命令 init
并带有一个或多个额外参数时,用于获取命令行中紧随命令名 init
之后的第一个参数。
举个例子,假设用户在命令行中执行了如下命令:
./myapp init mycontainer
在上述代码段中,context.Args().Get(0)
将返回字符串 "mycontainer"
。这是因为context.Args()
返回的是一个包含所有非命令名称参数的字符串切片,索引0位置的元素就是第一个参数。
然而,根据这段代码的具体上下文,看起来开发者并未真正使用到 cmd
变量(它保存了第一个参数的值),而是直接调用了 contain.init()
方法初始化容器。如果预期是利用第一个参数来定制初始化行为,那么应该会在 contain.init()
调用中使用到 cmd
变量。
syscall.Exec和os/exec.Command
在Go语言中,syscall.Exec
和 os/exec.Command
都是用来执行外部程序的,但它们在用途和机制上有显著的不同:
-
syscall.Exec:
syscall.Exec
是一个低级别的系统调用,直接在当前进程中替换当前程序的映像和数据,执行新的程序。- 当
syscall.Exec
成功执行后,原始程序的内存空间、文件描述符等资源将被新程序接管,原始程序不会恢复执行,因为它已经被完全替换掉了。 - 通常用在那些希望彻底转换当前进程上下文而不返回的情况。
-
os/exec.Command:
os/exec.Command
提供了一种高级别的、更易于使用的API来执行外部程序,并且它不会替换当前进程的内容。exec.Command
创建并返回一个*Cmd
类型的结构体,调用其Run()
方法来执行外部程序,执行完成后,当前Go程序会继续执行后续代码。- 你可以通过
Output()
、CombinedOutput()
等方法获取子进程的输出,并且可以控制子进程的标准输入、输出和错误流。 - 如果需要在同一进程中连续执行多个外部命令,或者需要处理子进程的输出结果,那么
os/exec
库是非常适合的。
简单来说,syscall.Exec
更像是进程自身的“变身”,而 os/exec.Command
则是在当前进程中启动一个新的子进程来进行任务,并且可以对子进程进行更多的控制和通信。
syscall.Exec
在Go语言中,当程序执行到 syscall.Exec
函数时,会发生以下情况:
-
当前进程替换:
syscall.Exec
函数负责执行一个新的程序,同时替换当前进程的映像和内存空间。这意味着当前执行的Go程序的所有代码和数据都会被新的程序所取代,不再有任何机会回到原来的Go程序执行流中。 -
资源继承:
新程序将继承当前进程的PID(进程ID)、打开的文件描述符以及其他一些进程相关的资源。这意味着新程序可以从原先的进程中接过控制权,例如继续监听同一套网络端口或读写已打开的文件。 -
程序执行:
syscall.Exec
函数接受一系列参数,包括要执行的程序路径、命令行参数和环境变量。新程序将以指定的方式执行,就像它是由shell或其他启动器直接启动的一样。 -
永不返回:
一旦syscall.Exec
成功执行了新程序,原Go程序的代码将不再被执行,并且syscall.Exec
函数本身也不会返回——因为它已经不再是那个进程的一部分了。如果syscall.Exec
失败(例如由于找不到要执行的程序或权限问题),它会返回一个错误,但这种情况下的“返回”实际上已经是当前进程内的紧急错误处理逻辑了,而不是原Go程序的逻辑继续执行。 -
用途:
syscall.Exec
通常用于服务程序升级、执行子进程并替换自己以进入不同的执行环境等情况,或者是不需要原程序继续运行的场景。相比之下,如果你想在当前进程中启动一个子进程并与其交互或等待子进程结束后继续执行,应该使用os/exec
包中的Command
和Run
等方法。
-
syscall.Exec(command, argv, os.Environ())
的作用是:command
:这是要执行的新程序的路径或者可执行文件名。argv
:这是一个字符串切片,包含传递给新程序的命令行参数。在这个例子中,只有command
一个参数,但实际上可以有多个,比如argv := []string{command, arg1, arg2, ...}
。os.Environ()
:这个函数返回当前进程的环境变量列表,格式为key=value
的字符串切片。在syscall.Exec
中,这个参数用于传递给新程序,使其继承当前进程的环境变量。
mountflags
-
syscall.MS_NOEXEC:
设置此标志后,挂载的文件系统上的所有文件都无法被执行,即使是可执行文件。这是一项重要的安全措施,可以阻止恶意或误操作尝试执行存储在特定文件系统分区中的程序。例如,在只用于数据存储的分区上启用此选项可以增强安全性,确保即便有潜在恶意脚本或程序也不得运行。 -
syscall.MS_NOSUID:
当挂载文件系统时带有此标志,系统会忽略文件的Set-User-ID (SUID) 和 Set-Group-ID (SGID) 位的效果。在Linux中,SUID和SGID权限通常允许用户在执行某个文件时暂时获取文件所有者的权限或执行该文件时的组权限。禁用SUID和SGID意味着,无论文件本身有何种特殊权限设定,进程在执行文件时不会继承文件所有者的用户ID或组ID,从而限制了可能因滥用特权而导致的安全风险。 -
syscall.MS_NODEV:
使用此标志挂载文件系统时,系统将不允许任何设备特殊文件在该文件系统上工作。设备文件是用来访问硬件设备(如硬盘、终端、打印机等)的接口。禁止设备文件意味着无法在该挂载点创建或访问设备节点,这对于防止未经授权的设备访问以及增强隔离环境的安全性非常有用,比如在沙箱环境中或对安全性要求较高的文件系统分区。
syscall.Mount
syscall.Mount
是 Go 语言标准库 syscall
包中提供的一个函数,用于直接调用操作系统的系统调用来完成文件系统的挂载操作。在Linux环境下,这个函数对应的就是Linux内核提供的mount(2)
系统调用接口。
函数签名一般如下所示(可能会根据不同Go版本有所变化):
func Mount(source string, target string, fstype string, flags int, data string) error
参数含义:
-
source
:待挂载的文件系统源,它可以是设备名(如/dev/sda1
)、网络共享路径或者其他形式,对于虚拟文件系统如proc
,则是一个标识符字符串。 -
target
:挂载点,即目标挂载路径,通常是一个已经存在的目录。 -
fstype
:文件系统的类型名称,如ext4
、ntfs
或者像上面提到的proc
这样的特殊文件系统类型。 -
flags
:挂载标志,是一个整数值,由多个标志位组合而成,例如syscall.MS_NOEXEC | syscall.MS_NOSUID | syscall.MS_NODEV
,这些标志位用于控制挂载行为的不同属性。 -
data
:可选的额外挂载选项,通常是一个字符串,格式取决于所使用的文件系统类型,对于一些文件系统,可能包含挂载选项的列表或其他特定信息,对于不需要额外数据的文件系统,可以传入空字符串""
。
函数执行的结果是成功或失败,若失败则返回一个错误对象。
在给出的例子中:
syscall.Mount("proc", "/proc", "proc", uintptr(defaultMountFlags), "")
这是在挂载Linux的虚拟文件系统 /proc
到 /proc
目录下,并且使用了 defaultMountFlags
中定义的一系列安全相关的挂载标志。
请注意,只有包中首字母大写的函数(public函数)才能被其他包调用。首字母小写的函数(private函数)只能在包内部使用
代码
https://github.com/FULLK/llkdocker/tree/main/run_docker
最终效果
问题
发现只能run一次,下次就出现
有待解决
相关文章:

从零自制docker-8-【构建实现run命令的容器】
文章目录 log "github.com/sirupsen/logrus"args...go moduleimport第三方包失败package和 go import的导入go build . 和go runcli库log.SetFormatter(&log.JSONFormatter{})error和nil的关系cmd.Wait()和cmd.Start()arg……context.Args().Get(0)syscall.Exec和…...

2024.03.31 校招 实习 内推 面经
绿*泡*泡VX: neituijunsir 交流*裙 ,内推/实习/校招汇总表格 1、自动驾驶一周资讯 -小米SU7上市24小时,大定达88898台;小鹏汽车正式进入德国市场;地平线递交港股上市申请 自动驾驶一周资讯 -小米SU7上市24小时&…...

邦芒职场:塑造职场人气王的秘诀
在职场中,有些人总能吸引众人的目光,成为团队的焦点;而有些人却常常默默无闻,难以融入。那么,如何在职场中脱颖而出,成为一个受欢迎的人呢?下面,让我们来探讨一下塑造职场人气王的秘…...

滤波器网络变压器的作用
网络变压器的作用主要包括以下几点: 1. 信号传输:网络变压器可以将PHY送出来的差分信号用差模耦合的线圈耦合滤波以增强信号,并且通过电磁场的转换耦合到不同电平的连接网线的另外一端以达到传输数据的目的。 2. 电气电压隔离:…...

Python —— 简述
Houdini Python | 笔记合集 - 知乎 Houdini内置三大语言: 表达式,主要用于节点参数控制,可实现跨模块控制;vex,速度最快(比表达式和Python快一个数量级),非常适合密集型计算环境&…...

使用Rust加速Python程序,让代码飞起来
作为一种解释型语言,Python在开发速度和灵活性方面具有明显的优势,但在性能方面却不如编译型语言如C或Rust。对于性能要求苛刻的应用程序,如果纯粹使用Python编写可能会运行缓慢,影响用户体验。因此,如何利用Rust来加速…...

【RISC-V 指令集】RISC-V 向量V扩展指令集介绍(八)- 向量整数算术指令
1. 引言 以下是《riscv-v-spec-1.0.pdf》文档的关键内容: 这是一份关于向量扩展的详细技术文档,内容覆盖了向量指令集的多个关键方面,如向量寄存器状态映射、向量指令格式、向量加载和存储操作、向量内存对齐约束、向量内存一致性模型、向量…...

Qt Designer在布局中调整控件垂直伸展或者水平伸展之后控件没有变化
QtDesigner设置垂直伸展 在Qt Designer中,要对网格布局中的每一个网格设置垂直伸展,可以按照以下步骤操作: 1.打开Qt Designer并打开你的UI文件。 2.确保你的布局是一个网格布局(QGridLayout)。 3.选中你想要设置垂直…...

微信公众号粉丝迁移费用是多少?
公众号迁移后原来内容还在么?通过公众号迁移,可以实现这些目的:主体变更、开通留言功能、多号合并、订阅号升级为服务号、服务号转为订阅号。公众号迁移流程:①申请公证;②提交迁移申请;③第三方审核&#…...

基于Vue3 中后台管理系统框架
基于Vue3 中后台管理系统框架 文章目录 基于Vue3 中后台管理系统框架一、特点二、源码下载地址 一款开箱即用的 Vue 中后台管理系统框架,支持多款 UI 组件库,兼容PC、移动端。vue-admin, vue-element-admin, vue后台, 后台系统, 后台框架, 管理后台, 管理…...

Agent调研--19类Agent框架对比
代理(Agent)指能自主感知环境并采取行动实现目标的智能体,即AI作为一个人或一个组织的代表,进行某种特定行为和交易,降低一个人或组织的工作复杂程度,减少工作量和沟通成本。 背景 目前,我们在探…...

蓝桥杯-求阶乘
问题描述 满足 N!的末尾恰好有 区 个o的最小的 N 是多少? 如果这样的 N 不存在输出 -1。 输入格式 一个整数 区。 输出格式 一个整数代表答案。 样例输入 样例输出 10 评测用例规模与约定 对于 30% 的数据,1<K<106 对于 100% 的数据,1<K<1018 运行限制 最大运行时…...

计算两个日期之间相差的天数的四种方法
计算两个日期之间相差的天数的四种方法 第一种:时间戳的方式,计算两个日期的时间戳的差,再除当天的毫秒数即可得到相差的天数。 public static void main(String[] args) {DateFormat dft new SimpleDateFormat("yyyy-MM-dd");t…...

【leetcode面试经典150题】42. 有效的字母异位词(C++)
【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主,题解使用C语言。(若有使用其他语言的同学也可了解题解思路,本质上语法内容一致&…...

Windows 2003 R2与Windows 2022建立域信任报错:本地安全机构无法跟域控制器获得RPC连接。请检查名称是否可以解析,服务器是否可用。
在Windows Server 2003 R2与Windows Server 2022之间建立域信任时遇到“本地安全机构无法与域控制器获得RPC连接”的错误,可能是由于以下几种原因: DNS 解析问题: 确保源域和目标域的DNS配置正确,能够互相解析对方的域名和IP地址。…...

UE5、CesiumForUnreal实现加载建筑轮廓GeoJson数据生成白模功能
1.实现目标 在UE5.3中,通过加载本地建筑边界轮廓面GeoJson数据,获取底面轮廓和楼高数据,拉伸生成白模,并支持点选高亮。为防止阻塞Game线程,使用了异步任务进行优化,GIF动图如下所示: 其中建筑数量:128871,顶点索引数量:6695748,三角面数量:2231916,顶点数量:165…...

JavaGUI编程
目录 GUI概念 Swing概念 组件 容器组件 窗口(JFrame) 代码 运行 面板(JPanel) 代码 运行 布局管理器 FlowLayout 代码 运行 BorderLayout 代码 运行 GridLayout 代码 运行 常用组件 标签(JLabel) 代码 运…...

Nginx 基础应用实战 03 基于反向代理的负载均衡、https配置
Nginx 基础应用实战 03 反向代理 proxy_pass http://baidu.com; location /mashibing {proxy_pass http://mashibing.com/;}基于反向代理的负载均衡 upstream httpd {server 192.168.43.152:80;server 192.168.43.153:80; }weight(权重) 指定轮询几率,weight和访…...

[图解]DDD领域驱动设计伪创新-聚合根02
0 00:00:04,940 --> 00:00:06,993 在领域驱动设计之前 1 00:00:06,993 --> 00:00:09,503 的软件开发书籍里面 2 00:00:09,503 --> 00:00:12,470 并没有出现聚合根这样的说法 3 00:00:13,000 --> 00:00:14,840 大家可以去找一下 4 00:00:15,120 --> 00:00:15…...

《QT实用小工具·二十》存款/贷款计算器
1、概述 源码放在文章末尾 该项目实现了用于存款和贷款的计算器的功能,如下图所示: 项目部分代码如下: #ifndef WIDGET_H #define WIDGET_H#include <QWidget>namespace Ui { class Widget; }class Widget : public QWidget {Q_OBJ…...

hbase基础shell用法
HBase中用create命令创建表,具体如下: create student,Sname,Ssex,Sage,Sdept,course 此时,即创建了一个“student”表,属性有:Sname,Ssex,Sage,Sdept,course。因为HBase的表中会有一个系统默认的属性作为行键&#x…...

ElasticSearch 的 BoolQueryBuilder 使用
ElasticSearch的BoolQueryBuilder定义: A Query that matches documents matching boolean combinations of other queries import org.elasticsearch.index.query.QueryBuilders;BoolQueryBuilder boolQueryBuilder QueryBuilders.boolQuery(); for (String wor…...

[C++/Linux] 网络I/O处理
引言:网络数据能够正常到达用户并且被接收是进行网络传输的根本目的,网络传输的数据发送和接收有多种方案,本文章就对通过向量接收和发送等数据传输方式,并且对多种I/O模型进详细分析介绍。 目录 一.I/O函数 1.1 recv和send rec…...

HarmonyOS4 页面路由
Index.ets: import router from ohos.routerclass RouterInfo {// 页面路径url: string// 页面标题title: stringconstructor(url: string, title: string) {this.url urlthis.title title} }Entry // 入口組件 Component struct Index {State message: string 页面列表// …...

ShardingSphere再回首
概念: 连接:通过协议 方言及库存储的适配,连接数据和应用,关注多模数据苦之间的合作 增量:抓取库入口流量题提供重定向, 流量变形(加密脱敏)/鉴权/治理(熔断限流)/分析等 可插拔:微内核 DDL:cr…...

第七篇:3.6 其他评估考虑/4.审计指南/5. 通用报告规范/6.披露指南、参考标准及其他 - IAB/MRC及《增强现实广告效果测量指南1.0》
翻译计划 第一篇概述—IAB与MRC及《增强现实广告效果测量指南》之目录、适用范围及术语第二篇广告效果测量定义和其他矩阵之- 3.1 广告印象(AD Impression)第三篇广告效果测量定义和其他矩阵之- 3.2 可见性 (Viewability)第四篇 …...

函数、指针和数组的相互运用(C语言)
1、函数指针数组 含义:数组的每个元素都是函数指针类型.eg: (此代码链接:http://t.csdnimg.cn/ClJmb.也可以在我发布博客中找到) 2、指向函数指针数组的指针 1、引入 3、回调函数 1、含义:就是一个通过…...

.Net Core/.Net 6/.Net 8,一个简易的消息队列
.Net Core/.Net 6/.Net 8,一个简易的消息队列 身份验证接口身份验证接口实现program.cs通过api调用 做着玩的, 只实现了消息入队出队功能,没有持久化,也没有其它任何高级功能 直接上代码 public class AMQBase//:ISingleton {/// <summary…...

OpenHarmony4.0分布式任务调度浅析
1 概述 OpenHarmony 分布式任务调度是一种基于分布式软总线、分布式数据管理、分布式 Profile 等技术特性的任务调度方式。它通过构建一种统一的分布式服务管理机制,包括服务发现、同步、注册和调用等环节,实现了对跨设备的应用进行远程启动、远程调用、…...

element-ui backtop 组件源码分享
今日简单分享 backtop 组件的源码实现,从以下三个方面: 1、backtop 组件页面结构 2、backtop 组件属性 3、backtop 组件事件 一、backtop 组件页面结构 二、backtop 组件属性 2.1 target 属性,触发滚动的对象,类型 string&am…...