专栏首页黑光技术golang的struct和interface

golang的struct和interface

完美之道,不在无可增加,而在无可删减!

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()
}

本文分享自微信公众号 - 黑光技术(helight_dt),作者:helight

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-02-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Golang信号处理和如何实现进程的优雅退出

    各操作系统的信号定义或许有些不同。下面列出了POSIX中定义的信号。 在linux中使用34-64信号用作实时系统中。 命令 man 7 signal 提供了官...

    黑光技术
  • 自2013到2019年大数据领域发生了什么变化

    在网上看到这篇文章之后发现还挺有意思,文章也算比较简短,就试着联系了一下作者说我想把他翻译成中文,不做商业用途只是练习和技术布道。作者的回应也非常快,当晚就给我...

    黑光技术
  • 自2013到2019年大数据领域发生了什么变化

    在网上看到这篇文章之后发现还挺有意思,文章也算比较简短,就试着联系了一下作者说我想把他翻译成中文,不做商业用途只是练习和技术布道。作者的回应也非常快,当晚就给我...

    黑光技术
  • 了解、接受和利用Java中的Optional (类)

    作者:EUGEN PARASCHIV 译者:海松 原题: Understanding, Accepting and Leveraging Optional in...

    yuanyi928
  • 用python实现接口测试(三、天气查询接口)

    一般来说做接口测试,我们应当手上能够拿到后台开发提供的接口文档,但是我今天给大家找的是网络上的案例,学习的同学可以一起看看。

    用户6367961
  • jq使用splice删除数组元素出错的解决方法

    splice() 方法可删除从 index 处开始的零个或多个元素,并且用参数列表中声明的一个或多个值来替换那些被删除的元素。

    仙士可
  • 注册表删除windows服务的方法

    2 在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services 中删除相应的键值

    飞奔去旅行
  • [PHP] 重回基础(Array相关函数)

    使用函数array_map(),使每个元素都调用一下自定义函数,参数:String类型函数名称,数组

    陶士涵
  • JavaScript引用类型之Array数组之强大的splice()方法

    splice()方法可以说是Array数组最强大的方法,他的用法很多,主要用法是向数组的中部插入项! 下面是它的用法: arrayObject.splice(i...

    郑小超.
  • 英伟达深度学习推理引擎TensorRT,现在开源了

    本次开源的内容是英伟达 TensorRT 的一部分,其中包括 TensorRT 的插件与一些解析器(Caffe 和 ONNX),以及演示 TensorRT 平台...

    机器之心

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动