Go 接口引用兼容传值(接口指针兼容值)

//go接口传引用兼容传值(常见于框架实现)
//当一个结构实现接口时,只有值实现时,使用值和指针都可以
//当一个结构实现接口时,既有指针实现,也有值实现时,使用值传递会报错
//当一个结构实现接口时,既有指针实现,也有值实现时,使用指针传递实现

package main

import (
	"fmt"
	"reflect"
)

func main() {
	st := newStudent("zhangsan", 18)
	//testI(st)  	//报错 Cannot use 'st' (type student) as type util Type does not implement 'util' as 'setAge' method
	testI(&st)
}

type util interface {
	getName() string
	getAge() int
	setAge()
	setAge2()
}

type student struct {
	name string
	age  int
}

//newStudent 构造方法
func newStudent(name string, age int) student {
	return student{
		name: name,
		age:  age,
	}
}

//getName 值实现
func (st student) getName() string {
	return st.name
}

//getAge 值实现
func (st student) getAge() int {
	return st.age
}

//getAge 值实现
func (st student) setAge2() {
	st.age = 4321
}

//setAge 指针实现 ,而getName和getAge是用值实现,下面testI(u util)传的接口变量是值,但是接口默认支持传递指针,当传递指针时就代表,指针和值的方法都能调用成功1
func (st *student) setAge() {
	st.age = 1234
}

//接口传参测试
func testI(u util) {
	ty := reflect.TypeOf(u)
	fmt.Println("u type", ty.String())
	fmt.Println("u getName:", u.getName()) //此处u就可以代表值
	fmt.Println("u getAge:", u.getAge())   //此处u就可以代表值

	u.setAge2()                                        //此处u就代表值传递
	fmt.Println("u getAge after setAge2:", u.getAge()) //u getAge after setAge2: 18

	u.setAge()                                        //此处 u 就代表引
	fmt.Println("u getAge after setAge:", u.getAge()) //u getAge after setAge: 1234
}

// 16 = 4个二进制位 = 0.5字节
//4个字节=1个16进制位
// 16位地址总线
//1G = 2 ^ 10 M = 2 ^10 * 2 * 10 KB = 2 ^10 * 2 ^ 10 *  2 ^ 10 B
//1G = 2^30 B
//4G = 2 ^32B
// 16位地址总线 :4位(16进制),表示的地址范围就是16个二进制位也就是 4个16地址位,所以16位地址总线 = 4 位二进制地址
// 32位地址总线 :8位(16进制)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

koral chen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值