//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进制)