知识点积累系列(一)golang语言篇【持续更新】

news2024/11/17 15:58:34

云原生学习路线导航页(持续更新中)

本文是 知识点积累 系列文章的第一篇,记录golang语言相关的知识点

1.结构体的mapstructure是什么

  • mapstructure:"default"
    • mapstructure是一个Go语言的库,用于将一个map中的值映射到一个结构体对象。
    • 在下面的例子中,如果在映射过程中,map中没有包含"name"或"age"键,那么Person结构体中的NameAge字段会被设置为其类型的零值(例如""0)。而对于"gender"字段,如果map中没有"gender"键或者该键的值为空,那么Gender字段会被赋予"default"标签指定的默认值,即"unknown"。
    type Person struct {
        Name   string `mapstructure:"name"`
        Age    int    `mapstructure:"age"`
        Gender string `mapstructure:"gender" default:"unknown"`
    }
    

2.json key的命名规范

  • model结构体,我们一般都会指定它的json key,应该遵循哪些规范呢?
    • 属性名应该是具有定义语义的有意义的名称。
    • 属性名必须是 驼峰式(首字母小写,后面单词首字母大写) 的,ASCII码字符串。
    • 首字符必须是字母,下划线( _ )或美元符号( $ )。
    • 随后的其他字符可以是字母,数字,下划线( _ )或美元符号( $ )。
    • 应该避免使用Javascript中的保留关键字(下文附有Javascript保留字清单)
  • 参考:https://github.com/darcyliu/google-styleguide/blob/master/JSONStyleGuide.md
    • Google Style Guides 项目是Google公司发布的一系列编程规范指南,覆盖了诸如C++、Java、Python、JavaScript等多种编程语言的最佳实践、命名约定、代码格式等方面的建议,旨在帮助开发人员编写一致、易读、易维护的代码,促进团队协作和代码质量的提高。
    • google官方开源的github:https://github.com/google/styleguide ,官方文档:https://google.github.io/styleguide/
    • 国内共建的中文版github(还不全):https://github.com/zh-google-styleguide/zh-google-styleguide

3.不同版本的UUID

  • 我们在go中,可以使用 github.com/satori/go.uuid 工具,使用uuid
  • 其中,不同版本的uuid有什么区别?
    • Version 1:
      • 版本 1 UUID 基于时间戳和节点的 MAC 地址。它包括当前时间和节点的 MAC 地址,以确保全球唯一性。
      • 实现原理:使用当前时间作为 UUID 的前 64 位,然后将节点的 MAC 地址的散列(通常是 MD5 散列)作为后 64 位。
    • Version 2:
      • 版本 2 UUID 是为 DCE 安全需求设计的,包括 POSIX UID/GID 和 POSIX 分布式计算环境(DCE)的组标识符。
      • 实现原理:不常用,并且对于一般用途来说并不适用,因此我不建议使用。
    • Version 3:
      • 版本 3 UUID 基于命名空间和名称的散列值。它使用给定的命名空间和名称作为输入,生成相应的 UUID。
      • 实现原理:使用给定的命名空间和名称计算散列值(通常是 MD5 散列),然后根据特定的规则将散列值转换为 UUID。
    • Version 4:
      • 版本 4 UUID 是随机生成的 UUID,使用随机性作为生成标识符的方法。它具有非常低的碰撞概率。
      • 实现原理:通过使用随机数生成器生成128位的随机数,并根据 UUID 标准进行必要的设置,例如将版本字段设置为 4。
    • Version 5:
      • 版本 5 UUID 类似于版本 3 UUID,但使用 SHA-1 散列替代了 MD5。
      • 实现原理:使用给定的命名空间和名称计算 SHA-1 散列值,然后将散列值转换为 UUID。

4.go的sql.NullInt64是什么类型

  • sql.NullInt64 是 database/sql 包提供的一种类型,是一个结构体,包含两个字段
    • Int64:表示整数值的字段,类型为 int64
    • Valid:表示整数值是否有效的布尔字段,类型为 bool
  • sql.NullInt64 可以在处理数据库查询结果时,同时获取到整数值以及该值是否为 NULL 的信息
  • 使用示例
    package main
    
    import (
            "database/sql"
            "fmt"
    )
    
    func main() {
            // 模拟从数据库中查询到的结果
            result := sql.NullInt64{
                    Int64:  123, // 整数值
                    Valid: true, // 值有效
            }
    
            // 检查整数值是否有效
            if result.Valid {
                    // 使用 Int64 字段获取整数值
                    fmt.Println("Value:", result.Int64)
            } else {
                    fmt.Println("Value is NULL")
            }
    }
    

5.recover中间件是什么

  • 在 Go 语言中,“recovery” 通常指的是在程序发生 panic(宕机)时进行恢复的机制。在处理 panic 的过程中,日志记录是非常重要的,因为它可以帮助我们了解程序在出现问题时的上下文信息,从而更好地排查和解决 bug。

  • 在 Go 中,你可以使用内置的 defer 和 recover 来捕获 panic,并记录相应的日志信息。一般来说,我们会在程序的入口处或者一些关键的处理函数中设置一个 defer 函数,用来捕获 panic,并记录日志。

  • 下面是一个简单的示例代码,演示了如何在发生 panic 时进行日志记录和恢复:

    package main
    
    import (
            "log"
    )
    
    func main() {
            defer func() {
                    if r := recover(); r != nil {
                            log.Printf("Recovered from panic: %v", r)
                            // 在这里可以记录日志或者做一些其他的处理
                    }
            }()
    
            // 模拟发生 panic
            panic("oops, something went wrong!")
    }
    
  • 此外,一些框架和库也提供了自带的 panic 恢复和日志记录机制,比如 go-zero 框架就提供了对 panic 的恢复和日志记录支持

6.golang.org/x/…目录是什么,和golang标准库的区别?

  • golang承诺除极少数情况,API是可以向前兼容(forward-compatible)的。这是非常大的承诺了,所以golang标准库的代码,要求非常高,不能随便加入
  • x包下的代码,具有实验性质,对兼容性的要求没有那么高,一般会向前兼容两个版本,也由官方维护,并且一般不会引用第三方依赖(除 golang.org/x/tools/gopls, golang.org/x/vscode-go, and golang.org/x/pkgsite.之外)
  • golang官方也给出了解释
    • https://github.com/golang/go/wiki/X-Repositories

7.go的plugin是什么

  • Go语言自1.8版本开始引入了对插件(Plugin)的支持。

    • 如果不在程序中明确指定,插件是不会被加载的。
    • 通过插件,允许程序在运行时动态加载已经编译好的插件模块。因此,如果我们更新了已有的某个插件,想要不停机的情况下直接更新上去,就更换编译后的可执行文件就可以
    • 在Go语言中,使用插件的主要步骤包括:
      • 创建一个插件模块(被编译为 .so文件):编写一个独立的Go程序,使用plugin包提供的API进行构建。这个程序需要实现 导出函数,以便主程序可以调用这些函数。
      • 主程序加载插件:主程序通过plugin包中的 plugin.Open("./plugin_doctor.so") 函数加载插件模块,并使用插件模块中导出的函数进行交互。
  • 学习博客可参考:https://cloud.tencent.com/developer/article/1914954

8.go的包导入相关知识点

在这里插入图片描述

https://www.cnblogs.com/wongbingming/p/12950888.html

9.go结构体字段后面的 json:",inline" 什么意思

  • json:“,inline” 用于 Go 语言中结构体字段的一个标记,用于表示将该字段的所有子字段展开到当前结构体中
  • 使用场景:有时候希望将嵌套结构体的字段,直接展开到当前结构体中,而不是创建一个嵌套的对象。这时就可以使用 json:“,inline” 标记。
  • 这样,在 JSON 序列化和反序列化时,被标记的字段及其子字段就会被展开到当前结构体中,并与其它字段平级地处理。
  • 举例:
    • Person 结构体嵌套了 Address 结构体,并使用了 json:",inline" 标记
      type Address struct {
          City  string `json:"city"`
          State string `json:"state"`
      }
      
      type Person struct {
          Name    string  `json:"name"`
          Age     int     `json:"age"`
          Address `json:",inline"`
      }
      
    • 那么,在将一个 Person 对象序列化为 JSON 字符串时,结果如下所示。
      {
        "name": "John Doe",
        "age": 30,
        "city": "New York",
        "state": "NY"
      }
      

10.go结构体字段后面的 json:",omitempty" 什么意思

  • omitempty 是 Go 语言中 JSON 标记的一个选项,用于指示在将结构体字段序列化为 JSON 字符串时,如果该字段的值为空(例如零值、空字符串、空数组、空切片、空映射等),则忽略该字段,不将其包含在生成的 JSON 中
  • 举例:
    type Person struct {
        Name     string `json:"name"`
        Age      int    `json:"age"`
        // Address 加了 omitempty
        Address  string `json:"address,omitempty"`
        Phone    string `json:"phone,omitempty"`
    }
    
    // 加入当前我创建了一个对象,Address为空
    person := Person{
        Name:    "Alice",
        Age:     25,
        Address: "",
        Phone:   "123-456-7890",
    }
    
    // 则序列化为json后,结果为:
    {
      "name": "Alice",
      "age": 25,
      "phone": "123-456-7890"
    }
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1423352.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

通过手写简易版RPC理解RPC原理

RPC是什么 所谓的RPC其实是为了不同主机的两个进程间通信而产生的,通常不同的主机之间的进程通信,程序编写需要考虑到网络通信的功能,这样程序的编写将会变得复杂。RPC就来解决这一问题的,一台主机上的进程对另外一台主机的进程发…

【2024程序员必看】鸿蒙应用开发行业分析

鸿蒙操作系统沉浸四年,这次终于迎来了破局的机会,自从2023年华为秋季发布会上宣布鸿蒙 Next操作系统不在兼容Android后,就有不少大厂开始陆续与华为达成了鸿蒙原生应用的开发合作,据1月18日华为官方宣布110多天的产业合力“突进”…

log4j2 无垃圾稳态日志 Garbage-free Steady State Logging

无垃圾稳态日志 垃圾收集暂停是导致延迟峰值的常见原因,对于许多系统来说,需要花费大量精力来控制这些暂停。 许多日志库,包括以前版本的Log4j,在稳态日志记录期间分配临时对象,如日志事件对象、字符串、char数组、字…

RocksDB是如何实现存算分离的

核心参考文献: Dong, S., P, S. S., Pan, S., Ananthabhotla, A., Ekambaram, D., Sharma, A., Dayal, S., Parikh, N. V., Jin, Y., Kim, A., Patil, S., Zhuang, J., Dunster, S., Mahajan, A., Chelluri, A., Datye, C., Santana, L. V., Garg, N., & Gawde,…

基于YOLOv7算法的高精度实时安全帽和背心目标检测系统(PyTorch+Pyside6+YOLOv7)

摘要:基于YOLOv7算法的高精度实时安全帽和背心目标检测系统可用于日常生活中检测与定位安全帽和安全背心,此系统可完成对输入图片、视频、文件夹以及摄像头方式的目标检测与识别,同时本系统还支持检测结果可视化与导出。本系统采用YOLOv7目标…

B样条基函数

​定义:令U{u0,u1,…,um}是一个单调不减的实数序列,即ui≤ui1,i0,1,…,m-1。其中,ui称为节点,U称为节点矢量,用Ni,p(u)表示第i个p次(p1阶)B样条基…

短视频界的变革者:上海 AI lab 发布 Vlogger,几句话生成分钟级视频

现如今,vlog 已经成为我们日常生活的重要组成部分。无论是看视频学习休闲、记录珍贵瞬间还是分享生活见闻,视频已经成为人们表达创意和观点的独特媒介。 然而,与几秒钟的短视频不同,要创作出引人入胜、生动有趣的长视频&#xff…

十分钟学会用springboot制作微信小程序富文本编辑器

1.1 富文本模型设计 在构建富文本编辑器系统时,首先需要设计一个合适的富文本模型。 CREATE TABLE IF NOT EXISTS rich_texts (id INT PRIMARY KEY AUTO_INCREMENT,title VARCHAR(255),content TEXT,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );这个表包括…

一键转换MOV至MP3:轻松删除原视频,释放存储空间!

你是否曾经有一个MOV格式的视频文件,想要提取其中的音频却苦于没有合适的工具?现在,有了我们的全新视频剪辑工具,这个烦恼全部消失!我们为你提供一键式解决方案,将MOV视频文件快速转换为MP3音频格式。 首先…

PyNest 一个可以搭建微服务的 Python 包

PyNest 在构建 Python API 和微服务方面崭露头角,解决了 FastAPI 中存在的关键问题,因此成为卓越的框架。凭借其模块化的架构和先进的特性,PyNest 在 2024 年及以后有望成为 Python 开发者的首选选择。 随着 Python 生态系统的不断成熟&…

YAYI-UIE: 一个用于通用信息提取的聊天增强的指令微调框架

1、写作动机: 最近的研究提出了基于大型语言模型的方法,以统一地建模不同的信息提取任务。然而,这些现有方法在处理英语以外的中文语言的信息提取能力方面存在不足。 2、主要贡献: 提出了YAYI-UIE,一个端到端的聊天…

Prometheus+grafana配置监控系统

使用docker compose安装 方便拓展, 配置信息都放在在 /docker/prometheus 目录下 1.目录结构如下 . ├── conf │ └── prometheus.yml ├── grafana_data ├── prometheus_data └── prometheus_grafana.yaml2.创建目录文件 mkdir /docker/prometheus &&am…

Java面试题之 IO(四)

Java面试题之 IO(四) 文章目录 Java面试题之 IO(四)随机访问流 文章来自Java Guide 用于学习如有侵权,立即删除 随机访问流 这里要介绍的随机访问流指的是支持随意跳转到文件的任意位置进行读写的 RandomAccessFile 。…

C# Onnx yolov8 仪表指针检测

目录 效果 模型信息 项目 代码 训练数据 下载 C# Onnx yolov8 仪表指针检测 效果 模型信息 Model Properties ------------------------- date:2024-01-31T11:19:38.828556 author:Ultralytics task:detect license:AGPL-…

C++ 哈希 开放定址法

哈希算法 哈希,是一种算法思想吗,它的核心是映射,哈希方法中使用的转换函数称为哈希(散列)函数,构造出来的结构称为哈希表(Hash Table)(或者称散列表) 在STL 中,提供了两个使用哈希底层实现的容器 unordered_set 和 …

西瓜书读书笔记整理(十二) —— 第十二章 计算学习理论(下)

第十二章 计算学习理论(下) 12.4 VC 维(Vapnik-Chervonenkis dimension)12.4.1 什么是 VC 维12.4.2 增长函数(growth function)、对分(dichotomy)和打散(shattering&…

Python算法题集_合并区间

本文为Python算法题集之一的代码示例 题目56:合并区间 说明:以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需…

CANoe实际项目中文件夹的规划

本人,之前设计了一个CANoe工程,由于工程设计之初没有设计好文档的归纳分类,导致文件查找起来非常费劲。 为了避免以后出现文件混乱,不可查找的问题,故特此归纳说明。 建立工程时: 第1步就应该设计好文档…

品牌定位传播之道:公关、广告与定位原则的结合

​在当今商业环境中,品牌传播的重要性日益凸显。一个成功的品牌传播策略不仅能提升品牌知名度和美誉度,还能在消费者心智中建立稳固的地位。本文将深入探讨公关、广告和定位原则在品牌传播中的作用,以及迅腾文化如何助力品牌传播价值。 一、…

miniReact<一>

一、工程化配置 1.1 目录结构 1.1.1 Multi-repo VS Mono-repo Multi-repo 每个库有自己独立的仓库,逻辑清晰,协同管理复杂 Mono-repo 很方便管理不同独立的库的生命周期,会有更高的操作复杂度 项目有很多包,同时管理多个不同的…