Go语言实战五-go语言的类型系统

前言

go语言是静态类型语言,也就是在编译时编译器需要知道程序中值的类型,这样有利于减少bug和提高性能,具体就是内存的分配量和其中的内容

用户定义类型

1.用户定义新的类型,需要使用type 和struct关键字

type user struct {
	name string
	email string
	phone int
	}

这个类型就类似于面向对象时抽象出来的一个对象
可以用来创建值

var jack user

这样jack就是一个user类型的变量,不初始化时数值类型默认为0,字符串为空字符串,布尔为false

可以利用短变量声明操作符(: =)对变量初始化

lisa := user{
name:"lisa",
email:"aaa@bb.com",
phone:"134343434"
}

如下,也可以不用字段名直接按顺序赋值

lisa := user{"Lisa", "lisa@email.com", 123, true}

同时,结构体也可以嵌套,如下,person是一个user结构体类型的变量

type admin struct {
	person user
	level string
 }

如此初始化时也要对person按照结构体的方式进行赋值
2. 声明新类型还可以用已有的基础类型延伸,例如

type Duration int64

Duration基于int64类型,它的单位是ns(纳秒)
虽然是基于int64声明的,但它不兼容int64类型的值,强行赋值的话,编译器无法进行转换,会报错

方法

func关键字可以声明方法,如下

// notify 使用值接收者实现了一个方法
 func (u user) notify() {
 fmt.Printf("Sending User Email To %s<%s>\n",
 u.name,
 u.email)
 }

 // changeEmail 使用指针接收者实现了一个方法
 func (u *user) changeEmail(email string) {
 u.email = email
 }

两种接收者就类似于其他语言中的函数形参,都可以用来调用方法自身,两者特点是,值接收者在调用时会生成一个副本,指针接收者则会影响到原值,在编码时对两者的抉择,会有一些基本的指导原则
1.如果要更改原值,就使用指针接收者,如果要创建一个新值,就使用值接收者
数值类型、字符串类型和布尔类型都是内置类型,在对其进行修改或删除时,会创建一个新值,而在作为方法参数传递时,则会传递一个副本
在这里插入图片描述
这个函数时计算当前时间的,它创建time,然后返回它的副本,没有采取共享的方式,因为时间应该是给定一个时间点,不能被修改的
在这里插入图片描述
而这个函数,返回指向值得指针,因为File类型得值具有非原始得本质
2.使用值接收者还是指针接收者,不应该由该方法是否修改了接收到的值来决定。这个决策应该基于该类型的本质。这条规则的一个例外是,需要让类型值符合某个接口的时候,即便类型的本质是非原始本质的,也可以选择使用值接收者声明方法。

接口

多态是指根据不同类型实现不同行为,以io接口为例
在这里插入图片描述
23行通过get函数,完成了curl的操作

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值