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

Go:包和 go 工具

引言

通过对关联特性分类,组成便于理解和修改的单元,使包与程序其他包保持独立,助力大型程序的设计与维护 。模块化让包可在不同项目共享、复用、发布及全球范围使用。

每个包定义不同命名空间作为标识符,关联具体包,便于为类型、函数等选取简洁名字,避免与程序其他部分冲突。包通过控制名字是否导出实现对包外可见性控制,限制包成员可见性,隐藏 API 辅助函数和类型,方便维护者修改包实现而不影响外部代码 ;限制变量可见性,使用者只能通过导出函数访问和更新变量。

修改文件需重新编译所在包及依赖包。Go 程序编译快,原因有三:一是源文件开头显式列出导入,编译器确定依赖性时无需读取处理整个文件;二是包依赖形成有向无环图,可独立甚至并行编译;三是 Go 包编译输出目标文件记录自身及依赖包导出信息,编译时读取导入目标文件不会超出范围。

导入路径

在 Go 语言里,每个包都由一个唯一的字符串标识,这个字符串就是导入路径,用于import声明中。

import ("fmt""math/rand""encoding/json""golang.org/x/net/html""github.com/go-sql-driver/mysql"
)

Go 语言规范未定义导入路径字符串的含义及确定方式,而是借助工具解决。go工具是 Go 程序员构建、测试程序的主要工具 ,不过也存在其他工具,像 Google 内部多语言构建系统有不同命名和包定位规则。

对于准备共享或公开的包,导入路径需全局唯一。为避免冲突,除标准库外,其他包导入路径通常以互联网域名(所属组织机构域名或存放包的域名)开头,方便查找包,如上述 Go 团队维护的 HTML 解析器和流行的第三方 MySQL 数据库驱动程序的导入路径。

包的声明

在 Go 源文件开头需进行包声明,其作用是当该包被其他包引入时,作为默认标识符(即包名) 。例如math/rand包中文件开头是package rand ,导入此包后,就能通过rand.Intrand.Float64等访问其成员。

package mainimport ("fmt""math/rand"
)func main() {fmt.Println(rand.Int())
}

一般情况下,包名是导入路径的最后一段。像math/randcrypto/rand导入路径不同,但包名都是rand

例外情况

  1. 命令包:若包定义一条命令(可执行 Go 程序 ),无论导入路径如何,包名总是main ,用于告知go build生成可执行文件。
  2. 测试包:目录中以_test.go结尾的文件名,包名会有_test后缀 ,区分普通包和外部测试包,避免测试依赖的循环依赖。
  3. 依赖管理工具:部分依赖管理工具会在包导入路径尾部追加版本号后缀(如gopkg.in/yaml.v2 ),但包名不包含后缀,此例中包名为yaml

导入声明

Go 源文件在package声明后、首个非导入声明语句前,可包含零个或多个import声明。导入方式有两种:一是单个指定导入路径(如import "fmt"import "os" );二是用圆括号括起一次导入多个包(如import ("fmt" "os") ),后一种更常见 。

导入的包可通过空行分组,一般按领域和方面区分 ,导入顺序无严格要求,但习惯上每组按字母顺序排序,go fmtgoimports工具会自动分组排序,例如:

import ("fmt""html/template""os""golang.org/x/net/html""golang.org/x/net/ipv4"
)

重命名导入

当要将两个同名包(如math/randcrypto/rand )导入到第三个包时,需为其中一个指定替代名字避免冲突,即重命名导入,例如:

import ("crypto/rand"mrand "math/rand" // 通过指定不同名称mrand避免冲突
)

替代名字仅在当前文件生效,其他文件(即使同包内 )可按默认或另选替代名导入。重命名导入在无冲突时也有用,尤其处理自动生成代码中冗长包名,且使用统一缩写可规避局部变量冲突。

导入依赖与循环依赖

每个导入声明在当前包与导入包间建立依赖,若依赖形成循环,go build工具会报错。

空导入

通常,导入包却未在文件中引用包名,会引发编译错误。但有时导入包仅为利用其副作用,如执行包级别变量初始化表达式求值及init函数 。为避免 “未使用的导入” 错误,需使用重命名导入,用替代名字_ ,即空导入 ,导入内容为空白标识符,一般不可被引用,示例:import _ "image/png" // 注册PNG解码器

import ("database/sql"_ "github.com/lib/pq"           // 添加 Postgres 支持_ "github.com/go-sql-driver/mysql" // 添加 MySQL 支持
)
db, err := sql.Open("postgres", dbname) // OK
db, err := sql.Open("mysql", dbname)    // OK
db, err := sql.Open("sqlite3", dbname)  // 返回错误消息: unknown driver "sqlite3"

database/sql包为例,可按需空导入数据库驱动包(如_ "github.com/lib/pq"添加 Postgres 支持、_ "github.com/go - sql - driver/mysql"添加 MySQL 支持 ),实现按需加载驱动 。

包及其命名

包名命名

  • 简洁性:包名应简短,但不能过短致含义模糊。标准库中常见包如bufiobytesfmt 等都是简洁范例。
  • 可读性与无歧义:避免使用过于笼统的名称如util ,建议用更具体清晰的名字,像imageutilioutil 。同时,防止包名与常用局部变量名冲突,或让使用者不得不重命名导入。
  • 统一形式:标准包如byteserrorsstrings 用复数形式,避免覆盖预声明类型;go/types 这种形式可规避与关键字冲突。
  • 避免歧义:不要用有其他常见含义的词作包名,如 “temp” 易误解为 “temporary”(临时性的 )包名字从temptemperature 改为tempconv

包成员命名

  • 整体考量:设计包时要综合考虑包名和成员名协同工作,而非仅关注成员名。如bytes.Equalflag.Inthttp.Getjson.Marshal ,通过包名加成员名清晰标识操作所属。
  • 通用模式
    • 操作函数集合包:以strings包为例,提供一系列操作字符串函数,如strings.Indexstrings.NewReplacer 等,包名不会出现在函数名中,用户通过 “包名.函数名” 调用。
    • 单一类型包:像html/templatemath/rand 这类包,导出单一数据类型及其方法,一般有New函数创建实例,如rand.New 。因类型名可能与包名重复,此类包名通常较短。
    • 复杂任务包:如net/http ,虽包含众多类型和函数,但重要成员采用简单命名,如GetPostHandle 等,方便识别和使用。

go 工具

go工具用于下载、查询、格式化、构建、测试和安装 Go 代码包 。它集多种功能于一体,类似aptrpm包管理器,能查询包作者、计算依赖关系、从远程版本控制系统下载包 ;也是构建系统,可计算文件依赖,调用编译器、汇编器和链接器(虽不如标准 UNIX make命令完备 );还是测试驱动程序。

命令行接口

go工具命令行接口采用 “瑞士军刀” 风格,有十几个子命令 ,如getrunbuildfmt 等。运行go help可查看内置文档索引。常用命令及其功能,使用go help [command]获取子命令更多信息:

  • build:编译包及其依赖项。
  • clean:删除目标文件。
  • doc:显示包或符号的文档。
  • env:打印 Go 环境信息。
  • fmt:对包源文件运行gofmt进行格式化。
  • get:下载并安装包及其依赖项。
  • install:编译并安装包及其依赖项。
  • list:列出包。
  • run:编译并运行 Go 程序。
  • test:测试包。
  • version:打印 Go 版本。
  • vet:对包运行go tool vet

go工具高度依赖惯例以简化配置。比如,根据 Go 源文件所在目录能确定其所属包(每个目录对应一个包,包导入路径与工作空间目录结构对应 );根据包导入路径能找到目标文件存放目录及源代码仓库服务器 URL。

工作空间的组织

GOPATH环境变量

  • 作用与配置GOPATH是用户需配置的重要环境变量,用于指定 Go 工作空间的根目录 。切换工作空间时,更新其值即可。例如设置为$HOME/gobook ,命令为export GOPATH=$HOME/gobook ,然后可用go get gopl.io/...下载相关程序。
    • src:存放源文件,包所在目录相对于$GOPATH/src的路径就是包的导入路径 ,如gopl.io/ch1/helloworld 。一个工作空间的src下可包含多个代码版本控制仓库,如gopl.iogolang.org
    • pkg:构建工具存储编译后包的位置 ,会按操作系统和处理器架构分类存放(如darwin_amd64/ )。
    • bin:放置可执行程序,像helloworlddup

GOROOT环境变量

  • 作用与目录结构GOROOT指定 Go 发行版的根目录 ,提供所有标准库的包 。其目录结构与GOPATH类似,比如fmt包源代码存于$GOROOT/src/fmt 。一般用户无需设置GOROOTgo工具默认使用安装路径。

  • 其他环境变量go env命令可输出与工具链相关的环境变量及其值,包括已设置有效值和默认值的变量 。GOOS指定目标操作系统(如androidlinuxdarwinwindows ),GOARCH指定目标处理器架构(如amd64386arm )等 。。

包的下载

包的导入路径不仅用于在本地工作空间定位,还指明通过go get从互联网获取和更新包的位置 。go get命令可下载单个包,也能用...下载子树或仓库,并计算和下载初始包的所有依赖 ,如golang.org/x/net工具包及其依赖会出现在工作空间。

go get使用示例

  • $ go get github.com/golang/lint/golint :获取golint工具,用于检查 Go 源码风格问题。
  • $ $GOPATH/bin/golint gopl.io/ch2/popcount :使用golint检查gopl.io/ch2/popcount代码,指出缺少文档注释问题。

go get支持多个流行代码托管站点,如 GitHub、Bitbucket 和 Launchpad ,可向版本控制系统发送合适请求。对于不知名网站,可能需指明导入路径使用的版本控制协议(如 Git 或 Mercurial ),执行go help importpath获取更多细节。

go get创建的目录是远程仓库真实客户端,非简单文件副本,可使用版本控制命令查看本地编辑差异或更新版本 。以golang.org/x/net为例,在$GOPATH/src/golang.org/x/net目录下,可通过git remote -v查看 Git 远程仓库地址,包导入路径域名与 Git 服务器实际域名可能不同,是go工具特性,通过网页元数据重定向到实际托管地址的 Git 仓库。

更新选项与版本控制

  • -u开关:go get -u确保访问的所有包(包括依赖 )更新到最新版本,再进行构建和安装 ,适合项目开始阶段,但在需精准版本控制的部署项目中不适用。
  • vendor目录:在部署项目中,常添加vendor目录,构建本地必需依赖副本并谨慎更新 。Go 1.5 之前需改变包导入路径,多数新版go工具支持vendor目录,可通过go help gopath查看详细信息。

包的构建

go build命令

  • 基本功能go build用于编译命令行参数中的包。若包是库,编译结果会被舍弃;若包名为main ,则调用链接器在当前目录创建可执行程序,可执行程序名取自包导入路径最后一段 。
  • 目录与参数指定:每个目录对应一个包,可执行程序或 UNIX 命令需有自己的目录,如golang.org/x/tools/cmd/godoc 。包可通过导入路径或相对目录名指定(目录需以...开头 ),不提供参数时,使用当前目录。示例展示了在不同目录下使用go build编译gopl.io/ch1/helloworld包的情况 ,还提到可通过文件列表指定包(适用于小型程序和一次性实验 ),可执行程序名取自第一个.go文件名主体部分。
  • 构建特性
    • 依赖处理:默认构建所有需要的包及其依赖,编译后丢弃除最终可执行程序外的代码。项目规模增大时,重新编译依赖耗时增加 。
    • 即时运行:对于即抛型程序,go run可将构建和运行两步合并。
    • 构建标签:编译因操作系统和 CPU 体系结构而异,可通过构建标签(特殊注释 )实现更细粒度控制,如// +build linux darwin表示仅在 Linux 或 Mac OS X 系统构建时编译该文件,// +build ignore表示不编译 。

go install命令

  • go build相似,但会保存每个包的编译代码和命令 。编译后的包存于$GOPATH/pkg目录(与源文件src目录对应 ),可执行命令存于$GOPATH/bin目录 。go build -i可将包安装在独立于构建目标的地方。
  • go install保存的目录会根据GOOSGOARCH变量命名,如在 Mac 上golang.org/x/net/html编译后的文件存于$GOPATH/pkg/darwin_amd64

包的文档化

Go 语言强调良好的包 API 文档,每个导出的包成员声明及包声明本身都应使用注释描述目的和用途 。文档注释是完整语句,常以包名开头总结 。如fmt.Fprintf的文档注释示例:

// Fprintf根据格式说明符格式化并写入w
// 返回写入的字节数及可能遇到的错误
func Fprintf(w io.Writer, format string, a...interface{}) (int, error)

包声明前的文档注释视为整个包的文档注释,且只能有一个,较长注释可单独放doc.go文件 ,如fmt包注释超 300 行。好的文档简洁明了,行为明确时可不注释。

文档工具

  • go doc:可输出命令行指定内容(包、包成员、方法等 )的声明和完整文档注释 。
  • godoc:提供相互链接的 HTML 页面服务,包含不少于go doc的信息 。

内部包

在 Go 程序中,未导出的标识符只能在包内访问,导出的标识符可在任何地方访问,这是包封装的重要机制。

实际开发中,有时需要一种介于完全私有(包内)和完全公开(导出)之间的访问控制方式 。比如将大包拆分为多个小包时,不想向其他包暴露小包间关系;或在不导出情况下,在项目部分包间共享工具函数;又或试验新包而不将其永久作为公开 API ,此时可通过限定允许访问的包列表来实现。

go build工具对导入路径含internal路径片段的包特殊处理,这类包称为内部包 。内部包只能被位于internal目录父目录为根目录的包导入 。

net/http 
net/http/internal/chunked
net/ur1 
net/http/httputil

net/http/internal/chunked可被net/http/httputilnet/http导入,但不能被net/url导入,而net/url可导入net/http/httputil

包的查询

go list工具用于上报可用包的信息 。最简形式下,可判断包是否存在于工作空间,若存在则输出导入路径,如$ go list github.com/go-sql-driver/mysql

go list命令参数支持...通配符,可匹配包导入路径中的任意子串 。能用于枚举工作空间中的所有包($ go list ... )、指定子树中的所有包(如$ go list gopl.io/ch3/... )或特定主题相关包(如$ go list ...xml... ) 。

输出格式定制

  • JSON 格式-json标记可使go list以 JSON 格式输出包的完整记录 ,包含目录(Dir )、导入路径(ImportPath )、包名(Name )、文档(Doc )、目标文件路径(Target )等信息,还涉及是否来自GOROOTGoroot )、是否为标准库(Standard )、根目录(Root )、Go 源文件(GoFiles )、导入包列表(Imports )、依赖包列表(Deps )等字段 。
  • 模板定制-f标记允许通过text/template包的模板语言定制输出格式 。

参考资料:《Go程序设计语言》

相关文章:

Go:包和 go 工具

引言 通过对关联特性分类,组成便于理解和修改的单元,使包与程序其他包保持独立,助力大型程序的设计与维护 。模块化让包可在不同项目共享、复用、发布及全球范围使用。 每个包定义不同命名空间作为标识符,关联具体包&#xff0c…...

GIS开发笔记(5)结合osg及osgEarth实现虚线环形区域绘制

一、实现效果:输入中点坐标点、内圆半径、外圆半径,绘制坐标点所在高度的水平面的两个圆形形成环形区域。 二、实现原理: 创建中心点所在平面的圆形几何体,将其分别挂接到同一个节点上,再将该节点挂接到用户绘制组节…...

天线静电防护:NRESDTLC5V0D8B

一. 物联网天线的使用环境 1.1 联网天线广泛应用于智能家居领域,比如智能门锁、智能摄像头等设备中,通过天线实现设备与家庭网络的连接,用户可以远程控制和监控家居设备。以智能摄像头为例,它通过天线将拍摄的画面实时传输到用户…...

Linux进程相关选择题及解析

1. 关于Linux进程创建,以下说法正确的是? A. fork()函数调用后,子进程从父进程的fork()之后开始执行 B. fork()函数返回两次,父进程返回子进程PID,子进程返回0[10][11] C. exec函数族会替换当前进程的代码段,但保留数据段和堆栈 D. wait()函数只能等待直接子进程退出 答…...

Day(22)--网络编程习题

习题 以下是这些 TCP 通信练习题的 Java 代码实现及解析: TCP 通信练习 1 - 多发多收 客户端(Client1.java) java import java.io.IOException; import java.io.OutputStream; import java.net.Socket; ​ public class Client1 {public…...

Kubernetes 节点摘除指南

目录 一、安全摘除节点的标准流程 1. 确认节点名称及状态 2. 标记节点为不可调度 3. 排空(Drain)节点 4. 删除节点 二、验证节点是否成功摘除 1. 检查节点列表 2. 检查节点详细信息 3. 验证 Pod 状态 三、彻底清理节点(可选&#xf…...

SM4密码算法的CPA攻击技术

SM4算法简介 可参见博文 SM4分组密码算法研究。 SM4密码算法的CPA攻击技术 相关功耗攻击(CPA)是侧信道功耗分析攻击中较为常见的攻击方法之一,攻击者利用密码算法执行过程中,在侧信道泄露的信息(如时序、能量、缓存等)和通信信道的消息(如明文、私钥等)进行测试,通过…...

Golang|KVBitcask

文章目录 初识KVbitcask论文详解 初识KV bitcask论文详解 论文地址:https://riak.com/assets/bitcask-intro.pdf理想的存储引擎,应该满足下面一些特点:...

【Python进阶】元组:不可变序列的十大核心应用

目录 前言:技术背景与价值当前技术痛点解决方案概述目标读者说明 一、技术原理剖析核心概念图解核心作用讲解关键技术模块技术选型对比 二、实战演示环境配置要求核心代码实现(10个案例)案例1:基础创建与访问案例2:解包…...

centos安装libheif

参考 解决docker: Error response from daemon: Get “https://registry-1.docker.io/v2/“:连接超时问题_error response from daemon :get-CSDN博客 HEIF编解码器安装 - navyum - 博客园 ​​​​​​https://github.com/strukturag/libheif #升级gcc yum install centos…...

初步认识Model Context Protocol (MCP) Java SDK

1. Maven如何下载MCP Java SDK 基础配置(核心模块) 在您的pom.xml文件中添加以下依赖: <dependencyManagement> <dependencies> <dependency> <groupId>io.modelcontextprotocol.sdk</groupId> <artifactI…...

第三章 爬虫提速、selenium模块、requests模块进阶(终)

目录 一.requests进阶 &#xff08;一&#xff09;处理cookie &#xff08;二&#xff09;防盗链 &#xff08;三&#xff09;代理 二.爬虫提速 &#xff08;一&#xff09;线程池和进程池 &#xff08;二&#xff09;协程 &#xff08;三&#xff09;异步http请求-aio…...

unity使用内建组件给刚体增加重力

2019年3月9日11:10:24 unity开发中&#xff0c;有时候发现刚体上的重力不能满足我们的需要&#xff0c;可以通过使用内建组件Constant Force来增加重力&#xff1a; 在游戏对象上。请按照以下操作&#xff1a; 为Player添加一个名为Constant Force组件&#xff0c;选择Player在…...

Java开发中的设计模式之观察者模式详细讲解

观察者模式&#xff08;Observer Pattern&#xff09;是一种行为型设计模式&#xff0c;它定义了对象之间的一种一对多的依赖关系。当一个对象的状态发生改变时&#xff0c;所有依赖于它的对象都会自动收到通知并更新。这种模式在Java开发中非常常见&#xff0c;尤其是在事件驱…...

【学习笔记】计算机网络(九)—— 无线网络和移动网络

第9章 无线网络和移动网络 文章目录 第9章 无线网络和移动网络9.1 无线局域网WLAN9.1.1 无线局域网的组成9.1.2 802.11局域网的物理层9.1.3 802.11局域网的MAC层协议CSMA 协议CSMA/CD 协议 - 总线型 - 半双工CSMA/CA 协议 9.1.4 802.11局域网的MAC帧 9.2 无线个人区域网WPAN9.3…...

一个基于Django的写字楼管理系统实现方案

一个基于Django的写字楼管理系统实现方案 用户现在需要我用Django来编写一个写字楼管理系统的Web版本&#xff0c;要求包括增删改查写字楼的HTML页面&#xff0c;视频管理功能&#xff0c;本地化部署&#xff0c;以及人员权限管理&#xff0c;包含完整的代码结构和功能实现&am…...

C++面试考点:类(class)

1、类的定义 C中的类提供了面向对象编程、继承与多态的机制。其构成包括成员&#xff08;各种自定义数据&#xff09;、行为&#xff08;定义的函数操作&#xff09;、封装&#xff08;private、public、protected&#xff09;。核心是了解类的继承机制&#xff0c;以及各种封装…...

ThreadPoolExecutor 多线程用requests请求一个地址的时候为什么会报错,而多进程用requests请求一个地址的时候不会报错,为什么?

网络请求行为 多线程&#xff1a;requests 库底层依赖 urllib3&#xff0c;而 urllib3 使用连接池管理网络请求。在多线程环境中&#xff0c;连接池可能会因为线程间的竞争导致连接泄漏或超时。 多进程&#xff1a;每个进程独立管理自己的连接池&#xff0c;因此不会出现线程间…...

数据库脱裤

假设你已经getshell 找到mysql账号密码。 网站要连接mysql&#xff0c;就需要把mysql的账号密码保存在一个php文件中&#xff0c;类似config.php、common.inc.php等&#xff0c;在shell中&#xff0c;读取这些文件&#xff0c;找到其中信息即可 下面是一些常见平台的配置文…...

十二,<FastApi>中间件

什么是中间件? "中间件"是一个函数,它在每个请求被特定的路径操作处理之前,以及在每个响应之后工作. 代码示例: from fastapi import FastAPI, Response from fastapi import Request import uvicornapp FastAPI()app.middleware("http") async def m2…...

欢迎使用Markdown编辑器

使用Markdown编辑器 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个注…...

RabbitMQ架构原理及消息分发机制

RabbitMQ架构原理及消息分发机制 在现代分布式系统中&#xff0c;消息队列是不可或缺的组件之一。它不仅能够解耦系统模块&#xff0c;还能实现异步通信和削峰填谷。在众多消息队列中&#xff0c;RabbitMQ 因其高并发、高可靠性和丰富的功能而备受青睐。本文将从 RabbitMQ 的基…...

智能麻将出牌组件

开篇引言​ 麻将作为一款风靡全球的策略性游戏&#xff0c;其复杂的规则和多变的牌局给玩家带来了无尽乐趣。在数字化时代&#xff0c;运用编程技术为麻将游戏赋予智能&#xff0c;实现自动出牌功能&#xff0c;不仅能提升玩家体验&#xff0c;还能深入探索算法在博弈游戏中的…...

python脚本补充

本文是对实用的 Python 小脚本_python写脚本-CSDN博客的一点补充。对简单脚本的一些操作上的优化。 ###Utilities ### ###重命名文件名 import os import tkinter as tk from tkinter import filedialog, simpledialog, messageboxdef batch_rename():# 弹出文件夹选择对话框d…...

【经验记录贴】活用shell,提高工作效率

背景 最近在做测试的时候&#xff0c;需要手动kill服务的进程&#xff0c;然后通过命令重启服务&#xff0c;再进行测试。每次重启都会涉及到下面三个命令的执行&#xff1a; 1&#xff09;检索进程ID $ ps -elf | grep programname root 1123 112 1234 0 0 0 0:00…...

出现 ERR_CERT_COMMON_NAME_INVALID | 301 302 重定向的解决方法

目录 前言1. 问题所示2. 原理分析3. 解决方法前言 🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF 爬虫神器,无代码爬取,就来:bright.cn 1. 问题所示 执行代码时,出现如下提示: GET https://xxxx/admin-api/system...

解决本地浏览器访问服务器端语音识别项目显示“麦克风未授权”的问题

解决本地浏览器访问服务器端语音识别项目显示“麦克风未授权”的问题 在 chrome://flags 启用特殊权限&#xff08;不推荐长期启用&#xff09; 在浏览器地址栏输入&#xff1a; chrome://flags然后搜索&#xff1a; Insecure origins treated as secure 找到类似项&#xff…...

【数论】线性筛质数

线性筛质数 在之前的一篇筛质数的文章中只解释了埃式筛质数的方法&#xff0c;没有解释线性筛质数的方法 我们先看一下线性筛质数的代码 【例题】 给定一个正整数 n&#xff0c;请你求出 1∼n 中质数的个数。 输入格式 共一行&#xff0c;包含整数 n。 输出格式 共一行…...

视频孪生重构施工逻辑:智慧工地的数字化升级

当"智慧工地"概念在2017年首次写入《建筑业发展"十三五"规划》时&#xff0c;行业普遍将其等同于摄像头与传感器的简单叠加。十年数字浪潮冲刷下&#xff0c;智慧工地的内涵已发生本质跃迁&#xff1a;从工具层面的信息化改造&#xff0c;进化为基于视频数…...

【Lerobot】加载本地数据LeRobotDataset数据、读取并解析parquet

官方例子&#xff1a;https://github.com/huggingface/lerobot/blob/main/examples/1_load_lerobot_dataset.py https://github.com/NVIDIA/Isaac-GR00T/blob/main/getting_started/LeRobot_compatible_data_schema.md 使用SO100机械臂进行数据采集后&#xff0c;得到如下格式…...

卷积神经网络 CNN 模型介绍

卷积神经网络 CNN 模型介绍 一、经典CNN模型1. LeNet-5&#xff08;基础模型&#xff09;2. AlexNet3. VGGNet&#xff08;VGG16/VGG19&#xff09;4. ResNet&#xff08;残差网络&#xff09; 二、轻量化CNN模型1. MobileNet系列2. EfficientNet3. ShuffleNet 三、改进型CNN模…...

Vue —— 实用的工具函数

目录 响应式数据管理1. toRef 和 torefs2. shallowRef 和 shallowReactive3. markRaw 依赖追踪与副作用1. computed2. watch 和 watchEffect 类型判断与优化1. unref2. isRef 、isReactive 和 isProxy 组件通信与生命周期1. provide 和 inject2. nextTick 高级工具1. useAttrs …...

Langchain + Gemini API调用基本操作

本文参考Langchain中ChatGoogleGenerativeAI的官方文档&#xff0c;在本地的jupyter notebook中运行。 关于API的细节在官方文档最开头给出&#xff1a; 我们在使用时&#xff0c;可以选择model"gemini-2.0-flash-001"或者生成图片的ChatGoogleGenerativeAI(model“…...

软件线上故障复盘报告

软件线上故障复盘报告‌ ‌故障编号‌&#xff1a;INC-2024XXX ‌复盘日期‌&#xff1a;YYYY-MM-DD ‌参与人员‌&#xff1a;研发/运维/测试/产品/客服负责人 一、故障概况 1.1 基础信息 字段内容数据来源故障等级P0/P1/P2&#xff08;参考SLA分级标准&#xff09;运维告警…...

分享:批量提取图片文字并自动命名文件,ocr识别图片指定区域并重命名文件名工具,基于WPF和腾讯OCR识别的接口的视线方案

一、项目背景 在处理大量图片时,常常需要从图片中提取特定区域的文字信息,并依据这些信息对图片进行重命名。例如,在档案管理领域,大量纸质文件被扫描成图片后,需要从图片中提取关键信息(如文件编号、日期等)来重命名图片,以便后续的检索和管理;在电商领域,商家可能…...

SIMULIA-Abaqus有限元分析软件针对汽车行业的解决方案

汽车行业是Abaqus软件的一个重要应用领域&#xff0c;许多知名的汽车企业都是Abaqus的用户&#xff0c;本文为您重点介绍Abaqus针对汽车行业有哪些应用及其解决方案。 Abaqus是一款什么软件&#xff1a; Abaqus公司是世界知名的计算机仿真行业的软件公司&#xff0c;成立于197…...

linux下使用php修改php.ini的session.save_path无效的解决办法

linux下安装php的组合还是php-fpm和nginx&#xff0c;其实已经安装好了&#xff0c;网站已经能够跑起来了&#xff0c;但是遇到后台登录的时候验证码一直不对&#xff0c;看了下报错&#xff0c;session无法存储&#xff0c;于是新增了一个phpinfo文件&#xff0c;使用web查看下…...

脚本-QQ批量发送消息(图片和文字)

目录 代码 代码功能详解 注意事项 致谢 代码 import io import traceback import win32clipboard import pyautogui import pyperclip import win32gui # 替换为pywin32的正确模块名 import pandas as pd import time from PIL import Imageclass QQAutoMessage:def __in…...

高等数学A1 期末救济(导数)

基于song复习 闭区间上连续函数的性质 在闭区间里&#xff0c;f(x)连续> f(x)有界 导数 导数三种定义及不同写法 常用导数公式 可导→连续&#xff0c;但连续❎→可导 切线类问题求解 求某点切线方程与求过某点的切线方程 反函数求导法则 反函数的导数直接函数导数的导数 例…...

前端VUE框架理论与应用(7)

一、用 v-for 把一个数组对应为一组元素 我们可以用 v-for 指令基于一个数组来渲染一个列表。v-for 指令需要使用 item in items 形式的特殊语法,其中 items 是源数据数组,而 item 则是被迭代的数组元素的别名。 在 v-for 块中,我们可以访问所有父作用域的属性。v-for 还…...

argparse

argparse.add_argument 完全指南 &#x1f9f1; 基础篇&#xff1a;命令行参数解析入门 1. 模块初始化 import argparse# 创建参数解析器&#xff08;所有操作的基础容器&#xff09; parser argparse.ArgumentParser( progMyApp, # 程序名称&#xff08;默认从sys.argv[0]…...

力扣-hot100(移动零)

283. 移动零 简单 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0] 示例 2: 输…...

优先级队列的实模拟实现

优先级队列底层默认用的是vector来存储数据&#xff0c;实现了类似我们数据结构中学习过的堆的队列&#xff0c;他的插入和删除都是优先级高先插入和删除。下面我们来模拟实现它们常见的接口来熟悉优先级队列。 仿函数 在介绍优先级队列之前&#xff0c;我们先熟悉一个概念&a…...

ES6的`class`中,`super`关键字在构造函数和非构造函数中的行为有何不同?

在 ES6 的 class 中&#xff0c;super 关键字的行为在 构造函数 和 非构造函数&#xff08;普通方法&#xff09; 中有显著区别&#xff0c;主要体现在以下方面&#xff1a; 1. 构造函数中的 super 行为规则 必须显式调用&#xff1a; 在子类的构造函数中&#xff0c;必须先调…...

从 BI 与 SQL2API 的差异,看数据技术的多元发展路径

在数据驱动的商业世界里&#xff0c;商业智能&#xff08;BI&#xff09;与 SQL2API 如同两颗闪耀的星星&#xff0c;各自散发着独特的光芒。BI 早已在企业中广泛应用&#xff0c;成为数据分析领域的中流砥柱&#xff1b;而 SQL2API 作为新兴技术&#xff0c;虽潜力巨大&#x…...

UNet脑瘤医学影像分割训练实战(PyTorch 完整代码)

UNet是一种基于卷积神经网络&#xff08;CNN&#xff09;的医学影像分割模型&#xff0c;由Ronneberger等人于2015年提出。本文我们将简要介绍基于PyTorch框架&#xff0c;使用UNet模型在脑瘤医学影像分割数据集上进行训练&#xff0c;同时通过SwanLab监控训练过程&#xff0c;…...

MySQL事务隔离级别详解

MySQL事务隔离级别详解 1. 基本概念 1.1 什么是事务隔离级别&#xff1f; 事务隔离级别是数据库管理系统为了保证数据一致性&#xff0c;在多个事务并发访问时提供的不同级别的保护机制。 1.2 事务并发问题 脏读&#xff08;Dirty Read&#xff09;&#xff1a; 一个事务读…...

2025年K8s最新高频面试题

目录 Kubernetes的核心组件有哪些,各自作用是什么? Pod和Deployment的区别? Service有哪些类型,分别适用于什么场景? ConfigMap和Secret有什么区别? StatefulSet 和 Deployment 的主要区别是什么? 什么是 Ingress,有哪些常用实现方式? 如何限制 Kubernetes 中 Pod …...

CobaltStrike

概述 Cobalt Strike是⼀款基于java的渗透测试神器&#xff0c;常被业界⼈称为CS神器。⾃3.0以后已经不在使用 Metasploit框架⽽作为⼀个独⽴的平台使用&#xff0c;分为客户端与服务端&#xff0c;服务端是⼀个&#xff0c;客户端可以有 多个&#xff0c;⾮常适合团队协同作战…...

Web前端 (CSS篇)

什么是CSS&#xff1f; css(Cascading Style Sheets)是层叠样式表或级联样式表&#xff0c;是一组设置规则&#xff0c;用于控制web页面外观。 为什么使用CSS? CSS 用于定义网页的样式&#xff0c;包括针对不同设备和屏幕尺寸的设计和布局。 CSS 实例 body {background-col…...