10、go工程化与标准库
目录
- 一、用go mod管理工程
- 二、包引入规则
- 三、init调用链
- 四、可见性
- 五、标准库
- 1 - 时间函数
- 2 - 数学计算
- 3 - I/O操作
- 4 - 编码
一、用go mod管理工程
- 初始化项目:
go mod init $module_name
,$module_name和目录名可以不一样。上述命令会生成go.mod文件
module maingo 1.19require gonum.org/v1/gonum v0.12.0
- 包查找规则:Go依次从当前项目、GOROOT、GOPATH下寻找依赖包
- 从当前go文件所在的目录逐级向上查找go.mod文件(假设go.mod位于目录mode_path下),里面定义了module_name,则引入包的路径为"module_name/包相对于mode_path的路径"
- go标准库提供的包在GOROOT/src下
- 第三方依赖包在GOPATH/pkg/mod下
- 包管理命令
- 从go1.7开始,go get只负责下载第三方依赖包,并把它加到go.mod文件里,由go install负责安装二进制文件
go get github.com/mailru/easyjson
会在GOPATH/pkg/mod目录下生成github.com/mailru/easyjson目录go install github.com/mailru/easyjson/easyjson
会在GOPATH/bin下生成easyjson二进制可执行文件
- go mod tidy通过扫描当前项目中的所有代码来添加未被记录的依赖至go.mod文件或从go.mod文件中删除不再被使用的依赖
- 从go1.7开始,go get只负责下载第三方依赖包,并把它加到go.mod文件里,由go install负责安装二进制文件
二、包引入规则
- 包的声明:
- go文件的第一行声明 package xxx
- 在包声明的上面可写关于包的注释,包注释也可以专门写在doc.go里
- 包名跟目录名可以不同
- 同一个目录下,所有go文件的包名必须一致
- **包的引用 **
- 可以直接使用同目录下其他go文件里的变量、函数、结构体
- 跨目录使用则需要变量前加入包名,并且引入包所在的目录
imoprt "go-course/package"
:go-course是model名,package是目录名mypackage.Add()
:mypackage是包名,它对应的目录是package
- 在import块里可以引用父目录,也可以引用子目录
- 引用关系不能构成一个环
- 在import的目录前面可以给包起一个别名
imoprt asd "go-course/package"
asd.Add()
三、init调用链
- init函数
- main函数是go程序的唯一入口,所以main函数只能存在一个;main函数必须位于main包中
- 在main函数执行之前会先执行init()函数
- 在一个目录,甚至一个go文件里,init()可以重复定义
- 引入其他包时,相应包里的init()函数也会在main()函数之前被调用
- 包引用而不用:
import _ "net/http/pprof"
- 在目录前加一个_,代码里却没有显式地使用这个包里的函数或变量,实际上是想执行这个包里的init()函数
四、可见性
- 可见性
- 以小写字母开头命名的函数、变量、结构体只能在本包内访问
- 以大写字母开头命名的函数、变量、结构体在其他包中也可以访问
- 如果结构体名字以大写字母开头,而其成员变量、成员方法以小写字母开头,则这样的成员只能在本包内访问
- internal包:
- Go中命名为internal的package,可以被平级目录和上一级目录所访问,更上层的目录不能访问
- c目录(internal的上一级目录)及其子孙目录之间可以任意import,但a目录和b目录不能import internal及其下属的所有目录
五、标准库
1 - 时间函数
- 时间属性
func time_pro() {now := time.Now()fmt.Println(now.Unix()) //秒 -> 时间戳 1677915658fmt.Println(now.UnixMilli()) //毫秒 -> 时间戳 1677915658844fmt.Println(now.UnixMicro()) //微秒 -> 时间戳 1677915658844888fmt.Println(now.UnixNano()) //纳秒 -> 时间戳 1677915658844888900fmt.Println(now.Weekday().String())fmt.Println(now.Hour())fmt.Println(now.Minute())fmt.Println(now.Second())fmt.Println(now.Month())fmt.Println(int(now.Month())) //3 -> type Month intfmt.Println(now.Year())fmt.Println(now.YearDay()) //当前年的第几天fmt.Println(now.Day()) //当前月的第几天fmt.Println(now.Date()) //2023 March 4}
- 时间运算
func time_calc() {begin := time.Now()for i := 1; i < 10000; i++ {fmt.Printf("")}fmt.Println("use some time")//时间差计算方式1:useTime1 := time.Since(begin) //计算时间差,返回类型是time.Durationfmt.Println(useTime1.Seconds()) //0.000523fmt.Println(useTime1.Nanoseconds()) //523000fmt.Println("----------------------")//时间差计算方式2:end := time.Now()useTime2 := end.Sub(begin) //计算时间差,返回类型是time.Durationfmt.Println(useTime2.Seconds()) //0.000523fmt.Println(useTime2.Nanoseconds()) //523000fmt.Println("----------------------")//获取相对时间dua := time.Duration(8 * time.Hour)end_dua := begin.Add(dua)fmt.Println(end_dua) //2023-03-04 23:53:38.4740063 +0800 CST m=+28800.002135201
}
- 时间格式化
const (TIME_FMT = "2006-01-02 15:04:05"TIME_FMT1 = "2006-01-02"TIME_FMT2 = "20060102"
)func time_fmt() {begin := time.Now()fmt.Println(begin) //2023-03-04 16:01:19.7069136 +0800 CST m=+0.003180001//格式化必须使用 "2006-01-02 15:04:05" 此格式fmt.Println(begin.Format(TIME_FMT)) //2023-03-04 16:01:19fmt.Println(begin.Format(TIME_FMT1)) //2023-03-04fmt.Println(begin.Format(TIME_FMT2)) //20230304
}
- 文本转时间
func time_parse() {//不建议直接使用Parseif t, err := time.Parse(TIME_FMT1, "2022-02-18"); err == nil {fmt.Println(t.Year()) //2022fmt.Println(t.Month()) //Februaryfmt.Println(t.Day()) //18}//建议使用ParseInLocationloc, _ := time.LoadLocation("Asia/Shanghai")if t, err := time.ParseInLocation(TIME_FMT1, "2022-02-18", loc); err == nil {fmt.Println(t.Year()) //2022fmt.Println(t.Month()) //Februaryfmt.Println(t.Day()) //18}
}
- 周期执行:
time.NewTicker
func main() {tk := time.NewTicker(1 * time.Second)defer tk.Stop()for i := 0; i < 10; i++ {<-tk.C //阻塞1秒钟fmt.Printf("第[%d]次执行,[%d]\n", i, time.Now().Unix())}tk.Stop()
}
- 定时执行:
time.NewTimer
、<-time.After
func main() {// tm := time.NewTimer(time.Duration(3 * time.Second))// type Duration int64 -> 可以不需要time.Duration,Nanosecond也是Duration类型// const (// Nanosecond Duration = 1// Microsecond = 1000 * Nanosecond// Millisecond = 1000 * Microsecond// Second = 1000 * Millisecond// Minute = 60 * Second// Hour = 60 * Minute// )tm := time.NewTimer(3 * time.Second)defer tm.Stop()<-tm.C //阻塞3秒钟fmt.Println(time.Now().Unix())//或者用<-time.After(3 * time.Second) //阻塞3秒钟fmt.Println(time.Now().Unix())
}
- 重复使用timer:
Reset
func main() {tm := time.NewTimer(3 * time.Second)defer tm.Stop()<-tm.C //阻塞3秒钟fmt.Println(time.Now().Unix())for i := 0; i < 6; i++ {tm.Reset(1 * time.Second)//使用Reset可以多次使用Timer<-tm.Cfmt.Println(time.Now().Unix())}
}
2 - 数学计算
- 数学常量
func main() {fmt.Println(math.E) //自然对数的底,2.718281828459045fmt.Println(math.Pi) //圆周率,3.141592653589793fmt.Println(math.MaxInt) //9223372036854775807fmt.Println(uint64(math.MaxUint64)) //18446744073709551615
}
- math.NaN()
func math_nan() float64 {if f, err := strconv.ParseFloat("12.56X8", 64); err == nil {return f} else {return math.NaN()}
}func main() {fmt.Println(math.NaN()) //NaNrect := math_nan()if math.IsNaN(rect) {fmt.Println("出错了")}
}
- **常用函数 **
func main() {//常用函数fmt.Println(math.Ceil(1.1)) //向上取整,2fmt.Println(math.Floor(1.9)) //向下取整,1。 math.Floor(-1.9)=-2fmt.Println(math.Trunc(1.9)) //取整数部分,1fmt.Println(math.Modf(2.5)) //返回整数部分和小数部分,2 0.5fmt.Println(math.Abs(-2.6)) //绝对值,2.6fmt.Println(math.Max(4, 8)) //取二者的较大者,8fmt.Println(math.Min(4, 8)) //取二者的较小者,4fmt.Println(math.Mod(6.5, 3.5)) //x-Trunc(x/y)*y结果的正负号和x相同,3fmt.Println(math.Sqrt(9)) //开平方,3fmt.Println(math.Cbrt(9)) //开三次方,2.08008//对数和指数fmt.Println(math.Log(5)) //默认底数为自然对数math.E,1.60943fmt.Println(math.Log1p(4)) //等价于Log(1+p),确保结果为正数,1.60943fmt.Println(math.Log10(100)) //以10为底数,取对数,2fmt.Println(math.Log2(8)) //以2为底数,取对数,3fmt.Println(math.Pow(3, 2)) //x^y,9fmt.Println(math.Pow10(2)) //10^x,100fmt.Println(math.Exp(2)) //e^x,7.389//三角函数fmt.Println(math.Sin(1))fmt.Println(math.Cos(1))fmt.Println(math.Tan(1))fmt.Println(math.Tanh(1))
}
- 随机数生成
func math_rand() {rand.Seed(time.Now().UnixMilli()) //如果对两次运行没有一致性要求,可以不设seed随机种子fmt.Println(rand.Int()) //随机生成一个整数fmt.Println(rand.Float32()) //随机生成一个浮点数fmt.Println(rand.Intn(100)) //100以内的随机整数,[0,100)fmt.Println(rand.Perm(100)) //把[0,100)上的整数随机打乱arr := []int{1, 2, 3, 4, 5, 6, 7, 8, 9}rand.Shuffle(len(arr), func(i, j int) { //随机打乱一个给定的slicearr[i], arr[j] = arr[j], arr[i]})fmt.Println(arr)
}
- 自定义rand
func math_rand() {//创建一个Randsource := rand.NewSource(time.Now().UnixMicro()) //seed相同的情况下,随机数生成器产生的数列是相同的rander := rand.New(source)for i := 0; i < 10; i++ {fmt.Printf("%d ", rander.Intn(100))}fmt.Println()source.Seed(time.Now().UnixMicro()) //必须重置一下Seedrander2 := rand.New(source)for i := 0; i < 10; i++ {fmt.Printf("%d ", rander2.Intn(100))}
}
3 - I/O操作
- 格式化输出
输出格式 | 输出内容 |
---|---|
%t | 单词 true 或 false |
%b | 表示为二进制 |
%d | 表示为十进制 |
%e | (=%.6e)有 6 位小数部分的科学计数法,如 -1234.456e+78 |
%f | (=%.6f)有 6 位小数部分,如 123.456123 |
%g | 根据实际情况采用 %e 或 %f 格式(获得更简洁、准确的输出) |
%s | 直接输出字符串或者字节数组 |
%v | 值的默认格式表示 |
%+v | 类似 %v,但输出结构体时会添加字段名 |
%#v | 值的 Go 语法表示 |
%Т | 值的类型的 Go 语法表示 |
- 标准输入
func std_io() {fmt.Println("please input two string")var s1 stringfmt.Scan(&s1)var s2 stringfmt.Scan(&s2)fmt.Printf("you input %s %s", s1, s2)var i intfmt.Scan(&i)fmt.Printf("input int is %d", i)
}
- 读写文件:一般使用read_file2来读文件
func read_file1() {if file, err := os.Open("go.mod"); err != nil {fmt.Println(err)} else {defer file.Close()var buffer strings.Builderfor {bs := make([]byte, 1024)if n, err := file.Read(bs); err != nil {fmt.Println(err)if err == io.EOF { //读到文件末尾break}} else {fmt.Printf("从文件中读出了%d个字节\n", n)buffer.WriteString(string(bs))}}fmt.Println(buffer.String())}
}
func read_file2() {if file, err := os.Open("go.mod"); err != nil {fmt.Println(err)} else {defer file.Close()reader := bufio.NewReader(file) //使用bufio效率更高var i intfor {if line, err := reader.ReadString('\n'); err != nil {fmt.Println(err)if err == io.EOF {break}} else {fmt.Printf("第%d行\n", i)fmt.Print(line)// fmt.Println(strings.Trim(line, "\n"))i++}}}
}
- 写文件
func write_file1() {if file, err := os.OpenFile("lala.txt", os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0666); err != nil {fmt.Println(err)} else {defer file.Close()file.Write([]byte("hello\n"))}
}func write_file2() {if file, err := os.OpenFile("lala.txt", os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0666); err != nil {fmt.Println(err)} else {defer file.Close()writer := bufio.NewWriter(file) //使用bufio效率更高writer.WriteString("hello") //只是把内容写到内存缓冲区writer.WriteString("\n")writer.Flush() //强行将缓冲区内容刷新到磁盘中}
}
- **创建文件/目录 **:
- os.Create(name string)//创建文件
- os.Mkdir(name string, perm fs.FileMode)//创建目录
- os.MkdirAll(path string, perm fs.FileMode)//增强版Mkdir,沿途的目录不存在时会一并创建
- os.Rename(oldpath string, newpath string)//给文件或目录重命名,还可以实现move的功能
- os.Remove(name string)//删除文件或目录,目录不为空时才能删除成功
- os.RemoveAll(path string)//增强版Remove,所有子目录会递归删除
func main() {os.Remove("lala.txt")os.MkdirAll("p1/p2", 0666)os.Create("p1/p2/lala.txt")os.RemoveAll("p1")os.Create("old.txt")os.Rename("old.txt", "new.txt")
}
- 获取文件属性
func main() {file, _ := os.Open("go.mod")fmt.Println(file.Name()) //go.modinfo, _ := file.Stat()fmt.Println(info.IsDir()) //falsefmt.Println(info.ModTime()) //2023-03-02 15:30:15.2281889 +0800 CSTfmt.Println(info.Mode()) //-rw-rw-rw-fmt.Println(info.Size()) //57fmt.Println(info.Name()) //go.mod
}
- 遍历目录
func walk_dir(path string) error {if fileInfos, err := ioutil.ReadDir(path); err != nil {return err} else {for _, fileInfo := range fileInfos {fmt.Println(fileInfo.Name())if fileInfo.IsDir() {// if err := walk_dir(path + "/" + fileInfo.Name()); err != nil {//更通用的写法,根据不同的操作系统来拼接目录if err := walk_dir(filepath.Join(path, fileInfo.Name())); err != nil {return err}}}}return nil
}func main() {walk_dir("D:/Program Files")
}
- log日志
func logger() {if file, err := os.OpenFile("mage.log", os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0666); err != nil {fmt.Println(err)} else {defer file.Close()logWriter := log.New(file, "[BIZ_NAME]", log.Ldate|log.Lmicroseconds)logWriter.Println("hello")logWriter.Println("jack")logWriter.Println("tom")}
}
- 系统命令
func sys_call() {cmd_path, err := exec.LookPath("netstat")if err != nil {fmt.Println("os不支持 netstat命令")} else {fmt.Println(cmd_path)cmd := exec.Command("netstat", "-s")output, err := cmd.Output()if err != nil {fmt.Println(err)} else {fmt.Print(string(output))}}//不需要接收执行返回cmd := exec.Command("calc")if err := cmd.Run(); err != nil {fmt.Println(err)}
}
4 - 编码
- compress:compress包下实现了zlib、bzip、gip、lzw等压缩算法
func compress() {fin, _ := os.Open("go.mod")fout, _ := os.OpenFile("go.mod.zlib", os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0666)writer := zlib.NewWriter(fout)defer fin.Close()defer fout.Close()for {bs := make([]byte, 10)n, err := fin.Read(bs)if err != nil {if err == io.EOF {break} else {fmt.Println(err)}} else {writer.Write(bs[:n])}}writer.Flush()//读压缩文件fin, _ = os.Open("go.mod.zlib")reader, _ := zlib.NewReader(fin)io.Copy(os.Stdout, reader)reader.Close()fin.Close()
}
- json:json是go标准库里自带的序列化工具,使用了反射,效率比较低
func test_json() {user := User{"jack", 18}if bs, err := json.Marshal(user); err != nil {fmt.Println(err)} else {fmt.Println(string(bs)) //{"Name":"jack","Age":18}}
}
- easyjson:
- easyjson只针对预先定义好的json结构体对输入的json字符串进行纯字符串的截取,并将对应的json字段赋值给结构体
- easyjson -all xxx.go 生成go文件中定义的结构体对应的解析
- xxx.go所在的package不能是main
func test_easyjson() {user := stru.User{Name: "jack", Age: 18}if bs, err := easyjson.Marshal(user); err != nil {fmt.Println(err)} else {fmt.Println(string(bs)) //{"Name":"jack","Age":18}}
}
- base64:
- base64经常在http环境下用来传输较长的信息
- 任意byte数组都可以采用base64编码转为字符串,并且可以反解回byte数组
- 编码和解码的方法是公开、确定的, base64不属于加密算法
func test_base64() {fin, _ := os.Open("C:/Users/nd/Desktop/Gopher.jpeg")bs := make([]byte, 1<<20)n, _ := fin.Read(bs)str := base64.StdEncoding.EncodeToString(bs[:n])fmt.Println(str)bbb, _ := base64.StdEncoding.DecodeString(str)fout, _ := os.OpenFile("pic.png", os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0666)fout.Write(bbb)fout.Close()
}
相关文章:
10、go工程化与标准库
目录一、用go mod管理工程二、包引入规则三、init调用链四、可见性五、标准库1 - 时间函数2 - 数学计算3 - I/O操作4 - 编码一、用go mod管理工程 初始化项目:go mod init $module_name,$module_name和目录名可以不一样。上述命令会生成go.mod文件 mod…...
【Selenium自动化测试】鼠标与键盘操作
在 WebDriver 中,与鼠标操作相关的方法都封装在ActionChains 类中,与键盘操作相关的方法都封装在Keys类中。下面介绍下这两个类中的常用方法。 鼠标操作 ActionChains类鼠标操作常用方法: context_click():右击double_click()&…...
自定义javax.validation校验枚举类
枚举类单一情况 package com.archermind.cloud.phone.dto.portal.external.validation.validator;import com.archermind.cloud.phone.dto.portal.external.validation.constraints.EnumValidation; import lombok.extern.slf4j.Slf4j;import javax.validation.ConstraintVali…...
[Java·算法·中等]LeetCode39. 组合总和
每天一题,防止痴呆题目示例分析思路1题解1分析思路2题解2👉️ 力扣原文 题目 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形…...
【Linux】vi和vim编辑器
目录主题主题 三种常见模式: 正常模式 以vim 打开一个档案就直接进入一般模式了(这是默认的模式)。在这个模式中,你可以使用[上下左右]按键来移动光标,你可以使用『删除字符』或『删除整行』来处理档案内容,也可以使用「复制、…...
BIO,NIO,AIO
IO模型 用什么样的通道进行数据传输和接收,java支持3种io网络编程模式 BIO NIO AIO BIO 同步阻塞 一个客户端连接对应一个处理线程 BIO示例代码(客户端和服务端) package com.tuling.bio;import java.io.IOException; import java.net.So…...
代码随想录刷题-数组-有序数组的平方
文章目录有序数组的平方习题暴力排序双指针有序数组的平方 本节对应代码随想录中:代码随想录,讲解视频:有序数组的平方_哔哩哔哩_bilibili 习题 题目链接:977. 有序数组的平方 - 力扣(LeetCode) 给你一…...
【玩转c++】stack和queue的介绍和模拟实现
本期主题:list的讲解和模拟实现博客主页: 小峰同学分享小编的在Linux中学习到的知识和遇到的问题小编的能力有限,出现错误希望大家不吝赐stack的介绍和使用1.1.stack的介绍1. stack是一种容器适配器,专门用在具有后进先出操作的上…...
Linux order(文件、磁盘、网络、系统管理、备份压缩)
1. Linux 文件命令 -rwxrwxrwx chmod:change mode,用于(文件所有者或 root )变更用户(u:owner g:group o:other a:all)的权限 chmod [OPTION]… MODE[,MODE]… FILE… OPTION -R:递归修改more option:chmod…...
最详细的CentOS7安装Mysql数据库服务
1.查看是否安装mysql: rpm -qa | grep mysql如果有查出来东西,使用命令删除: rpm -e xxx2.检查是否有mysql用户组和mysql用户,没有就添加有就忽略: groups mysql 添加用户组和用户 groupadd mysql && useradd -r -g mysql mysql&a…...
【IoT】项目管理:如何做好端到端的项目管理?
今天主要来谈谈项目管理这个话题。 首先来看一个我在网络上看到的一个关于项目管理的案例或者是段子。 将项目管理的作用及意义非常直观地展示了出来。 有一个植树搞绿化的企业,在公司内部设置有五个部门,分别是: 运输部门;挖坑部…...
渲染十万条数据就把你难住了?不存在的!
虚拟列表的使用场景如果我想要在网页中放大量的列表项,纯渲染的话,对于浏览器性能将会是个极大的挑战,会造成滚动卡顿,整体体验非常不好,主要有以下问题:页面等待时间极长,用户体验差CPU计算能力…...
编程学习的心路历程和困惑回顾
回首入行9年的经历,从大一开始学习C语言和数据结构,老师一直是在用IDE演示程序的编写和运行,我们也就一直在跟黑乎乎的命令行窗口打交道。 后来在一些课程的实验环节,接触到了一些别人编写好的工程代码,知道了Makefile…...
请介绍类加载过程,什么是双亲委派模型?
第23讲 | 请介绍类加载过程,什么是双亲委派模型? Java 通过引入字节码和 JVM 机制,提供了强大的跨平台能力,理解 Java 的类加载机制是深入 Java 开发的必要条件,也是个面试考察热点。 今天我要问你的问题是࿰…...
Navisworks编辑材质和Revit快速切换材质问题
一、如何在Navisworks2016中编辑材质 初次使用NW2016-2017时发现,原来用于创建编辑材质的小地球不见了,如图1所示,在各大技术群里求助没有回应,度娘搜索也总是摇头。 经过仔细排查可能出现的地方,终于找到了可以编辑材…...
Object对象键值的输出循序到底如何排列的?
1.日常摸鱼看八股 今天又是复习八股文的一天,发现还是彻底懂得原理才好和面试官吹牛批呀。 接着来看看我chat大宝贝的回答: 在现代浏览器中,Object 对象的键值输出循序是比较稳定的,通常是按照如下顺序输出: 所有的数…...
气泡式水位计的安装方法详解
气泡水位计的安装实际上就是气管的安装,气管的安装是否正确将直接影响到仪器测量数据的结果,气泡水位计它由活塞泵产生的压缩空气流经测量管和气泡室,进入被测的水体中,测量管中的静压力与气泡室上的水位高度成正比。那么接下来就…...
求“二维随机变量的期望E(X)与方差D(X)”例题(一)
离散型 设随机变量(X,Y)的联合分布律为 X\Y0100.10.210.30.4 (1)求E(X) 先求x的边缘分布律,表格里x0的概率为0.10.2,于是我们可得 X01P0.30.7直接求E(X)即可,得到结果 (2)求E(XY) 直接x与y相乘就行。 记得别乘多了,别的算了又…...
MySQL 搞定行转列,列转行
行转列方法总结1、使用case…when…then2、使用SUM(IF()) 生成列3、使用SUM(IF()) 生成列 WITH ROLLUP 生成汇总行4、使用SUM(IF()) 生成列 UNION 生成汇总行,并利用 IFNULL将汇总行标题显示为 Total5、使用SUM(IF()) 生成列,直接生成汇总结果,不再利用…...
正点原子裸机开发之C语言点灯程序
一. 简介 本文针对 IMX6ULL 的裸机开发的(即不带Linux操作系统的开发)。 主要分两部分的工作: 1. 配置 C语言运行环境 2. C 语言编写及运行 二. 配置C语言运行环境 配置 C 语言运行环境的工作分 三部分。如下: 1. 设置…...
cv::阈值分割OTUS原理+代码
opencv库的阈值分割分为全局分割和局部分割全局分割:普通分割ret1,th1 cv2.threshold(img,127, 255, cv2.THRESH_BINARY) #127为阈值 #cv2.THRESH_BINARY |cv2.THRESH_BINARY_INV | cv2.THRESH_TRUNC|cv2.THRESH_TOZERO|cv2.THRESH_TOZERO_INV局部分割:…...
Postgresql-12.5 visual studio-2022 windows 添加pg工程并调试
pg内核学习,记录一下 文章目录安装包编译安装VS添加Postgresql工程调试源码安装包 (1)perl下载 https://www.perl.org/get.html (2)diff下载 http://gnuwin32.sourceforge.net/packages/diffutils.htm (…...
长沙学院2023 第一次蓝桥训练题解
每道题都在洛谷上,每个题都有很详细的题解,可以先自行做,不会再看题解。 题目解析思路都写在代码中,中文题面就不单独解释题意了。 P2440 木材加工(二分答案) 链接:P2440 木材加工 解析 代码…...
云端Docker搭建ABY库以及本地CLion使用
文章目录ABY的搭建以及使用前言ABY库的下载、安装及测试CLion配置后续杂项项目改名使用其他的库最后ABY的搭建以及使用 前言 仅做记录,仅供参考,不同人有不同的使用方式命令手敲,可能有错,自己辨识勿问,我懂的也不多…...
ES6-箭头函数、解构赋值、对象简写
箭头函数特点 1、 (只有1个形参) 可以省略() 2、 {} 可以省略 只有一句代码 或 只有返回值的时候,省略return 3、arguments 不可用,arguments在没有形参的时候可以拿到调用函数拿在的实参 获取伪数组通过Array.from转为真数组。 4、 箭头函数没有this, …...
【CSS】CSS 背景设置 ② ( 背景位置 | 背景位置-方位值设置 )
文章目录一、背景位置1、语法说明2、注意事项二、背景位置-方位值设置1、效果展示2、完整代码示例一、背景位置 1、语法说明 如果 盒子的大小 大于 背景图片的大小 , 默认的 图片 位置是 左上角 ; 设置背景位置的 CSS 语法如下 : background-position : length length backgro…...
HTML 扫盲
✏️作者:银河罐头 📋系列专栏:JavaEE 🌲“种一棵树最好的时间是十年前,其次是现在” 目录前言HTML 结构快速生成代码框架HTML 常见标签注释标签标题标签: h1-h6段落标签:p换行标签:br格式化标签…...
项目中用到的责任链模式
目录 1.什么是责任链?它的原理是什么? 2.应用场景 3.项目中的应用 传送门:策略模式,工作中你用上了吗? 1.什么是责任链?它的原理是什么? 将请求的发送和接收解耦,让多个接收对象…...
C++复习笔记--STL的string容器和vector容器
1--string容器string 本质上是一个类,其不同于指针 char*,string 类的内部封装了 char*,用于管理字符串,是一个 char* 型的容器;1-1--string构造函数string 的构造函数原型:string(); // 创建一个空的字符串…...
第一章 软件项目管理概述
项目(Project)是为了创造一个唯一的产品或提供一个唯一的服务而进行的临时性的努力。项目的特征PMBOK(A guide to the Project management Body Of Knowledge:项目管理知识体系指南)五大过程组和十大知识领域从时间角度出发,项目管理分为五大过程组:启动…...
有服务器做网站/来几个关键词兄弟们
二分查找又称折半查找,它是一种效率较高的查找方法。折半查找的算法思想是将数列按有序化(递增或递减)排列,查找过程中采用跳跃式方式查找,即先以有序数列的中点位置为比较对象,如果要找的元素值小 于该中点元素,则将待…...
求一个能用的网址/pc网站优化排名
想找比较正宗的库,查了蛮久的。最后在 oauth官方站上,看到PHP版本的相关链接。 发现都是php 5.3版本以上的环境,基于命名空间的写法编写的。 访问下面这个页面,难得,发现文档给出了5.2版本的链接。 http://bshaffer.gi…...
东莞建站模板公司/谷歌搜索引擎网址
Dlink所出品的家庭网关类产品(DI-5xx、DI-6xx、DI-7xx、DI-8xx系列,以及新推出的DIR系列,但DI-60xLB/LB/HB系列除外)在使用PPPoE设置中,均有“联机方式”(共有三种可选:自动联机/手动联机/有流量…...
网站建设岗位说明/黑帽seo排名
题目传送门 1 /*2 题意:给出m个位置,每次把[p,len-p1]内的字符子串反转,输出最后的结果3 字符串处理:朴素的方法超时,想到结果要么是反转要么没有反转,所以记录4 每个转换的次数&a…...
服务器安装完面板怎么做网站/网站seo课程
UIBezierPath用于定义一个由直线/曲线组合而成的路径, 并且可以在自定义视图中渲染该路径. 在使用的过程中, 我们只需要先指定好路径的结构, 比如一条直线、一条贝塞尔曲线、一个矩形、一个椭圆、一个圆弧等, 然后使用系统为我们提供的方法将构建好的路径渲染出来即可 UIBezie…...
做煤网站/网络营销策划方案的目的
题图摄于上海世博会关注 亨利笔记 公众号,回复 GOTC ,可下载中国首个原创 CNCF 项目 Harbor 在 GOTC 大会上的演讲ppt 。 7 月 10 日,「GOTC 全球开源技术峰会“开源云原生计算时代论坛”」在上海世博中心召开。大会包含多个主题分论坛&#…...