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

Go语言中支持的internal目录配置与组织内私网包配置详解

Go 中的内部包

  • 这里可能会有歧义
    • 可能是 Go 的 internal 目录中的包
    • 也可能是指内部开发的包

函数和变量的可见性

  • 对于函数和变量而言,有如下规则:
  • 1 )小写字母开头的函数变量结构体只能在本包内访问
  • 2 )大写字母开头的函数变量结构体可以在其他包访问
  • 注意
    • 如果, 结构体是大写字母开头,字段或方法名是小写字母开头
    • 这些字段和方法也只能在本包内访问

示例

  • pkg-demo/ 工程目录
    • pkg/
      • pkg.go
    • main.go

pkg.go

package pkgimport "fmt"var TestVer1 = "TestVer1" // public
var tesVer2 = "tesVer2"  // privateconst (TestConst1 = "TestConst1" // publictestConst2 = "testConst2" // private
)// public 结构体
type TestStruct1 struct {Field1 string // publicfield2 string // private 外部不可访问
}// private 结构体
type testStruct2 struct {Field1 stringfield2 string // private 外部不可访问
}// public 方法
func (ts1 TestStruct1) Test1() {fmt.Println(TestConst1)
}// private 方法
func (ts1 TestStruct1) test2() {fmt.Println(testConst2)
}// public 方法
func (ts2 testStruct2) Test21() {fmt.Println(testConst2)
}// private 方法
func (ts2 testStruct2) test21() {fmt.Println(testConst2)
}// 包内函数均可正常访问
func f() {fmt.Println(testConst2, tesVer2)// private 结构体t := testStruct2 {Field1: "we",field2: "lee", // private 字段}t.test21() // private 方法
}

main.go

package mainimport ("fmt""demo/pkg"
)func main() {fmt.Println( pkg.TestConst1 ) // 正常fmt.Println( pkg.TestVer1 ) // 正常ts := pkg.TestStruct1{ Field1: "test" } // 正常ts.Test() // 正常ts.test2() // 报错ts2 := pkg.TestStruct1{ Field1: "test", field2: "dddd" } // 报错
}
  • 在同一个包内,大小写都可以正常访问
  • 在包外,只能访问大写开头的
  • 大小写只能控制包内的常量,变量,方法是否可以被其他包所调用
  • 如果要限制整个包都不能被外部导入,就需要用到 internal 目录

internal 目录

  • internal 目录是控制包的可见性的
  • 在go1.4版本呢可以使用 internal 目录限制包的导入权限
  • 用于分离应用中的共享和非共享代码
  • 编译的时候,Go 会进行强行校验 (那internet文件夹内的代码包中声明的公开程序实体)
  • 比如说大写开头的常量变量函数方法等,它只能被它父目录下面的包或者是子包所引用

目录结构嵌套示例

  • i-demo/

    • a/
      • a.go
      • b/
        • b.go
        • c/
          • c.go
          • f/
            • f.go
          • internal/ 注意看这里
            • d/
              • d.go
              • e/
                • e.go
                • f/
                  • f.go
        • g/
    • main.go
  • 如上结构,在 internal 目录中有 d包和e包

    • 也就是说在这个 internal 文件夹下面
    • 这些包只能被 internal 的同级目录以及它下面的子目录里面的包所调用
    • 也就是说,和 internal 目录平级的 c.go 中可调用 internal 目录下的程序
    • 比如 internal 下面的d包和e包
    • 和 internal 同级的 f包,在其下的 f.go 中 也可调用 internal 目录下的程序,同上
  • 如果跨了一层目录,也就是 internal 父目录的父目录

    • 也就是这个b目录,我们看一下这个b包下面有一个 b.go 的文件
    • 在这个b包下面调用 internal 目录内的程序实体就会报错
  • 所以只要跨越了一个父目录,就没办法使用 internal 下面的开的程序实体

internal目录的意义

  • 在有些场景下,一些包不被其他的工程导入是很有必要的
  • 比如我们的后端服务,通常有用户层的业务代码和运营管理后台的代码
  • 如果用户层的业务代码不小心导入了管理后台的某些包
  • 而管理后台服务定义的一些方法的权限通常很大,它能够对全部用户的数据进行操作
  • 这样可能会很容易出现安全隐患
  • 所以, 我们通常会将工程的业务代码呢都放到 internal 目录下面
  • 那只有一些工具包或者是一些公用的包,我们放在这个 internal 文件夹的外面

企业内部包

  • 我们开发的包上传到企业内部的git平台上,以供其他的业务组使用
  • 这种情况下,我们应该怎么从内部的git平台上使用这些包呢

1 )第一种方式: 通过本地包的方式导入

  • 我们可以通过本地包的方式导入,那这就需要用到 go mod 的另一个语法 replace
  • 将源码 import 的包替换成本地包的路径
  • 看下具体实现
    • 1 )初始化private-pkg工程
      • $ mkdir private-pkg
      • $ cd private-pkg
      • $ go mode init github.com/xxx/private-pkg 这里的 xxx 作为示例,可替换成你们自己gitlab或gitee等真实的仓库
      • 这样初始化完成了一个 private-pkg 的包
      • $ mkdir pkg && touch pkg.go
      • 写一些程序到 pkg.go中, 例如
        package pkg
        var Pkg string
        
      • 此时发现,go.mod 中的 顶部一行 module github.com/xxx/private-pkg
    • 2 )初始化上面目录同级的 xxx-pkg 项目工程
      • $ touch main.go
      • 现在在这里的 main 包 调用上面 private-pkg 中的 pkg包内的属性或方法
        // main.go
        package main
        import ("fmt""xxx.gitlab.com/xxx/private-pkg" // 注意,这里是红色的,说明目前有问题
        )func main() {fmt.Println(pkg.Pkg) // 这里是 红的
        }
        
      • 这时候,就需要正确导入 private-pkg 包了
      • $ go mod init xxx-pkg 同上,这里的 xxx 也是随意举例的写法
      • 通过上面的执行,生成了 go.mod 的文件
      • $ go mod tidy 发现并没有在网络上拉取包并写入go.mod中
      • 我们需要修改 go.mod
        module xxx-pkggo 1.20
        require(xxx.gitlab.com/xxx/private-pkg latest
        )
        
      • 再次执行 $ go mod tidy 直接报错
        • 404 Not Found
        • 我们的包是没有上传到gitlab平台的,所以找不到
        • 这里面提一点,如果使用了go代理,但是如果同时设置GOPRIVATE,也就是设置了私有包地址
        • 凡是使用私有包的域名,都会走相应的源码平台获取
        • 假如,我们的 $GOPRIVATE 设置的是 *.gitlab.com
        • 所以,凡是匹配到 *.github.com 的,都会走源码获取
      • 解决方案
        • 在 go.mod 中
          module xxx-pkggo 1.20
          require(xxx.gitlab.com/xxx/private-pkg => ../private-pkg
          )
          
        • 通过,这样,就可以把包导入进来
        • 之后回到 main.go 中,点击红色的包,选择 Sync dependencies of xxx-pkg
        • 之后就开始同步了,这个过程相当于执行了 $ go mod tidy
        • 这时候包的依赖被我们解决了
        • 同时,回到 go.mod 文件中可看到 原来的 require 变成了2行 replace, 并且源码地址后面多了一串尾版本号
      • 这就是通过本地导入的方式,使用远程地址的包名的方法
    • go.mod 除了 replace 还有 include(已在1.20时移除) 和 exclude 等语句
      • 这里看一下 exclude
        exclude (dependency latest
        )
        
        例如:
        exclue (github.com/google/uuid v1.1.0
        )
        
      • 可以排除指定的依赖包,在实际项目中基本用不到
      • 除非我们知道某个版本有严重的bug, 可以用于排除指定包的某个版本
      • 注意:replace, include, exclude 只有在当前模块为主模块的时候才会生效
      • 也就是说,比如 xxx-pkg 工程目录是主模块,在这个主模块中调用 同级的 private-pkg 模块
      • 如果 replace, include, exclude 在 private-pkg 中,对主模块是不生效的

2 )第二种方式: 通过私有仓库的方式来导入

  • 通过本地replace方式导入呢存在一个很大的弊端
  • 由于replace引入的是本地环境的路径, 当其他人使用这个工程的时候
  • 他必须把这些代码拉取到本地放到与工程目录相对应的目录,才能构建成功
  • 方式1中导入本地路径是有一个相对路径的,只有放到这个相对路径下面,这个工程呢才能构建成功
  • 当 replace 包发生变更,或者是需要手动更新包里面的这些代码的时候呢,就非常麻烦了
  • 我们就需要通过get命令,将我们这个 private-pkg 的代码update到最新
  • 企业内部为了避免各个业务重复造轮,也会考虑将内部开发的这些包在企业内实现共享
    企业内部的这些包就不需要走Go的代理去拉取,直接到企业内部的git平台上,就可以拉这些包的源码了

示例

  • 准备:go版本在1.11+, 在 go1.13之前,需要开启我们的 Go Modules
    • 即,环境变量 GO111MODULE 设置为 on 或 $ go env -w GO111MODULE=on
  • 设置 GOPROXY
    • 即:$ export GOPROXY=https://goproxy.cn/,https://mirrors.aliyun.com/goproxy/,direct
    • 或:$ go env -w GOPROXY=https://goproxy.cn/,https://mirrors.aliyun.com/goproxy/,direct
  • 设置 GOPRIVATE
    • 即:$ export GOPRIVATE=*.gitlab.com
    • 或:$ go env -w GOPRIVATE=*.gitlab.com
  • 之后在公司内网的gitlab上创建私有包
    • 比如把这个 private-pkg 同步上去,并打一个tag
    • 注意,没有tag就会使用最新的commit-id中的hash
  • 在工程目录中移除之前处理的 go.mod 内的一些 require等配置
  • 在工程根目录中执行 $ go mod tidy
    • 下载完成后,go.mod 就生成了当前的依赖

GOPROXY 与 GOPRIVATE

  • GOPROXY: 顾名思义就是go用来下载依赖包的一个代理。
    • go在拉取包的时候,根据这个环境变量设置的值(地址)里面来拉取我们的依赖包
    • 从go 1.11版本开始支持的,也就是跟随 Go Modules 诞生的
    • GOPROXY 默认地址是 https://proxy.golang.org
    • 这是个国外的一个代理地址,在国内拉取包会比较慢
    • 我们通常推荐使用七牛云的地址
      • 七牛云推出非盈利的代理网站,免费,可靠,持续在线,经过cdn加速的代理
      • 速度快且稳定
    • 并且最后还使用 direct 这个关键词
    • 这个direct的含义是什么呢?
      • 也就是说当我们的包从这个 GOPROXY 取不到的时候
      • 就直接通过 go.mod中配置的地址去拉取
    • 这样可以保证最大限度的能把这个包拉取下来
    • 同样,GOPROXY 除了设置我们的地址, 还可以将它设置为 off
      • GOPROXY="off" 表示不许从任何源下载依赖包
    • 需要注意的是
      • 工作中,不是所有包都可以从公网的代网网站去拉取
      • 有些包我们不要要走代理,比如内部git平台(内网)
      • 这个时候,可以通过配置 GOPRIVATE 来实现
  • GOPRIVATE: 组织内部的源,非公网上
    • 从go的1.13版本开始支持的
    • 作用是:让指定的域名不走代理也不进行 Go Modules 校验
    • 配置方式和这个 GOPRIVATE 是类似的
      • 可以使用域名,也可以使用域名的通配符
      • 比如: *.gitlab.com
      • 就是说,凡是通过这个域名拉取的包,都是不走 GOPROXY 代理的

其他环境变量

  • GONOPROXY: 与 GOPRIVATE 有相同作用

    • 他们都是从go 1.13版本开始支持的
    • 都可以用来配置让指定域名的包不走 GOPROXY 设置的代理
  • GONOSUMDB

    • 用来控制是否走 Go Modules 校验
    • go 在拉取包的时候,会对包进行hash校验
    • 通常,我们可以让内部私有包,不去进行校验
  • GONOPROXYGOPROXYGOPRIVATE 区别

    • 1 )GONOPROXY + GONOSUMDB 可以让包走私有地址拉取并不进行包的校验
    • 2 )GOPRIVATE 走私有地址拉包,不走GOPROXY拉取,并不进行包校验
    • 实际上1和2是等效的,并且工作中 GOPRIVATE 更方便
    • 最佳实践是
      • 一般公网上的仓库版本代码容易被修改或删除的风险
      • 企业内部需要建立自己的镜像仓库,将项目使用的包同步到企业内部
      • 并对这些包进行安全审核,避免使用有重大安全漏洞的包
  • 如果要使用 GONOPROXYGONOSUMDB 配置的一般顺序是

    • GOPROXY=https://xxx…
    • GONOPROXY=*gitlab.com
    • GONOSUMDB=$GONOPROXY
  • 实际工作中,只需要配置 GOPROXY 和 GOPRIVATE

相关文章:

Go语言中支持的internal目录配置与组织内私网包配置详解

Go 中的内部包 这里可能会有歧义 可能是 Go 的 internal 目录中的包也可能是指内部开发的包 函数和变量的可见性 对于函数和变量而言,有如下规则:1 )小写字母开头的函数变量结构体只能在本包内访问2 )大写字母开头的函数变量结…...

如何使用Nmap加强网络安全?

Nmap是Network Mapper(网络映射器)的缩写,是一个用于端口和IP扫描以及应用程序检测的开源工具。网络和系统管理员将其用于清点网络资产、管理服务升级计划和监视服务正常运行时间。 起初,它是作为一款Linux工具而开发的&#xff…...

LeetCode 2487. 从链表中移除节点:单调栈

【LetMeFly】2487.从链表中移除节点:单调栈 力扣题目链接:https://leetcode.cn/problems/remove-nodes-from-linked-list/ 给你一个链表的头节点 head 。 移除每个右侧有一个更大数值的节点。 返回修改后链表的头节点 head 。 示例 1: 输…...

LabVIEW在高精度机器人视觉定位系统中的应用

在现代工业自动化中,精确的机器人视觉定位系统对于提高生产效率和产品质量至关重要。LabVIEW软件,以其卓越的图像处理和自动化控制功能,在这一领域发挥着重要作用。本案例将展示LabVIEW如何帮助开发和实现一个高精度的机器人视觉定位系统&…...

Arm CCA机密计算扩展

目录 Realms Realm World和Root World Arm TrustZone扩展和Arm RME之间有什么区别? 在《什么是机密计算?》中所述,Arm CCA允许您在阻止更高特权软件实体(例如Hypervisor)访问的同时部署应用程序或虚拟机(VM)。然而,通常由这些特权软件实体管理内存等资源。在这种情况…...

【Unity入门】热更新框架之xLua

目录 一、xLua概述1.1xLua简介1.2xLua安装 二、Lua文件加载2.1执行字符串2.2加载Lua文件2.3自定义loader 三、xLua文件配置3.1打标签3.2静态列表3.3动态列表 四、Lua与C#交互4.1 C#访问Lua4.1.1 获取一个全局基本数据类型4.1.2 访问一个全局的table4.1.3 访问一个全局的functio…...

大数据Doris(四十五):物化视图选择最优

文章目录 物化视图选择最优 物化视图选择最优 下面详细解释一下第一步最优物化视图是被如何选择出来的。 这里分为两个步骤: 对候选集合进行一个过滤。只要是查询的结果能从物化视图数据计算(取部分行,部分列,或部分行列的聚合)出都可以留在候选集中,过滤完成后候选集合…...

PostgreSQL10数据库源码安装及plpython2u、uuid-ossp插件安装

PostgreSQL10数据库源码安装及plpython2u、uuid-ossp插件安装 1、环境2、安装包下载3、安装3.1 、解压3.2、配置3.3、编译安装3.4 、启动与关闭 4、安装 uuid-ossp 、plpython2u插件5、参考 1、环境 centos 7 、 postgresql 10.19 2、安装包下载 postgres 源码安装包 3、安…...

如何成为ChatGPT 优质Prompt创作者

如何提问? 我想让你成为我的Prompt创作者。你的目标是帮助我创作最佳的Prompt,这个Prompt将由你ChatGPT使用。你将遵循 以下过程:1.首先,你会问我Prompt是关于什么?我会告诉你,但我们需要 通过不断的重复来…...

LeetCode第71题 - 简化路径

题目 以 Unix 风格给出一个文件的绝对路径,你需要简化它。或者换句话说,将其转换为规范路径。 在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (…) 表…...

VSCode上远程调试代码出现的问题

记录一下: 真的是汗流浃背了,师妹叫帮忙如何在VSCode上远程调试代码,一些自己已经经历过的问题,现在已经忘记了。又在网上一顿搜索,这次记录下吧。。。 出现以下问题: 1. 终端界面总是sh-4.4 $ &#xff…...

【langchain】入门初探实战笔记(Chain, Retrieve, Memory, Agent)

1. 简介 1.1 大语言模型技术栈 大语言模型技术栈由四个主要部分组成: 数据预处理流程(data preprocessing pipeline)嵌入端点(embeddings endpoint )向量存储(vector store)LLM 终端&#xff…...

《数据结构、算法与应用C++语言描述》- 平衡搜索树 -全网唯一完整详细实现插入和删除操作的模板类

平衡搜索树 完整可编译运行代码见:Github::Data-Structures-Algorithms-and-Applications/_34Balanced search tree 概述 本章会讲AVL、红-黑树、分裂树、B-树。 平衡搜索树的应用? AVL 和红-黑树和分裂树适合内部存储的应用。 B-树适合外部存储的…...

网络路由跟踪工具

随着企业网络需求的增长,组织发现监控和管理其网络基础设施变得越来越困难。网络管理员正在转向其他工具和资源,这些工具和资源可以使他们的工作更轻松一些,尤其是在故障排除方面。 目前,网络管理员主要使用简单、免费提供的实用…...

设计模式 七大原则

1.单一职责原则 单一职责原则(SRP:Single responsibility principle)又称单一功能原则 核心:解耦和增强内聚性(高内聚,低耦合)。 描述: 类被修改的几率很大,因此应该专注…...

(1)(1.13) SiK无线电高级配置(一)

文章目录 前言 1 监控链接质量 2 诊断范围问题 3 MAVLink协议说明 前言 本文提供 SiK 遥测无线电(SiK Telemetry Radio)的高级配置信息。它面向"高级用户"和希望更好地了解无线电如何运行的用户。 !Tip 大多数用户只需要 SiK Radio v2 中提供的基本…...

drf知识--10

接口文档 # 后端把接口写好后: 登录接口:/api/v1/login ---> post---name pwd 注册接口 查询所有图书带过滤接口 # 前后端需要做对接,对接第一个东西就是这个接口文档,前端照着接口文档开发 公司3个人&#xff…...

探索 Vue 实例方法的魅力:提升 Vue 开发技能(下)

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…...

mysql死锁排查

查看正在进行中的事务 SELECT * FROM information_schema.INNODB_TRX;字段解释trx_id唯一事务id号,只读事务和非锁事务是不会创建id的trx_state事务的执行状态,值一般分为:RUNNING, LOCK WAIT, ROLLING BACK, and COMMITTING.trx_started事务…...

若依项目(ruoy-vue)多模块依赖情况简要分析

主pom文件关键点分析 properties标签声明变量信息:版本号、编码类型、java版本spring-boot依赖形式:spring-boot-dependencies、pom、importdependencies中添加本项目内部模块,同时在modules中声明模块packaging打包选择pom设置打包maven-co…...

【普中开发板】基于51单片机的篮球计分器液晶LCD1602显示( proteus仿真+程序+设计报告+讲解视频)

基于普中开发板51单片机的篮球计分器液晶LCD1602显示 1.主要功能:讲解视频:2.仿真3. 程序代码4. 设计报告5. 设计资料内容清单&&下载链接资料下载链接(可点击): 基于51单片机的篮球计分器液晶LCD1602显示 ( pr…...

按照层次遍历结果打印完全二叉树

按照层次遍历结果打印完全二叉树 按照推论结果&#xff1a; l 层首个节点位置 2h-l - 1l 层节点间距&#xff1a;2h-l1 - 1 编码实现 public static<E> void print(BinaryTree<E> tree) {List<List<Node<E>>> levelNodeList levelOrderTraver…...

基于SpringBoot的药店管理系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于SpringBoot的药店管理系统,java项目…...

Java 泛型深入解析

Java 中的泛型是一种强大的编程特性&#xff0c;允许我们编写更加通用和类型安全的代码。本篇博客将深入探讨 Java 泛型的各个方面&#xff0c;包括泛型类、泛型方法、泛型接口以及泛型通配符。 1. 泛型类 首先&#xff0c;让我们看一个简单的泛型类的例子。在下面的代码中&a…...

Apache Doris (六十): Doris - 物化视图

🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你学编程的个人空间-豹哥教你学编程个人主页-哔哩哔哩视频 目录...

【javaweb】tomcat9.0中的HttpServlet

2023年12月28日&#xff0c;周四晚上 目录 什么是HttpServlet tomcat中的HttpServlet由谁产生 什么是HttpServlet 在Tomcat中&#xff0c;HttpServlet 是 Java Servlet API 中的一个抽象类&#xff0c;用于简化基于HTTP协议的Servlet的开发。HttpServlet 扩展了 GenericServ…...

数据结构学习笔记——查找算法中的树形查找(B树、B+树)

目录 前言一、B树&#xff08;一&#xff09;B树的概念&#xff08;二&#xff09;B树的性质&#xff08;三&#xff09;B树的高度&#xff08;四&#xff09;B树的查找&#xff08;五&#xff09;B树的插入&#xff08;六&#xff09;B树的删除 二、B树&#xff08;一&#xf…...

python包chromadb安装失败总结

1&#xff0c;背景&#xff1a; 最近在学习langchain的课程&#xff0c;里面创建自己的知识库的Retrieval模块中&#xff0c;需要用到向量数据库。 所以按照官方的教程&#xff08;vectorstores&#xff09;&#xff0c;准备使用chroma的向量数据库。图片来源 2&#xff0c;问…...

机器学习(四) -- 模型评估(2)

系列文章目录 机器学习&#xff08;一&#xff09; -- 概述 机器学习&#xff08;二&#xff09; -- 数据预处理&#xff08;1-3&#xff09; 机器学习&#xff08;三&#xff09; -- 特征工程&#xff08;1-2&#xff09; 机器学习&#xff08;四&#xff09; -- 模型评估…...

泊松分布与二项分布的可加性

泊松分布与二项分布的可加性 泊松分布的可加性 例 : 设 X , Y X,Y X,Y 相互独立 , X ∼ P ( λ 1 ) X\sim P(\lambda_1) X∼P(λ1​) , Y ∼ P ( λ 2 ) Y\sim P(\lambda_2) Y∼P(λ2​) , 求证 Z X Y ZXY ZXY 服从参数为 λ 1 λ 2 \lambda_1 \lambda_2 λ1​λ2​ …...

网站建设寻求/腾讯新闻发布平台

在C#中&#xff0c;new关键字主要有如下三种用法&#xff1a; new 运算符 用于创建对象和调用构造函数。new 修饰符 用于隐藏基类成员的继承成员。new 约束 用于在泛型声明中约束可能用作类型参数的参数的类型。1.new 运算符 1).用于创建对象和调用构造函数 示例&#xff1a;Cl…...

制作网站的方法有哪些内容/企业网站建设要多少钱

问题描述&#xff1a;使用HtmlAgilityPack分析页面结构&#xff0c;抓取到要遍历的节点列表后&#xff0c;foreach每个节点&#xff0c;数据取到的都一样&#xff0c;代码如下 HtmlNodeCollection carInfList htmlDoc.DocumentNode.SelectNodes("//div[idbrandtab-1]/div…...

提供免费主页空间的网站/网络口碑营销的成功案例

2、深度优先和广度优先 深度优先DFS 1、访问顶点V 2、从V的未被访问的邻接点出发&#xff0c;对图进行深度优先遍历&#xff1b; 3、直到访问到与V相通的节点&#xff1b; 4、若此时图中尚有顶点未被访问&#xff0c;则从一个未被访问的顶点出发&#xff0c;重新进行深度优先…...

做营销型网站一般要多少钱/b站推广入口2023年

前不久后台有一个粉丝给我留言&#xff1a;为什么很多人参加校招的时候&#xff0c;宁愿低薪也要进大厂&#xff0c;而不选择更高薪的小公司呢&#xff1f;我想了一下&#xff0c;大概是有3个原因&#xff1a;一是大厂薪资高、待遇好&#xff0c;二是大厂的工作方式更加体系化&…...

网站设计特色/seo快速排名软件推荐

前面的《配置中心》和《服务注册&服务提供者》这两篇分别讲解了配置中心和服务提供者&#xff0c;但是服务提供者使用的配置文件还是本地的&#xff0c;没有使用配置中心的配置文件。今天看看如何实现服务提供者使用配置中心的配置文件。新建项目sc-eureka-client-provider…...

相册网站模板/sem分析是什么意思

正式决定从KID改到Genshi。虽然Jinja的性能的确好&#xff0c;但是Script风格的Web template毕竟还是不如XML风格的好看和规范。试了一下发现&#xff0c;Genshi与KID的差别也不是很大&#xff0c;迁移过来还是很方便的。Genshi是一个日文词汇“原糸&#xff08;げんし&#xf…...