golang中级进阶(二):结构体

golang中级进阶(二):结构体,第1张

目录

一、结构体详解

1 结构体定义

2 实例化结构体的7种方法

二、结构体方法

1 结构体的方法定义

2 结构体内自定义方法的引用

3 任意类型添加方法

三、嵌套、继承

1 匿名结构体

2 结构体中可以定义任意类型的字段

3 结构体嵌套结构体

4 结构体嵌套匿名结构体

5 结构体嵌套多个匿名结构体

6 结构体继承

四、结构体和JSON相互转换

1 结构体转化成json

2 json转化成结构体

3 结构体标签 tag

4 嵌套结构体和json的序列化反序列化

Golang 中没有“类”的概念,Golang 中的结构体和其他语言中的类有点相似。和其他面向对 象语言中的类相比,Golang 中的结构体具有更高的扩展性和灵活性。

Golang 中的基础数据类型可以表示一些事物的基本属性,但是当我们想表达一个事物的全 部或部分属性时,这时候再用单一的基本数据类型就无法满足需求了,Golang 提供了一种 自定义数据类型,可以封装多个基本数据类型,这种数据类型叫结构体,英文名称 struct。 也就是我们可以通过 struct 来定义自己的类型了。

使用 type 和 struct 关键字来定义结构体,具体代码格式如下:

type 类型名 struct {

字段名 字段类型

字段名 字段类型 …

}

其中:

• 类型名:表示自定义结构体的名称,在同一个包内不能重复。

• 字段名:表示结构体字段名。结构体中的字段名必须唯一。

• 字段类型:表示结构体字段的具体类型。

在 go 语言中,没有类的概念但是可以给类型(结构体,自定义类型)定义方法。所谓方法 就是定义了接收者的函数。接收者的概念就类似于其他语言中的 this 或者 self。

方法的定义格式如下:

func (接收者变量 接收者类型) 方法名(参数列表) (返回参数) {

函数体

}

注意:想改变结构体内的值,必须先变成指针。

在 Go 语言中,接收者的类型可以是任何类型,不仅仅是结构体,任何类型都可以拥有方法。 举个例子,我们基于内置的 int 类型使用 type 关键字可以定义新的自定义类型,然后为我们 的自定义类型添加方法。

注意:匿名结构体中不允许出现多个重复的类型

注意:如果结构体里面有私有属性也就是小写定义的字段,则不会被json使用

@Tags : 分类信息

例如:

@Summary : *** 作的简短摘要。

例如:

@Description : *** 作的详细说明。

例如:

@Param :参数信息,用空格分隔的参数。param name,param type,data type,is mandatory,comment attribute(optional)

1参数名

2参数类型,可以有的值是 formData、query、path、body、header,formData 表示是 post 请求的数据,query 表示带在 url 之后的参数,path 表示请求路径上得参数,例如上面例子里面的 key,body 表示是一个 raw 数据请求,header 表示带在 header 信息中得参数。

3参数类型

4是否必须

5注释

例如:

有很多教程是关于Go的sqlDB类型和如何使用它来执行SQL数据库查询的。但大多数内容都没有讲述 SetMaxOpenConns() , SetMaxIdleConns() 和 SetConnMaxLifetime()方法, 您可以使用它们来配置sqlDB的行为并改变其性能。

转自:>

使用文件名作为输入

另一个常见错误是将文件名传递给函数。

假设我们必须实现一个函数来计算文件中的空行数。最自然的实现是这样的:

filename 作为输入给出,所以我们打开它然后我们实现我们的逻辑,对吧?

现在,假设我们希望在此函数之上实现 单元测试 ,以使用普通文件,空文件,具有不同编码类型的文件等进行测试。很容易变得非常难以管理。

此外,如果我们想要实现相同的逻辑但是对于>

大家经常用"=="来比较两个变量是否相等。但是golang中的"=="有很多细节的地方,跟php是不一样的。很多时候不能直接用"=="来比较,编译器会直接报错。

golang中基本类型的比较规则和复合类型的不一致,先介绍下golang的变量类型:

golang中的基本类型

比较的两个变量类型必须相等。而且,golang没有隐式类型转换,比较的两个变量必须类型完全一样,类型别名也不行。如果要比较,先做类型转换再比较。

复合类型是逐个字段,逐个元素比较的。需要注意的是, array 或者struct中每个元素必须要是可比较的,如果某个array的元素 or struct的成员不能比较(比如是后面介绍的slice,map等),则此复合类型也不能比较。

逐个成员比较类型和值。每个对应成员的比较遵循基本类型变量的比较规则。

但是如果struct中有不可比较的成员类型时:

可以看到,struct中有slice这种不可比较的成员时,整个struct都不能做比较,即使没有对slice那个成员赋值(slice默认值为nil)

slice和map的比较规则比较奇怪,我们先说普通的变量引用类型&val和channel的比较规则。

引用类型变量存储的是某个变量的内存地址。所以引用类型变量的比较,判断的是这两个引用类型存储的是不是同一个变量。

上面看起来比较废话,但是得理解引用类型的含义。不然对判断规则还是不清楚。

slice类型不可比较,只能与零值nil做比较。

关于slice类型不可比较的原因,后面会专门写文章做讨论。

map类型和slice一样,不能比较,只能与nil做比较。

接口类型的变量,包含该接口变量存储的值和值的类型两部分组成,分别称为接口的动态类型和动态值。 只有动态类型和动态值都相同时,两个接口变量才相同:

而且接口的动态类型必须要是可比较的,如果不能比较(比如slice,map),则运行时会报panic。因为编译器在编译时无法获取接口的动态类型,所以编译能通过,但是运行时直接panic:

golang的func作为一等公民,也是一种类型,而且不可比较

上面说过,map和slice是不可比较类型,但是有没有特殊的方法来对slice和map做比较呢,有

reflectDeepEqual函数可以用来比较两个任意类型的变量

对map类型做比较:

对slice类型做比较:

对struct类型做比较:

可以发现,只要变量的类型和值相同的话,reflectDeepEqual比较的结果就为true

直接看用例:

结果为:

1, golang的类型再定义和类型别名

2,golang的slice和map为什么不可以比较

1, >

golang 中 map 的 key 必须是可比较的,再简单点是可以使用 == 运算符进行比较。

很显然 slice,map,function 不可以,

所以 数字、string、bool、array、channel、指针可以,以及 包含前面类型的 struct

leetcode 49 题 所以恰好要取一个 string 的 hash 值,题解中大神云集,各种质数相乘,字符排序后作为 key 的,更有甚者将数组作为 key,我觉得很巧妙都很巧妙。

expvar 包是 Golang 官方提供的公共变量包,它可以辅助调试全局变量。支持一些常见的类型: float64 、 int64 、 Map 、 String 。如果我们的程序要用到上面提的四种类型(其中,Map 类型要求 Key 是字符串)。可以考虑使用这个包。

这些基础的功能就不多说了,大家可以直接看官方的 文档 。

看源码的时候发现一个非常有意思的调试接口, /debug/vars 会把所有注册的变量打印到接口里面。这个接口很有情怀。

感觉这个包还是针对简单变量,比如整形、字符串这种比较好用。

看到就写了,并没有什么沉淀,写得挺乱的。这个包很简单,但是里面还是有些可以借鉴的编码和设计。新版本的 Golang 已经能解析整形为 Key 的哈希表了,这个包啥时候能跟上支持一下?

以上就是关于golang中级进阶(二):结构体全部的内容,包括:golang中级进阶(二):结构体、golang的swagger注解、golang配制高性能sql.DB等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9803493.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-02
下一篇2023-05-02

发表评论

登录后才能评论

评论列表(0条)

    保存