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

Go整洁架构设计——目录结构基本布局 随着项目的代码量在不断地增长,不同的开发人员按自己意愿随意布局和创建目录结构,项目维护性就很差,代码也非常凌乱。良好的目录与文件结构十分重要,尤其是团队合作的时候,良好的目录与文件结构可以减少很多不必要的麻烦。项目目录结构规范的的本质是提高了代码的可读性,最终目的是提高团队协作效率,降低工程维护成本。 阅读详情

Go 中的内部包

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

函数和变量的可见性

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

示例

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

pkg.go

package pkg

import "fmt"

var TestVer1 = "TestVer1" // public
var tesVer2 = "tesVer2"  // private

const (
	TestConst1 = "TestConst1" // public
	testConst2 = "testConst2" // private
)

// public 结构体
type TestStruct1 struct {
	Field1 string // public
	field2 string // private 外部不可访问
}

// private 结构体
type testStruct2 struct {
	Field1 string
	field2 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 main

import (
	"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-pkg
        
        go 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-pkg
          
          go 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校验
    • 通常,我们可以让内部私有包,不去进行校验
  • GONOPROXY 与 GOPROXY 与 GOPRIVATE 区别

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

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

golang 编程规范 - 项目目录结构 等。比如, 阅读详情

相关推荐

Go语言项目结构设计与最佳实践指南

Go语言的项目结构设计体现了其'约定优于配置'的核心哲学,通过目录命名约定和go.mod文件实现高效的依赖管理。在工程实践中,合理的包(package)划分和文件组织是保证代码可维护性的关键,需要遵循单一职责原则和低耦合高内聚的设计思想。典型的Go项目包含cmd、internal、pkg等标准目录,分别对应可执行程序入口、私有代码和公共库。随着Go Modules成为官方依赖管理方案,开发者可以更规范地管理项目依赖版本。这些设计原则特别适用于微服务架构和云原生应用开发,能有效提升项目的可扩展性和团队协作效率

weixin_33842304的博客 325

Golang模块级私有包(internal package mechanism)详解

内部包就是将代码放在名为internal的目录或名为internal的目录的子目录中。/a/b/c/internal/d/e/f目录中的代码只能被/a/b/c目录中代码(文件或子目录中代码)导入,而不能被/a/b/g目录下的代码导入;$GOROOT/src/pkg/internal/xxx只能被$GOROOT/src/目录中代码导入(文件或子目录中代码);$GOROOT/src/pkg/net/http/internal只能被net/http和net/http/* 导入;

路多辛的所思所想 2823

Go语言导出机制:首字母规则与包可见性本质

在Go语言中,'私有/公有'并非传统OOP的访问控制概念,而是由编译期决定的导出(exported)与未导出(unexported)机制——其唯一判定标准是标识符首字母是否为Unicode大写字母。该规则作用于函数、变量、结构体字段、方法乃至嵌套类型,构成Go模块系统最底层的封装契约。它不依赖运行时反射、IDE智能提示或作用域嵌套,而是在词法分析阶段即固化符号可见性,从而保障API稳定性、构建确定性和工具链可预测性。理解这一机制,是掌握Go包设计、避免跨包引用错误、规范internal目录使用及编写可维护A

weixin_30367873的博客 784

go 学习笔记之internel作用及用法

go的学习笔记

zw的博客 1364

Golang项目工程化实践:从目录结构到配置管理的系统设计

在软件工程领域,构建可维护、可扩展的系统是每个开发者从脚本思维迈向工程思维的关键跃迁。其核心原理在于通过清晰的项目结构设计、规范的版本控制和健壮的配置管理,实现代码的高内聚、低耦合。这种工程化实践的技术价值在于大幅提升团队协作效率、保障系统长期稳定运行,并降低技术债务。尤其在微服务、云原生和AI工程化等现代应用场景中,规范的工程基础是支撑复杂业务快速迭代的前提。本文以Golang项目为例,深入探讨如何设计合理的目录结构(如cmd、internal、pkg的分层),结合Git最佳实践和Viper配置库,构建一

weixin_34302561的博客 324

Go包设计本质:编译契约、模块路径与导入逻辑

Go包不是简单的命名空间或代码组织方式,而是一套编译时契约系统,其核心在于模块声明(module)、导入路径(import path)与物理目录结构三者间的严格映射关系。理解这一机制,是掌握Go依赖管理、版本控制和API演化的基础。它决定了go build能否成功、go get能否解析、internal包是否生效,更直接影响代码的可维护性、可测试性与跨团队协作效率。本文深入剖析go.mod初始化规范、import路径的逻辑语义、GOPROXY/GOPRIVATE配置原理,并结合真实工程故障案例,揭示包结构设

weixin_30596165的博客 311

在 Go 中,用internal实现代码的封装和访问控制

在 Go 中,internal包是一种特殊的包命名约定,用于实现代码的封装和访问控制。以下是internal。

mvcqiang的专栏 517

Go包(Package)与模块(Module):项目组织之道

Go的package和module机制设计得很克制。大写小写控制可见性, internal目录限制访问范围, go.mod管理依赖, init函数处理初始化。看起来简单, 但组合起来能撑起大型项目的代码组织。循环依赖是Go开发者一定会遇到的坑, 记住用接口解耦这个套路, 能省很多重构时间。下一篇我们聊Go指针, 看看Go的指针跟C/C++有什么不同, 值类型和引用类型在传参时到底会发生什么。

白话机器学习 264

golang项目目录推荐

逛GitHub的时候发现有个4.5k对goalng项目结构的推荐的项目,这里就简单的推荐下。

小贱的博客 1688

go-internal:从标准库中剔除选定的Go-internal软件包

该存储库排除了Go标准库中对内部软件包和功能的选择。 当前,这主要由Go工具实现中的软件包和测试代码组成。 包括以下内容: dirhash:与Go工具一样,计算目录树上的哈希值。 goproxytest:专为测试使用而设计的GOPROXY实现。 gotooltest:在测试脚本中使用Go工具(请参见下面的testscript) 导入:已知体系结构和操作系统的列表,并支持读取导入语句。 modfile:读取和写入go.mod文件,同时保留格式和注释。 module:模块路径和版本。 标准杆:并行工作。 semver:语义版本解析。 testenv:有关当前测试环境的信息。 testscript:基于txtar文件的基于脚本的测试 txtar:用于测试的简单的基于文本的文件存档。

PostgreSQL隐式类型转换全解析:告别operator does not exist

强类型数据库是现代数据系统的基石,它在带来严谨性的同时,也常常让开发者在类型不匹配报错前束手无策。当一条SQL因bigint与text比较而抛出operator does not exist时,根源往往在于对数据库隐式转换规则的误解。PostgreSQL通过pg_cast系统表将转换划分为隐式、赋值与显式三个级别,并依据操作符解析逻辑决定是否自动提升类型。理解这些机制,不仅能快速定位JOIN、UNION、函数调用等场景下的类型错误,还能帮助开发者合理使用EXPLAIN VERBOSE、pg_typeof等工

weixin_29587015的博客 305

Go语言项目结构设计与最佳实践指南

Go语言的包管理机制是其核心特性之一,通过package声明实现模块化编程。与Java等传统OOP语言不同,Go采用独特的可见性控制机制,internal包实现编译时强制封装。在工程实践中,合理的项目结构能显著提升代码可维护性,标准布局通常包含cmd、internal、pkg等关键目录。其中cmd存放可执行程序入口,internal实现内部逻辑封装,pkg提供公共库功能。这种结构特别适合微服务架构和云原生应用开发,配合Go Modules依赖管理工具,可以构建高内聚低耦合的系统。本文基于多年Go项目实战经验

weixin_33834137的博客 403

告别BAPI!深入SAP S/4HANA BP框架:cl_md_bp_maintain维护客户主数据的正确姿势与性能优化

本文深入解析SAP S/4HANA中cl_md_bp_maintain框架的高效实践与架构设计,对比传统BAPI方式,展示其在业务伙伴(BP)主数据维护中的性能优势与现代化特性。通过详细代码示例和性能测试数据,揭示如何利用该框架实现批量处理、集中校验及智能错误恢复,助力企业从ECC向S/4HANA平滑迁移。

weixin_30596735的博客 361

Go:代码组织与包管理最佳实践,Golang程序员最大的悲哀是什么

Go语言,自从2009年推出以来,以其简洁的语法、强大的标准库以及出色的并发支持特性,在软件开发界迅速获得了广泛的应用。良好的代码组织可以大大提高项目的可维护性和可扩展性。本文旨在探讨Go语言在项目开发中的代码组织最佳实践,包括分包原则、命名约定以及包层次结构的建议。

989

区块链技术在碳足迹数据存证与溯源中的应用深度解析

消费者扫描产品上的二维码,即可通过区块链浏览器查询到该产品的数字碳标签,并追溯其从茶园到货架的每一步碳足迹数据,以及这些数据是如何被智能合约自动计算和认证的,从而建立起强大的品牌信任。如果说哈希链解决了数据的“存”与“证”的问题,那么智能合约则解决了数据“用”与“管”的自动化问题。综上所述,虽然针对“碳足迹数据可追溯性”这一特定应用场景的公开、标准化的性能基准案例尚不丰富,但现有研究和企业级解决方案(特别是联盟链)已经证明,通过合理的技术选型和架构设计,区块链的性能可以满足实际商业需求。

百态·数智思维 | 聚焦大数据、量化与未来AI 1107

【AI实战】用Coze工作流打造抖音视频文案提取神器——从单链接到批量处理的进阶指南

本文详细介绍了如何利用Coze工作流打造抖音视频文案提取工具,从单链接处理到批量提取的进阶指南。通过AI技术和工作流的结合,用户可以高效提取抖音视频的ASR和OCR文本,大幅提升内容创作效率。文章还涵盖了性能优化、异常处理及实际应用场景扩展,助力开发者快速实现抖音文案自动化提取。

weixin_29210759的博客 281

Go语言的项目结构:从单体到微服务

良好的项目结构是Go语言应用开发的基础,它不仅影响代码的可维护性和可读性,还关系到团队协作和项目的长期发展。本文介绍了Go语言项目结构的设计原则和最佳实践,从基础的单体应用结构到复杂的微服务架构,帮助你掌握如何设计和组织Go语言项目。基础项目结构:最小项目结构和简单应用结构标准项目结构:推荐的项目结构和目录说明模块化项目结构:按功能模块划分和按层次划分微服务项目结构:多服务结构和共享库结构依赖管理:使用Go Modules管理依赖配置管理:配置文件结构和配置加载代码组织最佳实践。

好代码自己会说话,烂代码才需要注释来圆谎 4007

RK3568 linux-5.10 rk809 声卡实现spk hp自动切换

RK3568 linux-5.10 rk809 声卡实现spk hp自动切换

目前从事linux驱动开发,多交流多学习吧 1096

Go-目录结构及源文件

目录结构三个目录中我们需要重点关注的是,其他两个目录了解即可。

Yesterday_Tomorrow的博客 1597

RK3588开发笔记-ES8311音频芯片调试记录

本篇博客主要记录如何在RK3588平台试ES8311音频芯片的过程。这包括硬件连接、内核配置、驱动程序调试和测试步骤。通过以上步骤,我们成功在RK3588平台上调试了ES8311音频芯片。这包括硬件连接、内核配置、设备树配置、驱动加载以及音频测试。希望这篇调试记录能为其他开发者提供一些帮助。如果你有任何问题或建议,欢迎留言讨上调论。

flypig has a dream! 3164

【全网首发】2026华为OD双机位C卷 机考真题题库含考点说明以及在线OJ (Java)

如果你收到的是双机位C卷考试通知,需要针对性地调整备考策略。自2025年11月19日起,华为OD机试已正式从双机位A卷切换至。复杂度明显提升,需要组合多个算法点。题面相对简单,直接考查编程基本功。考查问题分析、算法选择和优化能力。通常为1-2个核心算法点的应用。

算法大师! 167

Go语言必知必会100问题-12 如何设计项目结构

Go语言维护者对构建Go项目结构没有严格的约定,在github上有一个称为标准Go项目结构的模板(https://github.com/golang-standards/project-layout)),注意该模板不是Go官方提供的。我们还要注意一些特殊情况,例如,当我们对一个结构体对象调用 encoding/json 标准库对其进行序列化或反序列化时,该结构体对象的字段需要是可导出的(即首字母要大写),否则会忽略该字段。为了帮助用户理解Go项目,我们应该根据它提供的内容命名包,而不是它包含的内容。

数据小冰的博客 1005

ultralytics.data.utils——utils.py子模块代码详读

ultralytics.data.utils——utils.py子模块代码详读

Together_CZ的博客 1721

[7天实战入门Go语言后端] Day 3:项目结构与配置——目录组织、环境变量与 viper

(实战):项目结构、cmd、internal、config、环境变量、os.Getenv、.env、godotenv、、配置结构体、配置注入cmd/internal/config/.env:如需在本地跑通本文示例,请克隆仓库,本文示例在目录,克隆后在项目根目录执行下文中的命令即可。

消极的人永远是对的,积极的人选择勇往直前 844

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

2024年Go最全Go:代码组织与包管理最佳实践,不可思议

Go语言,自从2009年推出以来,以其简洁的语法、强大的标准库以及出色的并发支持特性,在软件开发界迅速获得了广泛的应用。良好的代码组织可以大大提高项目的可维护性和可扩展性。本文旨在探讨Go语言在项目开发中的代码组织最佳实践,包括分包原则、命名约定以及包层次结构的建议。

2401_84905039的博客 671

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

上一篇: MySQL中的索引之分类,原理,作用,优缺点和执行计划
下一篇: React16源码: Why16, 研究源码的意义, 源码目录核心结构分析
Wang's Blog
博客等级 码龄12年 7433粉丝 2421原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值