使用Go的时候没有怎么考虑过原理和其他方法,一直都是很浅的看几眼。


头一次知道type类型还可以定义其他类型

仔细思考后想了想也是既然都可以定义interface{},这个广泛的类型,那么肯定也可以定义其他类型。

如:

type InterfaceTo []byte

type InterfaceToV7 []byte

鉴于大多数人所采用的还是面向对象的思维,那么就可以在这样的接口里面定义函数,定义属性,方法。

如:

func (i *InterfaceTo) ToString() string {
    return "name"
}

func (i *InterfaceTo) ToStringIn() *InterfaceToV7 {
    return (*InterfaceToV7)(i)
}

func (v *InterfaceToV7) Tostring() {
    logrus.Infoln("测试成功")
}

这里面依旧采用Go的公共和私有方法定义。

Go语言中定义方法和变量为公有则必须头部第一个字母为大写,如果为小写则是私有。

// 当导出json格式时,结构体定义的方法为公有才能导出,否则不会导出。


而后查看到Go的源码的时候,发现了一个神奇的操作,细细想也很正常,于是提出了这样的疑问:


// InterfaceTo
// 冷知识:创建的类型无论是不是interface都可以创建函数和方法,所以type创建接口和类型可以换一种方法理解:
// type创建一个储存方法的空间,而后面的类型则是方法指定的储存内容类型,并非必须需要interface。
// 提出疑问:如何才能已经套了一个函数的时候再用一个函数如:i.ToString().Msg() 实现方法如下

最后实现了:

var i InterfaceTo
    // logrus.Infoln(i.ToString())
    // 实现方法成功
    logrus.Info(i.ToStringIn().Tostring)

实现完整代码


以上知识皆是从阅读archive/tar的发现


额外讨论:

曾今写过一个项目,想要将一个数值判断类型然后断言或者经过自己定义的方法来将一个值改成自己判断的类型。

当时用的是switch,但是写多了,感觉丑陋,

今天查看了Go的源代码发现大佬们采用的方法也是这样的,于是觉得这样或许是最优解或者说是最方便的。

源码处理如下,他的这一段源码是将tar检验区块是否是有效的tar头:

注释如下:

// GetFormat checks that the block is a valid tar header based on the checksum.
// It then attempts to guess the specific format based on magic values.
// If the checksum fails, then FormatUnknown is returned.

源代码截图:
请输入图片描述

最后修改:2022 年 01 月 13 日
如果觉得我的文章对你有用,请随意赞赏