Go语言开发小技巧&易错点100例(三)

简介: Go语言开发小技巧&易错点100例(三)

这么快就第三期了,算下来这期包括前几期我的《Go语言开发小技巧&易错点100例》已经凑够了15个!任务完成率15%!继续加油!

往期回顾

本期看点(技巧类用【技】表示,易错点用【易】表示)

(1)Go omitempty关键字【技】

(2)Go 进行JSON Marshal序列化时需要注意的问题【易】

(3)Go iota关键字【技】

下面是正文

1 Go omitempty关键字【技】

大家在将Go语言里面的结构体类型转化为JSON数据类型时有没有过这样的需求:

当结构体有多个字段时,仅赋值部分字段,让其余字段都为空,并且在JSON Marshal时不序列化为空的字段

代码表示:

type Student struct {
   Id   int    `json:"id"`
   Name string `json:"name"`
   Age  int    `json:"age"`
}
func main() {
   // 只赋值Id、Name,不赋值Age属性
   stu := Student{
      Id:   1,
      Name: "zs",
   }
   bytes, _ := json.Marshal(stu)
   fmt.Println(string(bytes))
}
复制代码

运行结果:

{"id":1,"name":"zs","age":0}
复制代码

但是我们想要的结果是

{"id":1,"name":"zs"}
复制代码

这个时候,就使用需要使用到这个关键字:omitempty,该关键字作用:

  • 基本类型的默认值会被缺省(omit),除了具有默认长度的数组。
  • 指针类型为 nil 时会被缺省(omit)。

接下来我们就来实验下:

type Student struct {
   Id      int       `json:"id,omitempty"`
   Name    string    `json:"name,omitempty"`
   Age     int       `json:"age,omitempty"`
   Address *string   `json:"address,omitempty"`
   Like    []string  `json:"list,omitempty"`
   Love    [1]string `json:"love,omitempty"`
}
func main() {
   // 只赋值Id、Name,不赋值Age属性
   stu := Student{
      Id:   1,
      Name: "zs",
   }
   bytes, _ := json.Marshal(stu)
   fmt.Println(string(bytes))
}
复制代码

输出的结果:

{"id":1,"name":"zs","love":[""]}
复制代码

2 Go JSON Marshal需要注意的问题【易】

Go语言有一个约定,就是首字母大写的属性或函数才能够外部可见,外部指的是包外部,除此之外在JSON Marshal中也需要用到类似的约定:只有结构体的属性属于外部可见时才能够进行JSON序列化。

直接上代码:

type Object struct {
   name   string `json:"name"`
   method string `json:"method"`
}
func main() {
   obj := Object{
      name: "zs",
      method: "play",
   }
   bytes, _ := json.Marshal(obj)
   fmt.Println(string(bytes))
}
复制代码

打印结果:

{}
复制代码

解决方式就是将结构体的属性名改成大写,之后就可以了:

type Object struct {
  Name   string `json:"name"`
  Method string `json:"method"`
}
复制代码

3 Go iota关键字【技】

概念:iota是go语言的常量计数器,只能在常量的表达式中使用,多用于代替枚举类型。

注意点:

(1)iota在const关键字中定义,默认为0,并且以同一个const中多个iota只能默认为0一次。

(2)const中每新增一行常量声明将使iota按规则计数一次。

使用方式:

const (
   i1 = iota
   i2
   _ //丢弃该值
   i4
)
const (
   n1 = iota * 10
   n2
   n3
)
func main() {
   fmt.Println(i1)
   fmt.Println(i2)
   fmt.Println(i4)
   fmt.Println(n1)
   fmt.Println(n2)
   fmt.Println(n3)
}
复制代码

我们看看time包源码中对iota关键字的使用:

......
// A Month specifies a month of the year (January = 1, ...).
type Month int
const (
   January Month = 1 + iota
   February
   March
   April
   May
   June
   July
   August
   September
   October
   November
   December
)
......
复制代码

如果同一个const中定义了多个iota会怎样:

const (
   i1 = iota
   i2
   n1 = iota * 10
   n2
   n3
)
func main() {
   fmt.Println(i1)
   fmt.Println(i2)
   fmt.Println(n1)
   fmt.Println(n2)
   fmt.Println(n3)
}
复制代码

打印结果:

0
1
20
30
40
复制代码

好嘞,今天的分享就先到这里,欢迎大家关注我,会持续更新~


相关文章
|
7天前
|
存储 监控 算法
员工上网行为监控中的Go语言算法:布隆过滤器的应用
在信息化高速发展的时代,企业上网行为监管至关重要。布隆过滤器作为一种高效、节省空间的概率性数据结构,适用于大规模URL查询与匹配,是实现精准上网行为管理的理想选择。本文探讨了布隆过滤器的原理及其优缺点,并展示了如何使用Go语言实现该算法,以提升企业网络管理效率和安全性。尽管存在误报等局限性,但合理配置下,布隆过滤器为企业提供了经济有效的解决方案。
38 8
员工上网行为监控中的Go语言算法:布隆过滤器的应用
|
27天前
|
Go 开发工具
百炼-千问模型通过openai接口构建assistant 等 go语言
由于阿里百炼平台通义千问大模型没有完善的go语言兼容openapi示例,并且官方答复assistant是不兼容openapi sdk的。 实际使用中发现是能够支持的,所以自己写了一个demo test示例,给大家做一个参考。
|
27天前
|
程序员 Go
go语言中结构体(Struct)
go语言中结构体(Struct)
99 71
|
26天前
|
存储 Go 索引
go语言中的数组(Array)
go语言中的数组(Array)
104 67
|
2天前
|
算法 安全 Go
Go 语言中实现 RSA 加解密、签名验证算法
随着互联网的发展,安全需求日益增长。非对称加密算法RSA成为密码学中的重要代表。本文介绍如何使用Go语言和[forgoer/openssl](https://github.com/forgoer/openssl)库简化RSA加解密操作,包括秘钥生成、加解密及签名验证。该库还支持AES、DES等常用算法,安装简便,代码示例清晰易懂。
27 16
|
5天前
|
监控 算法 安全
解锁企业计算机监控的关键:基于 Go 语言的精准洞察算法
企业计算机监控在数字化浪潮下至关重要,旨在保障信息资产安全与高效运营。利用Go语言的并发编程和系统交互能力,通过进程监控、网络行为分析及应用程序使用记录等手段,实时掌握计算机运行状态。具体实现包括获取进程信息、解析网络数据包、记录应用使用时长等,确保企业信息安全合规,提升工作效率。本文转载自:[VIPShare](https://www.vipshare.com)。
15 0
|
19天前
|
Go 数据安全/隐私保护 UED
优化Go语言中的网络连接:设置代理超时参数
优化Go语言中的网络连接:设置代理超时参数
|
27天前
|
存储 Go 索引
go语言中数组和切片
go语言中数组和切片
37 7
|
29天前
|
Go 索引
go语言for遍历数组或切片
go语言for遍历数组或切片
98 62
|
27天前
|
存储 Go
go语言中映射
go语言中映射
36 11