当前位置: 首页 > 编程笔记 >

golang中struct和interface的基础使用教程

空俊语
2023-03-14
本文向大家介绍golang中struct和interface的基础使用教程,包括了golang中struct和interface的基础使用教程的使用技巧和注意事项,需要的朋友参考一下

前言

本文主要给大家介绍了关于golang中struct和interface的相关内容,是属于golang的基本知识,下面话不多说了,来一起看看详细的介绍吧。

struct

struct 用来自定义复杂数据结构,可以包含多个字段(属性),可以嵌套;go中的struct类型理解为类,可以定义方法,和函数定义有些许区别;struct类型是值类型。

struct定义

type User struct {
 Name string
 Age int32
 mess string
}
var user User
var user1 *User = &User{}
var user2 *User = new(User)

struct的方法

在go语言中,我们可以为自定义类型定义类型相关的方法,比如:

func (p *player) Name() string{
 return p.name
}

上面的代码为player这个自定义类型声明了一个名为Name的方法,该方法返回一个string。值得注意的是(p *player)这段代码指定了我们是为player创建方法,并将调用该方法的实例指针当作变量p传入该函数,如果没有(p *player)这段代码,这个方法就变成了一个普通的全局函数。

struct的嵌入(Embedding)

go语言中的“继承”和其他语言中的继承有很大区别,比如:

type player struct{
 User
}

这是一种“继承”的写法,在go语言中这种方式叫做“嵌入”(embed),此时player类型就拥有了User类型的Name等变量

struct的tag

这种方式主要是用在xml,json和struct间相互转换,非常方便直观,比如接口给的参数一般是json传过来,但是内部我们要转为struct再进行处理。

例子:

import "encoding/json"
type User struct {
 Name string `json:"userName"`
 Age int `json:"userAge"`
}
func main() {
 var user User
 user.Name = "nick"
 user.Age = 18 
 conJson, _ := json.Marshal(user)
 fmt.Println(string(conJson)) //{"userName":"nick","userAge":0}
}

interface

golang不支持完整的面向对象思想,它没有继承,多态则完全依赖接口实现。golang只能模拟继承,其本质是组合,只不过golang语言为我们提供了一些语法糖使其看起来达到了继承的效果。Golang中的接口,不需要显示的实现。Interface类型可以定义一组方法,但是这些不需要实现。并且interface不能包含任何变量。只要一个变量,含有接口类型中的所有方法,那么这个变量就实现这个接口。因此,golang中没有implement类似的关键字;如果一个变量含有了一个interface类型的多个方法,那么这个变量就实现了多个接口;如果一个变量只含有了一个interface的方部分方法,那么这个变量没有实现这个接口。

interface的定义

interface类型默认是一个指针。

例子:

Interface定义

type Car interface {
 NameGet() string
 Run(n int)
 Stop()
}

空接口 Interface{}:空接口没有任何方法,所以所有类型都实现了空接口。

var a int
var b interface{} //空接口
b = a

interface的多态

一种事物的多种形态,都可以按照统一的接口进行操作。这种方式是用的最多的,有点像c++中的类继承。

例子:

type Item interface {
 Name() string
 Price() float64
}
 
type VegBurger struct {
}
 
func (r *VegBurger) Name() string{
 return "vegburger"
}
 
func (r *VegBurger) Price() float64{
 return 1.5
}
 
type ChickenBurger struct {
}
 
func (r *ChickenBurger) Name() string{
 return "chickenburger"
}
 
func (r *ChickenBurger) Price() float64{
 return 5.5
}

Interface嵌套

一个接口可以嵌套在另外的接口。即需要实现2个接口的方法。在下面的例子中Used就包含了Car这个接口的所有方法。
例子:

type Car interface {
 NameGet() string
 Run(n int)
 Stop()
}
type Used interface {
 Car
 Cheap()
}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对小牛知识库的支持。

 类似资料:
  • 问题内容: 我正在学习golang,在浏览介绍结构的章节时,我遇到了多种初始化结构的方法。 虽然这些将结构的值打印为 ,下面的代码以与号打印,因为它是参考。 如有疑问,请帮助我。 在用法中,是的引用变量,用于保存实际数据。同样,保存数据的实际变量是什么? 使用这些不同类型的初始化的最佳方案是什么? 问题答案: 为新项目分配零存储或键入任何内容,然后返回指向它的指针。我不认为这是否真的很重要,如果您

  • 本文向大家介绍golang struct 实现 interface的方法,包括了golang struct 实现 interface的方法的使用技巧和注意事项,需要的朋友参考一下 golang中,一般strcut包含 interface类型后,struct类型都需要实现 interface导出的接口,从而成为相应的 interface接口类。 实际上,struct包含interface之后,并不需

  • 本文向大家介绍在Lua中使用模块的基础教程,包括了在Lua中使用模块的基础教程的使用技巧和注意事项,需要的朋友参考一下  什么是模块? 模块是一个像,可以使用需要加载并有包含表中的单个全局命名的库。该模块可包含若干函数和变量。所有这些函数和变量被包裹在以它作为一个命名空间的表。也是一个很乖的模块有必要的规定,返回此表上所需要的。 Lua模块 表中的模块的使用可以帮助我们以多种方式,使我们能够操纵模

  • 本文向大家介绍jQuery中选择器的基础使用教程,包括了jQuery中选择器的基础使用教程的使用技巧和注意事项,需要的朋友参考一下 其实选择器就像开罐器一样,会用这个工具的人,自然吃的到甜头,但不会用这个工具的人,不管罐头里面的面筋土豆有多美味,吃不到就是吃不到,就如同jquery再怎么强大,也只能看着荧幕,而不知该如何下手,不过虽然选择器不难,也容易上手,但老实说,我用了一年多下来,还是觉得自己

  • 本文向大家介绍Bootstrap使用基础教程详解,包括了Bootstrap使用基础教程详解的使用技巧和注意事项,需要的朋友参考一下 一:Bootstrap简介   Boostrap是一个非常受欢迎的前端开发框架,该框架极大的提高前端团队的开发效率。 Bootstrap对常见的CSS布局组件和JavaScript插件进行了完整的封装,使开发人员可以轻松使用。 使用Bootstrap可以快速制作精美的

  • 问题内容: 这是示例代码: 运行结果: 看起来这些和 因此,结构的零值不是,而是所有属性均初始化为零值的结构。猜对了吗? 如果猜测是正确的,那么的自然和是一样的吧? 问题答案: 为什么要(正确地)猜测有一些文档? 当通过声明或调用new为变量分配存储空间时, 或者通过复合文字或make调用 创建新值时 ,并且未提供显式初始化时 ,将给出变量或值默认值。 此类变量或值的每个元素的类型均设置为零值 :