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

 更新时间:2018年03月25日 11:27:15   作者:helight  
Go不同于一般的面向对象语言,需要我们好好的学习研究,下面这篇文章主要给大家介绍了关于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()
}

总结

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

相关文章

  • go中import包的大坑解决方案

    go中import包的大坑解决方案

    最近开始使用Go/GoLand 在import 自定义包时出现各种状况,本文就介绍一下go中import包的大坑解决方案,具有一定的参考价值,感兴趣 可以了解一下
    2022-06-06
  • golang配制高性能sql.DB的使用

    golang配制高性能sql.DB的使用

    本文主要讲述SetMaxOpenConns(), SetMaxIdleConns() 和 SetConnMaxLifetime()方法, 您可以使用它们来配置sql.DB的行为并改变其性能,感兴趣的可以了解一下
    2021-12-12
  • 浅谈Golang内存逃逸

    浅谈Golang内存逃逸

    本文主要介绍了Golang内存逃逸,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • Go语言使用MongoDB数据库详细步骤

    Go语言使用MongoDB数据库详细步骤

    mongodb是一种高性能、开源、文档型的nosql数据库,被广泛应用于web应用、大数据以及云计算领域,下面这篇文章主要给大家介绍了关于Go语言使用MongoDB数据库的详细步骤,需要的朋友可以参考下
    2024-05-05
  • Go iota关键字与枚举类型实现原理

    Go iota关键字与枚举类型实现原理

    这篇文章主要介绍了Go iota关键字与枚举类型实现原理,iota是go语言的常量计数器,只能在常量的表达式中使用,更多相关内容需要的小伙伴可以参考一下
    2022-07-07
  • 利用Go语言快速实现一个极简任务调度系统

    利用Go语言快速实现一个极简任务调度系统

    任务调度(Task Scheduling)是很多软件系统中的重要组成部分,字面上的意思是按照一定要求分配运行一些通常时间较长的脚本或程序。本文将利用Go语言快速实现一个极简任务调度系统,感兴趣的可以了解一下
    2022-10-10
  • 使用Golang编写一个简单的命令行工具

    使用Golang编写一个简单的命令行工具

    Cobra是一个强大的开源工具,能够帮助我们快速构建出优雅且功能丰富的命令行应用,本文将利用Cobra编写一个简单的命令行工具,感兴趣的可以了解下
    2023-12-12
  • GO语言函数(func)的声明与使用详解

    GO语言函数(func)的声明与使用详解

    这篇文章主要介绍了GO函数(func)的声明与使用,包括了GO语言函数声明与使用,GO语言递归函数,GO语言内置函数,GO语言函数defer应用,GO语言函数可变长度参数需要的朋友可以参考下
    2022-12-12
  • go语言实现字符串与其它类型转换(strconv包)

    go语言实现字符串与其它类型转换(strconv包)

    strconv包是Go语言标准库的一部分,主要提供字符串与基本数据类型之间的转换功能,使用strconv包可以方便地在不同类型之间进行转换,满足日常编程中的需求,感兴趣的可以了解一下
    2024-10-10
  • Go基础教程系列之回调函数和闭包详解

    Go基础教程系列之回调函数和闭包详解

    这篇文章主要介绍了Go基础教程系列之回调函数和闭包详解,需要的朋友可以参考下
    2022-04-04

最新评论