当前位置: 首页 > article >正文

Go type关键字定义新类型和类型别名的区别

type关键字再定义类型和类型别名有很大的区别,前者是新定义一个数据类型,后者是对类型的重命名。

type NewString string

type OldString = string

type NewString string声明了一个NewString类型,和string具有完全一致的数据结构,确实两种类型。这样有什么好处是使新的类型可以扩充和延展。

在Go语言中方法只能在同一包下定义,不能为其他包的类型定义方法,如下:

在这里插入图片描述

需要通过类型定义来在新的包中对类型进行扩展。例如如果需要对所有的string类型做更改,比如加一个666后缀。如果不用新类型就需要在每个string类型后面+"666"的操作,还有一种方法是在string包下添加一个方法,如下:

在这里插入图片描述
不能定义其他包中类型的方法,这使切换到string包下,看以看到官方都是用到这种定义方式:

在这里插入图片描述

在该类下添加上述add666方法显然使不合适的,因为该包下全是类型定义,再添加方法显得很冗余;另外这个方法只是一次性需求不是通用性方法也不能添加再该包下。

type关键字的类型定义就可以完美解决该问题,首先类型定义和原类型完全一致,其次在任意包下新定义类型,就可以为其扩展方法。于是之前无法完成的任务就可以使用下面方法完成:

package main

type NewString string

func main() {
	var a NewString
	println(a.add666("xiaoxu"))
}

func (self NewString) add666(str string) string {
	return str + "666"
}

NewString string是完全一样的类型。

通过类型定义将类型和类型的方法可以分开,特定类型的方法分隔开来,不用将非通用性的方法全写在一个包下。

type OldString = string为类型起一个别名,其主要作用有简化书写,赋予实际意义。例如在go语言中任意类型为空接口,但是空接口inteface{}写起来比较复杂使用any代替简化书写。

在这里插入图片描述

在内置的类型中使用byte作为unit8的别名,赋予新的意义。


http://www.kler.cn/a/18162.html

相关文章:

  • Vue 的生命周期函数 和 Vuex
  • 一文简单了解Android中的input流程
  • 【Vue】Vue3.0(十九)Vue 3.0 中一种组件间通信方式-自定义事件
  • 万字长文分析函数式编程
  • Unity3D学习FPS游戏(11)敌人AI巡逻(NavMesh)
  • ❤React-JSX语法认识和使用
  • io,nio,aio区别
  • 测试开发如何进阶?需要哪些能力?吐血整理-你的进阶之路...
  • 深入理解移动端布局:Viewport与设备像素比
  • linux命令之kill详解
  • UICollectionView 实现整页翻动(每页3个cell)
  • Android 9.0 Camera2 拍照功能默认选前摄像头
  • 【论文阅读】A Comparative Study on Camera-Radar Calibration Methods
  • 如何提高执行力
  • 图数据库游记
  • 代码随想录算法训练营day28 | 93.复原IP地址,78.子集,90.子集II
  • 回文数:探索数字世界中的对称美学
  • spark练习例子——单词计数——pyspark
  • Java基础--->基础部分(2)【Java值传递】
  • 项目搭建—常用的插件
  • 基于R语言APSIM模型
  • 国民技术N32G430开发笔记(19)- IAP 升级 I2C1 从机收发数据
  • 本地字体库的引入方法
  • 程序设计的三种结构-C中实现其的6条语句
  • 数据导向下制造业的生产效率、交易效率提升办法
  • 【ESD专题】案例:TVS管钳位电压能不能通过TLP测试数据表征?