Go语言基础之包
包(package)
Go语言中支持模块化的开发理念,在Go语言中使用包(package)来支持代码模块化和代码复用。一个包是由一个或多个Go源码文件(.go结尾的文件)组成,是一种高级的代码复用方案,Go语言为我们提供了很多内置包,如fmt、os、io等。
定义包
package packagename
其中:
- package:声明包的关键字
- packagename:包名,可以不与文件夹的名称一致,不能包含 - 符号,最好与其实现的功能相对应。
标识符可见性
如果想让一个包中的标识符(如变量、常量、类型、函数等)能被外部的包使用,那么标识符必须是对外可见的(public)。在Go语言中是通过标识符的首字母大/小写来控制标识符的对外可见(public)/不可见(private)的。在一个包内部只有首字母大写的标识符才是对外可见的。
package demoimport "fmt"// 包级别标识符的可见性// num 定义一个全局整型变量
// 首字母小写,对外不可见(只能在当前包内使用)
var num = 100// Mode 定义一个常量
// 首字母大写,对外可见(可在其它包中使用)
const Mode = 1// person 定义一个代表人的结构体
// 首字母小写,对外不可见(只能在当前包内使用)
type person struct {name stringAge int
}// Add 返回两个整数和的函数
// 首字母大写,对外可见(可在其它包中使用)
func Add(x, y int) int {return x + y
}// sayHi 打招呼的函数
// 首字母小写,对外不可见(只能在当前包内使用)
func sayHi() {var myName = "七米" // 函数局部变量,只能在当前函数内使用fmt.Println(myName)
}
包的引入
import importname "path/to/package"
其中:
- importname:引入的包名,通常都省略。默认值为引入包的包名。
- path/to/package:引入包的路径名称,必须使用双引号包裹起来。
- Go语言中禁止循环导入包。
一个Go源码文件中可以同时引入多个包,例如:
import "fmt"
import "net/http"
import "os"
当然可以使用批量引入的方式。
import ("fmt""net/http""os"
)
当引入的多个包中存在相同的包名或者想自行为某个引入的包设置一个新包名时,都需要通过importname指定一个在当前文件中使用的新包名。例如,在引入fmt包时为其指定一个新包名f。
import f "fmt"
这样在当前这个文件中就可以通过使用f来调用fmt包中的函数了。
f.Println("Hello world!")
如果引入一个包的时候为其设置了一个特殊_作为包名,那么这个包的引入方式就称为匿名引入。一个包被匿名引入的目的主要是为了加载这个包,从而使得这个包中的资源得以初始化。 被匿名引入的包中的init函数将被执行并且仅执行一遍。
import _ "github.com/go-sql-driver/mysql"
匿名引入的包与其他方式导入的包一样都会被编译到可执行文件中。
需要注意的是,Go语言中不允许引入包却不在代码中使用这个包的内容,如果引入了未使用的包则会触发编译错误。
init初始化函数
在每一个Go源文件中,都可以定义任意个如下格式的特殊函数:
func init(){// ...
}
这种特殊的函数不接收任何参数也没有任何返回值,我们也不能在代码中主动调用它。当程序启动的时候,init函数会按照它们声明的顺序自动执行。
每一个包的初始化是先从初始化包级别变量开始的。例如从下面的示例中我们就可以看出包级别变量的初始化会先于init初始化函数。
package mainimport "fmt"var x int8 = 10const pi = 3.14func init() {fmt.Println("x:", x)fmt.Println("pi:", pi)sayHi()
}func sayHi() {fmt.Println("Hello World!")
}func main() {fmt.Println("你好,世界!")
}
输出结果:
x: 10
pi: 3.14
Hello World!
你好,世界!
go module
Go module 是 Go1.11 版本发布的依赖管理方案,从 Go1.14 版本开始推荐在生产环境使用,于Go1.16版本默认开启。Go module 提供了以下命令供我们使用:
GOPRIVATE
设置了GOPROXY 之后,go 命令就会从配置的代理地址拉取和校验依赖包。当我们在项目中引入了非公开的包(公司内部git仓库或 github 私有仓库等),此时便无法正常从代理拉取到这些非公开的依赖包,这个时候就需要配置 GOPRIVATE 环境变量。GOPRIVATE用来告诉 go 命令哪些仓库属于私有仓库,不必通过代理服务器拉取和校验。
GOPRIVATE 的值也可以设置多个,多个地址之间使用英文逗号 “,” 分隔。我们通常会把自己公司内部的代码仓库设置到 GOPRIVATE 中,例如:
$ go env -w GOPRIVATE="git.mycompany.com"
使用go module引入包
go module 拉取和管理项目依赖
初始化项目我们在本地新建一个名为holiday项目,按如下方式创建一个名为holiday的文件夹并切换到该目录下:
$ mkdir holiday
$ cd holiday
目前我们位于holiday文件夹下,接下来执行下面的命令初始化项目。
$ go mod init holiday
go: creating new go.mod: module holiday
该命令会自动在项目目录下创建一个go.mod文件,其内容如下。
module holidaygo 1.16
其中:
- module holiday:定义当前项目的导入路径
- go 1.16:标识当前项目使用的 Go 版本
go.mod文件会记录项目使用的第三方依赖包信息,包括包名和版本,由于我们的holiday项目目前还没有使用到第三方依赖包,所以go.mod文件暂时还没有记录任何依赖包信息,只有当前项目的一些信息。
接下来,我们在项目目录下新建一个main.go文件,其内容如下:
// holiday/main.gopackage mainimport "fmt"func main() {fmt.Println("现在是假期时间...")
}
然后,我们的holiday项目现在需要引入一个第三方包github.com/q1mi/hello来实现一些必要的功能。类似这样的场景在我们的日常开发中是很常见的。我们需要先将依赖包下载到本地同时在go.mod中记录依赖信息,然后才能在我们的代码中引入并使用这个包。下载依赖包主要有两种方法。
第一种方法是在项目目录下执行go get命令手动下载依赖的包:
holiday $ go get -u github.com/q1mi/hello
go get: added github.com/q1mi/hello v0.1.1
这样默认会下载最新的发布版本,你也可以指定想要下载指定的版本号的。
holiday $ go get -u github.com/q1mi/hello@v0.1.0
go: downloading github.com/q1mi/hello v0.1.0
go get: downgraded github.com/q1mi/hello v0.1.1 => v0.1.0
如果依赖包没有发布任何版本则会拉取最新的提交,最终go.mod中的依赖信息会变成类似下面这种由默认v0.0.0的版本号和最新一次commit的时间和hash组成的版本格式:
require github.com/q1mi/hello v0.0.0-20210218074646-139b0bcd549d
如果想指定下载某个commit对应的代码,可以直接指定commit hash,不过没有必要写出完整的commit hash,一般前7位即可。例如:
holiday $ go get github.com/q1mi/hello@2ccfadd
go: downloading github.com/q1mi/hello v0.1.2-0.20210219092711-2ccfaddad6a3
go get: added github.com/q1mi/hello v0.1.2-0.20210219092711-2ccfaddad6a3
此时,我们打开go.mod文件就可以看到下载的依赖包及版本信息都已经被记录下来了。
module holidaygo 1.16require github.com/q1mi/hello v0.1.0 // indirect
行尾的indirect表示该依赖包为间接依赖,说明在当前程序中的所有 import 语句中没有发现引入这个包。
另外在执行go get命令下载一个新的依赖包时一般会额外添加-u参数,强制更新现有依赖。
第二种方式是我们直接编辑go.mod文件,将依赖包和版本信息写入该文件。例如我们修改holiday/go.mod文件内容如下:
module holidaygo 1.16require github.com/q1mi/hello latest
表示当前项目需要使用github.com/q1mi/hello库的最新版本,然后在项目目录下执行go mod download下载依赖包。
holiday $ go mod download
如果不输出其它提示信息就说明依赖已经下载成功,此时go.mod文件已经变成如下内容。
module holidaygo 1.16require github.com/q1mi/hello v0.1.1
从中我们可以知道最新的版本号是v0.1.1。如果事先知道依赖包的具体版本号,可以直接在go.mod中指定需要的版本然后再执行go mod download下载。
这种方法同样支持指定想要下载的commit进行下载,例如直接在go.mod文件中按如下方式指定commit hash,这里只写出来了commit hash的前7位。
require github.com/q1mi/hello 2ccfadda
执行go mod download下载完依赖后,go.mod文件中对应的版本信息会自动更新为类似下面的格式。
module holidaygo 1.16require github.com/q1mi/hello v0.1.2-0.20210219092711-2ccfaddad6a3
下载好要使用的依赖包之后,我们现在就可以在holiday/main.go文件中使用这个包了。
package mainimport ("fmt""github.com/q1mi/hello"
)func main() {fmt.Println("现在是假期时间...")hello.SayHi() // 调用hello包的SayHi函数
}
将上述代码编译执行,就能看到执行结果了。
holiday $ go build
holiday $ ./holiday
现在是假期时间...
你好,我是七米。很高兴认识你。
当我们的项目功能越做越多,代码越来越多的时候,通常会选择在项目内部按功能或业务划分成多个不同包。Go语言支持在一个项目(project)下定义多个包(package)。
例如,我们在holiday项目内部创建一个新的package——summer,此时新的项目目录结构如下:
holidy
├── go.mod
├── go.sum
├── main.go
└── summer└── summer.go
其中holiday/summer/summer.go文件内容如下:
package summerimport "fmt"// Diving 潜水...
func Diving() {fmt.Println("夏天去诗巴丹潜水...")
}
此时想要在当前项目目录下的其他包或者main.go中调用这个Diving函数需要如何引入呢?这里以在main.go中演示详细的调用过程为例,在项目内其他包的引入方式类似。
package mainimport ("fmt""holiday/summer" // 导入当前项目下的包"github.com/q1mi/hello" // 导入github上第三方包
)func main() {fmt.Println("现在是假期时间...")hello.SayHi()summer.Diving()
}
从上面的示例可以看出,项目中定义的包都会以项目的导入路径为前缀。
如果你想要导入本地的一个包,并且这个包也没有发布到到其他任何代码仓库,这时候你可以在go.mod文件中使用replace语句将依赖临时替换为本地的代码包。例如在我的电脑上有另外一个名为liwenzhou.com/overtime的项目,它位于holiday项目同级目录下:
├── holiday
│ ├── go.mod
│ ├── go.sum
│ ├── main.go
│ └── summer
│ └── summer.go
└── overtime├── go.mod└── overtime.go
由于liwenzhou.com/overtime包只存在于我本地,并不能通过网络获取到这个代码包,这个时候应该如何在holidy项目中引入它呢?
我们可以在holidy/go.mod文件中正常引入liwenzhou.com/overtime包,然后像下面的示例那样使用replace语句将这个依赖替换为使用相对路径表示的本地包。
module holidaygo 1.16require github.com/q1mi/hello v0.1.1
require liwenzhou.com/overtime v0.0.0replace liwenzhou.com/overtime => ../overtime
这样,我们就可以在holiday/main.go下正常引入并使用overtime包了。
package mainimport ("fmt""holiday/summer" // 导入当前项目下的包"liwenzhou.com/overtime" // 通过replace导入的本地包"github.com/q1mi/hello" // 导入github上第三方包
)func main() {fmt.Println("现在是假期时间...")hello.SayHi()summer.Diving()overtime.Do()
}
我们也经常使用replace将项目依赖中的某个包,替换为其他版本的代码包或我们自己修改后的代码包。
go.mod文件
go.mod文件中记录了当前项目中所有依赖包的相关信息,声明依赖的格式如下:
require module/path v1.2.3
其中:
- require:声明依赖的关键字
- module/path:依赖包的引入路径
- v1.2.3:依赖包的版本号。支持以下几种格式:
- latest:最新版本
- v1.0.0:详细版本号
- commit hash:指定某次commit hash
引入某些没有发布过tag版本标识的依赖包时,go.mod中记录的依赖版本信息就会出现类似v0.0.0-20210218074646-139b0bcd549d的格式,由版本号、commit时间和commit的hash值组成。
go.sum文件
使用go module下载了依赖后,项目目录下还会生成一个go.sum文件,这个文件中详细记录了当前项目中引入的依赖包的信息及其hash 值。go.sum文件内容通常是以类似下面的格式出现。
<module> <version>/go.mod <hash>
或者
<module> <version> <hash>
<module> <version>/go.mod <hash>
Go并没有提供一个中央仓库来管理所有依赖包,而是采用分布式的方式来管理包。为了防止依赖包被非法篡改,Go module 引入了go.sum机制来对依赖包进行校验。
依赖保存位置
Go module 会把下载到本地的依赖包会以类似下面的形式保存在 $GOPATH/pkg/mod目录下,每个依赖包都会带有版本号进行区分,这样就允许在本地存在同一个包的多个不同版本。
mod
├── cache
├── cloud.google.com
├── github.com└──q1mi├── hello@v0.0.0-20210218074646-139b0bcd549d├── hello@v0.1.1└── hello@v0.1.0
如果想清除所有本地已缓存的依赖包数据,可以执行 go clean -modcache 命令。
使用go module发布包
我们首先在自己的 github 账号下新建一个项目,并把它下载到本地。我这里就以创建和发布一个名为hello的项目为例进行演示。这个hello包将对外提供一个名为SayHi的函数,它的作用非常简单就是向调用者发去问候。
$ git clone https://github.com/q1mi/hello
$ cd hello
我们当前位于hello项目目录下,执行下面的命令初始化项目,创建go.mod文件。需要注意的是这里定义项目的引入路径为github.com/q1mi/hello,读者在自行测试时需要将这部分替换为自己的仓库路径。
hello $ go mod init github.com/q1mi/hello
go: creating new go.mod: module github.com/q1mi/hello
接下来我们在该项目根目录下创建 hello.go 文件,添加下面的内容:
package helloimport "fmt"func SayHi() {fmt.Println("你好,我是七米。很高兴认识你。")
}
然后将该项目的代码 push 到仓库的远端分支,这样就对外发布了一个Go包。其他的开发者可以通过github.com/q1mi/hello这个引入路径下载并使用这个包了。
一个设计完善的包应该包含开源许可证及文档等内容,并且我们还应该尽心维护并适时发布适当的版本。github 上发布版本号使用git tag为代码包打上标签即可。
hello $ git tag -a v0.1.0 -m "release version v0.1.0"
hello $ git push origin v0.1.0
经过上面的操作我们就发布了一个版本号为v0.1.0的版本。
Go modules中建议使用语义化版本控制,其建议的版本号格式如下:
其中:
- 主版本号:发布了不兼容的版本迭代时递增(breaking changes)。
- 次版本号:发布了功能性更新时递增。
- 修订号:发布了bug修复类更新时递增。
发布新的主版本
现在我们的hello项目要进行与之前版本不兼容的更新,我们计划让SayHi函数支持向指定人发出问候。更新后的SayHi函数内容如下:
package helloimport "fmt"// SayHi 向指定人打招呼的函数
func SayHi(name string) {fmt.Printf("你好%s,我是七米。很高兴认识你。\n", name)
}
由于这次改动巨大(修改了函数之前的调用规则),对之前使用该包作为依赖的用户影响巨大。因此我们需要发布一个主版本号递增的v2版本。在这种情况下,我们通常会修改当前包的引入路径,像下面的示例一样为引入路径添加版本后缀。
// hello/go.modmodule github.com/q1mi/hello/v2go 1.16
把修改后的代码提交:
hello $ git add .
hello $ git commit -m "feat: SayHi现在支持给指定人打招呼啦"
hello $ git push
打好 tag 推送到远程仓库。
hello $ git tag -a v2.0.0 -m "release version v2.0.0"
hello $ git push origin v2.0.0
这样在不影响使用旧版本的用户的前提下,我们新的版本也发布出去了。想要使用v2版本的代码包的用户只需按修改后的引入路径下载即可。
go get github.com/q1mi/hello/v2@v2.0.0
在代码中使用的过程与之前类似,只是需要注意引入路径要添加 v2 版本后缀。
package mainimport ("fmt""github.com/q1mi/hello/v2" // 引入v2版本
)func main() {fmt.Println("现在是假期时间...")hello.SayHi("张三") // v2版本的SayHi函数需要传入字符串参数
}
废弃已发布版本
如果某个发布的版本存在致命缺陷不再想让用户使用时,我们可以使用retract声明废弃的版本。例如我们在hello/go.mod文件中按如下方式声明即可对外废弃v0.1.2版本。
module github.com/q1mi/hellogo 1.16retract v0.1.2
用户使用go get下载v0.1.2版本时就会收到提示,催促其升级到其他版本。
相关文章:
Go语言基础之包
包(package) Go语言中支持模块化的开发理念,在Go语言中使用包(package)来支持代码模块化和代码复用。一个包是由一个或多个Go源码文件(.go结尾的文件)组成,是一种高级的代码复用方案…...
Switch模拟器-Ryujinx(龙神模拟器)安装教程
Ryujinx是由gdkchan带领团队运用C#语言创建并发布在GitHub平台的Switch开源模拟器. 系 统 要 求 内存8 GB RAM及以上 显卡支持Vulkan、OpenGL版本4.5及以上 64位系统 Windows 10 RS4(Redstone 4,版本 1803)或更高版本 软 件 教 程 第一…...
从Github中下载部分文件
我们经常回去Github中下载代码,但仓库中存在很多project代码。但我们如果只需要某一个或几个项目的代码,此时应该如何操作呢? 这里介绍两款工具,可以从仓库中下载部分文件的小工具: DownGit 和 GitZip 1. DownGit downGit 国内镜…...
webrtc安全性 加密方式
媒体加密与通信安全 有各种不同的做法会让实时通信软件暴露在安全隐患中。其中需要特别值得注意的是在信息传输的过程中截取未加密的媒体或者数据。这可以发生在浏览器到浏览器之间或者浏览器到服务器之间的通信过程中,第三方可以窃取到所有发送的数据。但是在数据加…...
【2023年11月第四版教材】软考上机考试操作指南(注意事项)
软考上机考试操作指南(注意事项) 1 考试注意事项2 获取<font color=blue>模拟作答系统1.1 方式1:绑定资源下载1.2 方式2:百度网盘下载1.3 方式3:官方下载1.4 说明3 模拟作答系统使用方法3.1 注意事项3.2 解压压缩文件3.3 运行软件3.4 考试科目选择3.5 登录3.6 阅读考…...
在vs code中创建一个名为 “django_env“ 的虚拟环境报错?!以下方法可以解决
# vs code 终端窗口中运行: mkvirtualenv django_env # 拓展: mkvirtualenv django_env 是一个命令,用于创建一个名为 "django_env" 的虚拟环境。虚拟环境是一种用于隔离不同Python项目所需依赖的工具。通过创建虚拟环境&#x…...
C++产生未定义的行为的原因分析
前言 最近一直在做QT开发,编程环境是VS2017和QT5.11.2 经常遇到的问题就是,在VS中调试程序,前面都是正常运行的,但是当关闭窗口,退出程序的时候,VS会抛出一个异常 “未加载ntdll.pdb,触发了一…...
C++ Qt QString类用法介绍
QString 是 Qt 框架中的一个重要类,用于处理 Unicode 字符串。它提供了大量的功能,方便开发者处理、查询和操作字符串。以下是 QString 的一些常用功能和示例: 构造和初始化 QString s1; // 默认构造函数,创建一个空字符串 QStr…...
亚马逊测评关于IP和DNS的问题
最近不少人询问了关于IP和DNS的问题,在此进行一些科普。 当客户端试图访问一个网站时,首先会向其所在的ISP的DNS服务器进行查询。如果ISP的DNS服务器没有相关缓存,则会向上级DNS服务器进行查询。 一些诸如CDN之类的服务,可能会为…...
新增Node.js运行环境、新增系统缓存清理功能,1Panel开源面板v1.7.0发布
2023年10月16日,现代化、开源的Linux服务器运维管理面板1Panel正式发布v1.7.0版本。 在这个版本中,1Panel新增Node.js运行环境;新增系统缓存清理功能;应用安装时支持选择远程数据库。此外,我们进行了40多项功能更新和…...
【SA8295P 源码分析 (一)】60 - QNX Host 如何新增 android_test 分区给 Android GVM 挂载使用
【SA8295P 源码分析】60 - QNX Host 如何新增 android_test 分区给 Android GVM 挂载使用 一、QNX 侧:创建分区、配置下载、配置透传1.1 修改分区表,新增 android_test 分区,大小为 2GByte1.2 下载 android_test.img 镜像1.3 配置 /dev/disk/android_test_a 分区透传到 Andr…...
天津滨海新区城市轨道交通电能管理系统方案与实施方案
【摘要】:介绍天津滨海新区轨道交通项目建设电能管理系统的系统架构、功能组成和实施方案。在借鉴其他城市轨道交通项目电能管理系统的基础上,结合天津滨海新区轨道交通建设的具体情况,对系统组网方案、测量表计设置原则、与通风空调节能系统和照明节能系…...
torch.cat 使用小节
torch.cat 使用小节 torch.cat 要求在所指定拼接维度之外的所有维度都要匹配,例如 import torch v1 torch.tensor([[1, 2, 3], [4, 5, 6], [4, 5, 6]]) # 3*3 v2 torch.tensor([[3, 6, 8]]) # 1*3 torch.cat([v1, v2], dim1)运行之后会报错 Sizes of tensors…...
Java:SpringBoot整合Spring Batch示例
目录 文档基础概念Tasklet方式示例Chunk方式示例参考文章 文档 https://docs.spring.io/spring-batch/docs/4.3.9/reference/html/index.html 基础概念 JobLauncher:作业启动器,启动作业的入口。对应的实现类为SimpleJobLauncher。Job:作业…...
Windows + Msys 下编译 TensorFlow 2.14
安装基本工具 pacman -S --needed zip unzip patch diffutils git 下载安装 Windows 版本 bazel 6.1.2,复制到 C:/Windows/system32 目录下,改名为 bazel.exe wget https://github.com/bazelbuild/bazel/releases/download/6.1.2/bazel-6.1.2-window…...
百度发布全新 AI 互动式搜索:百度简单搜索
本心、输入输出、结果 文章目录 百度发布全新 AI 互动式搜索:百度简单搜索前言主要能力 相关资料能力介绍 百度搜索升级发文告用户如何获取百度简单搜索百度简单搜索的定位百度简单搜索在 APP 上面的体验讨论和点评我们关注的几个问题 弘扬爱国精神 百度发布全新 AI…...
VUE开发记录
记录vue开发中遇到的问题 - 2023/10/16 问题:项目element-ui表单中,input点击需要打开弹框,弹框选择值后回填到input,但是此时elementUI的校验出错(值存在却校验为空) 解决方法: this.employee…...
2023年中国乳胶制品产量、需求量及市场规模分析[图]
乳胶泛指聚合物微粒分散于水中形成的胶体乳液,又称胶乳。习惯上将橡胶微粒的水分散体称为胶乳,而将树脂微粒的水分散体称为乳液。以乳胶为原料制成的制品称乳胶制品,常见的如海绵、手套、玩具、胶管等。 我国乳胶制品细分主要分为避孕套、乳胶…...
手撕Vue-数据驱动界面改变上
经过上一篇的介绍,已经实现了监听数据的变化,接下来就是要实现数据变化后,界面也跟着变化,这就是数据驱动界面改变。 想要实现数据变化之后更新UI界面,我们可以使用发布订阅模式来实现,先定义一个观察者类,…...
for循环中循环一次提交一次 insert update 关闭事务 spring springboot mybatis
省流: 在方法上直接加如下注解: Transactional(propagation Propagation.NOT_SUPPORTED) public void t1(){//业务代码 } 正文: 在测试的时候,有时候会希望在for循环中,代码循环一次就提交一次事务。 方法一&#…...
VS2010 C语言内嵌汇编语言程序
VS2010 C语言内嵌汇编语言程序 2021年7月28日席锦 在visual studio 2010中C语言使用内联汇编写代码 ,它的格式有两种, 一种是__asm 直接接汇编指令语句,比如:__asm int 3 // 软件中断 另一种是加上花括号,类似于一个函数&…...
【TES720D】青翼科技基于复旦微的FMQL20S400全国产化ARM核心模块
板卡概述 TES720D是一款基于上海复旦微电子FMQL20S400的全国产化核心模块。该核心模块将复旦微的FMQL20S400(兼容FMQL10S400)的最小系统集成在了一个50*70mm的核心板上,可以作为一个核心模块,进行功能性扩展,特别是用…...
css 左右滚轮无缝衔接
最近的项目有做到一个功能 类似跑马灯或者公告栏那种 有文字 也有列表的 所以 写了两种 第一种公告栏文字是用的js 第二种图文类型是用的css 两种方法 记录一下 第一种 纯文字滚动 其实也是根据js去计算dom的宽度 通过js去给css赋值 <div class"div1"><div …...
Hadoop分布式文件系统-HDFS
1.介绍 HDFS (Hadoop Distributed File System)是 Hadoop 下的分布式文件系统,具有高容错、高吞吐量等特性,可以部署在低成本的硬件上。 2.HDFS 设计原理 2.1 HDFS 架构 HDFS 遵循主/从架构,由单个 NameNode(NN) 和多个 DataNode(DN) 组成:...
专业图表绘制软件 OmniGraffle Pro mac v7.22.1中文版软件介绍
OmniGraffle Pro mac是一款Mac平台上的专业绘图软件,主要用于创建各种图形,包括流程图、组织结构图、网络拓扑图、UI原型等。该软件提供了强大的绘图工具和丰富的样式库,可以让用户快速创建出高质量的图形,并支持导入和导出各种常…...
Git 本地文件合并和恢复
前记: git svn sourcetree gitee github gitlab gitblit gitbucket gitolite gogs 版本控制 | 仓库管理 ---- 系列工程笔记. Platform:Windows 10 Git version:git version 2.32.0.windows.1 Function: Git 本地文件合并和恢复…...
记录git仓库pr没有显示贡献者的问题,以及如何提交一个pr(简)
git config --global --list # 查看全局配置(适用于所有仓库)的信息,可以添加 --global 标志git config --list # 查看你的Git配置git config user.name # 显示您的Git用户名。同样,可以替换 user.name 为其他配置项名称来查看特定…...
入侵检测代码
在人工智能中有个入侵检测:当检测到的目标位于指定区域内才算是入侵,思路很简单,判断相关坐标即可: from matplotlib import pyplot as plt, patches from shapely.geometry import Polygon, Pointdef is_intrusion(target_box, …...
数字孪生技术如何提高化工生产安全性?
随着科技的不断进步,数字孪生技术已经渗透到了各个领域,为化工行业带来了翻天覆地的变革。这一技术的应用不仅在生产效率方面发挥了积极作用,还在安全性、创新、环保和可持续性等多个方面作出了巨大的贡献。 化工行业常常涉及危险品和复杂的生…...
PHP 如何查看php函数源码
一、在git找到php对应的版本 找到对应的分支版本可以下载也可以在线直接查看 通过这个地址 https://github.com/php/php-src 二、下面已shuffle函数举例,版本为7.4 找到对应的版本进入 点击ext,这个文件夹里面是存放函数的目录 在文件夹里搜不到stu…...
网站怎么做二级页面/关键词优化的发展趋势
在JSP中可以使用许多不同的方式生成动态内容. 选择什么方式取决于项目大小和复杂程度. 直接调用Java代码:将所用代码放到JSP页面中间接的调用Java代码:插入需要调用类的方法使用JavaBean实用工具类:使用<jsp:useBean><jsp:getProp…...
如何做聚合类网站/全面网络推广营销策划
最近,Google 开源了其 TCP BBR 拥塞控制算法,并提交到了 Linux 内核,从 4.9 开始,Linux 内核已经用上了该算法。根据以往的传统,Google 总是先在自家的生产环境上线运用后,才会将代码开源,此次也…...
想自己做个网站/免费网站排名优化软件
金庸笔下的良好代码风格 转至:http://kb.cnblogs.com/page/202642/作者: 王路 发布时间: 2014-03-23 14:00 阅读: 8964 次 推荐: 43 原文链接 [收藏] 我零九年看过一本小说,讲程序员的故事,从此,了解了一个新物种。最近又…...
公司网站域名申请/内江seo
直接在centos操作系统安装 一、安装 pip install virtualenv二、创建环境 cd /opt/metersphere/datamkdir pythoncd python/# 当前文件夹下创建虚拟环境 virtualenv --copies .# 激活虚拟环境 下次进去就是在data目录下 source python/bin/activate source /bin/activate# 安…...
企业网站访问量的第一来源是( )/站长之家网站排行榜
题目:原题链接(中等) 标签:动态规划 解法时间复杂度空间复杂度执行用时Ans 1 (Python)O(N2)O(N^2)O(N2)O(N)O(N)O(N)2476ms (29.87%)Ans 2 (Python)Ans 3 (Python) 解法一: class Solution:def findLongestChain(se…...
wordpress 的ip怎么隐藏/一个新产品的营销方案
文章目录1 问题描述1.1 求整个DAG的最长路径(即不固定起点和终点)1.2 固定终点,求DAG的最长路径2 求解问题12.1 求解最长路径长度2.2 求解最长路径2.2.1 路径序列的字典序3 求解问题23.1 求解最长路径长度3 应用3.1 实际例题1 问题描述 1.1 …...