经过99次失败后, 我总结了几点 Golang 反射的经验(附源码)

经过99次失败后, 我总结了几点 Golang 反射的经验(附源码) golang 反射很好用, 也有很多坑。 代码在: https://github.com/tangx-labs/golang-reflect-demo Kind 和 Type 在 golang 的反射中, 有两个可以表示 类型 的关键字, Kind 和 Type 。 定义覆盖范围 Kind 的定义覆盖范围比 Type 要大。 Kind 在定义上要 更抽象, Type 要更具体。 可以简单理解为, 如果 Kind 是 车 , 那么 Type 可能是 公交车 、 消防车 内置类型字面……

阅读全文

太久没写, 都忘记了 golang slice 切片的完整表达式

太久没写, 都忘记了 golang slice 切片的完整表达式 原文链接: https://tangx.in/posts/2021/09/22/golang-slice-expressions/ 通常,我们写的 golang slice 边界只有两个数字 slice[1:3] , 这是一种简单写法。 而完整写法是 三个数字 slice[1:3:5] 简单表达式 一个冒号, 两个参数, 表示 slice 元素的 起止区间 1 a[low:high] 案例代码如下 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 package main import ( "fmt" ) func main() { a := [5]int{1, 2, 3, 4, 5} s := a[1:4] // [2,3,4] fmt.Println(s) s1 :=……

阅读全文

gitlab shell runner

快速创建 gitlab shell runner 真没想道有一天, 我居然会创建 gitlab shell runner 。 环境太难管理了 创建 gitlab shell runner 实话实说, gitlab 现在的用户体验太好了。 根本不需要到处去搜文档,直接在 runner 管理界面就可以找到, 还贴心的给你准备了全套, 一键复制粘贴搞定。 https://git.example.com/admin/runners 点击 Show Runner installation instructions 可以看到多种 runner 的配置。 在默认的基础上, 根据实际情况优化一下。 1 2……

阅读全文

golang 使用反射绑定 cobra flag 参数

golang 使用反射绑定 cobra flag 参数 cobra https://github.com/spf13/cobra 是 golang 中一个非常好用的 命令 开发库。 但是绑定 flag 参数的时候略微有点繁琐, 不但有多少个参数就需要写多少行绑定代码, 而且参数定义和描述也是分开的, 非常的不直观。 1 2 3 4 5 6 func init() { rootCmd.Flags().StringVarP(&stu.Name, "name", "", "zhangsanfeng", "student name") rootCmd.Flags().Int64VarP(&stu.Age, "age", "a", 18, "student age") // ... } 想着吧, 反正都要了解 golang reflect 反射, 不如就用 反射 实现一个绑定支……

阅读全文

go-jarvis 容器化 go 应用开发配置管理利器

go-jarvis/jarivs 为了方便 golang 容器化开发的时候管理配置。 核心功能 根据 config 结构体生成 yaml 配置文件 程序启动时, 从 yaml 配置文件和 环境变量 中对 config 赋值 执行逻辑 根据配置 config{} 生成对应的 default.yml 配置文件。 读取依次配置文件 default.yml, config.yml + 分支配置文件.yml + 环境变量 根据 GitlabCI, 分支配置文件 config.xxxx.yml 如没有 CI, 读取本地文件: local.yml 使用需求 config 对象中的结构体中,……

阅读全文

docker runner 配置编译环境的大文件依赖

docker runner 配置编译环境的大文件依赖 需求简介: 现在要做某个 arm 平台的的交叉编译环境, 交叉编译依赖和工具包大小 5G 左右, 特别大。 如果按照以往的方式, 直接将 编译依赖和工具 直接打包到编译镜像中, 会有很多麻烦。 单 layer 过大 docker 单层 layer 限制为 5G。 镜像升级迭代 浪费空间 。 如果镜像上层升级或者依赖变化, 整个 layer 不能……

阅读全文

gitlab-runner-build not found in path

"gitlab-runner-build": executable file not found in $PATH 在搭建 gitlab-runner 的过程中,报错如下 1 ERROR: Job failed (system failure): prepare environment: Error response from daemon: OCI runtime create failed: container_linux.go:370: starting container process caused: exec: "gitlab-runner-build": executable file not found in $PATH: unknown (exec.go:57:0s). Check https://docs.gitlab.com/runner/shells/index.html#shell-profile-loading for more information 因为在 environment 中 扩展了 PATH 而导致 gitlab-runner-helper 中的 PATH 出现了异常。 从而导致 gitlab-runner-build 这个脚本(命令) 无法被找到。 原因分析 在 gitlab 的定义中 environment 的行为有两种 , append(扩展) 或 overwrite(覆盖)。……

阅读全文

GET 请求也能传递 JSON Body

GET 请求也能传递 Body 数据 通常而言, GET 请求很少传递 Body 数据, 大多情况下都是放在 url 中, 例如 1 http://example.com/api?key1=value1&key2=value2 但是这样做, 可能由于 传递数据过多 导致 URL 过程而被拦截。 运营商会缓存 URL 地址以达到加速的效果, 而有些参数又不想被缓存。 等等 虽然, 可以使用 POST 请求代替 GET 请求, 在 Body 中传递数据, 但是这样做可能会破坏 RESTful 风格的 API 格……

阅读全文

golang 括号用法总结

golang 括号用法总结 1 2 3 4 5 6 7 8 var ( f unsafe.Pointer a io.ReadCloser = (*os.File)(f) // 只要是一个指针就可以 b io.Reader = a // a的方法集大于等于b,就可以做隐式的转换! c io.Closer = a // 同样 d io.Reader = c.(io.Reader) // 显式转换,c这个接口很明显方法集和io.Reader不同 // 但是万一传入c的对象拥有io.Reader接口呢?比如 ) 提问, 以上这些括号都是……

阅读全文

axios get 请求携带 body 数据

axios get 请求携带 json body 数据 在 http 标准协议中, GET 请求 本身是可以携带 Body 数据 。 至于 GET 请求携带的数据能不能被获取, 还是要看接受端 后端 是否处理。 在 gin-gonic/gin 框架中, GET 请求默认就不会处理 body 中的数据, 只能通过 query 表单数据传递。 然而不同的浏览器对于 URL 长度的限制也不同,一般是 1024 个字符, 1. 有些时候需要携带的数据可能超……

阅读全文

福利派送

  • (免费星球)「运维成长路线」

  • 又拍云免费 CDN

最近文章

分类

标签

其它