包含标签 golang 中的文章

太久没写, 都忘记了 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 :=……

阅读全文

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 对象中的结构体中,……

阅读全文

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接口呢?比如 ) 提问, 以上这些括号都是……

阅读全文

如果 golang map 值不能修改怎么办?

值对象与指针对象 假设有一个 map 对象 map[string]Person , 其中 Person 定义如下。 是一个 struct 1 2 3 type Person struct { Age int } 现在有一个需求, map 中的 Person 对象年龄为 0 , 则将其默认值设置为 18。 很显然, 由于 map[string]Person 中保存的是 值对象 ,因此通过任意方式获取的都是 值对象的副本 , 所有修改都是在副本上, 不能 修改真实值。 如果是 map[string]*Person 就很方便了。 *Person 是 指针……

阅读全文

一篇文章告诉你 golang 环境变量的所有基础操作

一篇文章告诉你 golang 环境变量的所有基础操作 原文链接: https://tangx.in/posts/2021/09/06/golang-os-env-operation/ golang 中的环境变量操作都在 os 包下面, 只有很少的几个方法, 而且字面意思也很明确。 所有环境变量操作对象都是 字符串string , 因此对于 int, bool 类型需要自己实现转换。 golang 程序执行的时候, 是在 linux 系统中 fork 的一种子进程中 golang程序 在 复制了开……

阅读全文

一道 golang 切片面试题

一道 golang 切片面试题 为什么 sl[:5] 会返回底层数组的数据呢? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 package main import "fmt" func main() { sl := make([]int, 0, 10) appendFn := func(s []int) { // 值传递, s 并不是 sl。 // 但数组是引用类型, 所以可以修改底层数组 fmt.Println("s ptr(old):", s) // [] s = append(s, 10, 20, 30) fmt.Println("s ptr(new):", s) // [10,20,30] } fmt.Println(sl) // [] appendFn(sl) fmt.Println(sl) // [] // 这里有点坑, 并不是取的 sl ,而是底……

阅读全文

golang 下划线完成对象的接口类型检查

golang 下划线完成对象的接口类型检查 在 Gin 源码中 有一行代码如下 1 var _ IRouter = &RouterGroup{} 乍一看, 是一个 赋值 操作, 但是前面又使用了 空白描述符(下划线) 。 这是什么意思呢? 答案是: 接口类型检查 在 《Effective GO》 Interface Check 中的描述有相关描述。 全文如下。 One place this situation arises is when it is necessary to guarantee within the package implementing the type that it actually satisfies the interface. If a type-for……

阅读全文

golang 中的时间处理

golang 中的时间处理 在 golang 中有一个很重要的 格式化时间的字符串 2006-01-02T15:04:05Z07:00 , 这个也是 golang 默认时间模版模版中的 time.RFC3339 1 RFC3339 = "2006-01-02T15:04:05Z07:00" golang 中关于时间的处理, 用到了上面的 每一个 数字和字母。 需要特别注意的是, 时区用的是 7 而非 6 , 因为 6 已经在 年(2006) 中出现了 创建时间对象 time.Time 1 2 3 4 5 6 7 8 9 10 // 1. 创建当前时间对象 now := time.Now() //……

阅读全文

福利派送

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

  • 又拍云免费 CDN

最近文章

分类

标签

其它