
Go 行为的定义与实现
在Go语言中其实是不可以实现继承的,但网上有继承相关但方式。所以Go既可以算得上面向对象,也算不上面向对象。
实例的创建以及初始化
package encap
import "testing"
type Employee struct {
Id string
Name string
Age int
}
func TestCreateEmployeeObj(t *testing.T) {
e := Employee{"0", "Bob", 19}
e1 := Employee{Name: "Bob", Age: 20}
e2 := new(Employee) // 注意这里返回的引用/指针 相当于e := &Employee{}
e2.Name = "AiDaSi" // 与其他主要编程语言的主要差距是,通过实例指针访问成员不需要->
e2.Id = "1"
e2.Age = 19
t.Logf("e.Id: %s e.Name: %s e.Age: %d", e.Id, e.Name, e.Age)
t.Logf("e1.Id: %s e1.Name: %s e1.Age: %d", e1.Id, e1.Name, e1.Age)
t.Logf("e2.Id: %s e2.Name: %s e2.Age: %d", e2.Id, e2.Name, e2.Age)
}
如果想获取它的类型的话,我们从下图发现e1
是实例的对象类型,e2
是指针类型。
// 使用%T获取该类型
t.Logf("e1 is %T", e1)
t.Logf("e2 is %T", e2)
行为方法的定义
相当于c#对类对扩展方法一样
// 相当于扩展方法
// 通过实例去请求的方法
func (e Employee) String() string {
return fmt.Sprintf("e type: %T e.Id: %s e.Name: %s e.Age: %d Indicator: %x", e, e.Id, e.Name, e.Age, unsafe.Pointer(&e.Id))
}
// 通过指针去请求的方法
func (e *Employee) IndicatorString() string {
return fmt.Sprintf("e type: %T e.Id: %s e.Name: %s e.Age: %d Indicator: %x", e, e.Id, e.Name, e.Age, unsafe.Pointer(&e.Id))
}
func TestBeHavior(t *testing.T) {
e := Employee{"1", "Bob", 19}
// 获取实例指针
t.Logf("Init: %x", unsafe.Pointer(&e.Id))
t.Logf(e.String())
t.Logf(e.IndicatorString())
}
在这里我们一般使用第二种方式,因为是使用的同一个指针而少做类一次实例的复制
欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739
评价
排名
2
文章
657
粉丝
44
评论
93
docker中Sware集群与service
尘叶心繁 : 想学呀!我教你呀
一个bug让程序员走上法庭 索赔金额达400亿日元
叼着奶瓶逛酒吧 : 所以说做程序员也要懂点法律知识
.net core 塑形资源
剑轩 : 收藏收藏
映射AutoMapper
剑轩 :
好是好,这个对效率影响大不大哇,效率高不高
一个bug让程序员走上法庭 索赔金额达400亿日元
剑轩 : 有点可怕
ASP.NET Core 服务注册生命周期
剑轩 :
http://www.tnblog.net/aojiancc2/article/details/167
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:
50010702506256


欢迎加群交流技术