1.结构体和方法
在go中,是没有类class的定义的,但是类似于class的是type
package main import ( "fmt" ) //定义一个类 type person struct { name string age int tel int } //构造函数 func con(name string, age, tel int) *person { return &person{name, age, tel} } //方法 func (aaa person) fanfa() { fmt.Println(aaa.tel * aaa.age) } //修改person中的name,但不就该原数据 func (aaa person) update_name(name string) person { aaa.name = name return aaa } //修改person中的name,也修改原数据 func (aaa *person) update(name string) person { //指针下的name,落脚点是name,name并不是指针 aaa.name = name return *aaa } func main() { //实例化类1 var a person a.tel = 15888888888 //实例化类2 b := person{name: "王八", age: 18, tel: 18566654124} //实例化类3 c := person{"张二", 19, 15888888888} fmt.Println(a, b, c) //调用类中的方法 c.fanfa() //修改现数据 fmt.Println("这是现在的name:", c.update_name("狗儿")) //修改原数据 c.update("二比") fmt.Println("这是原来的name:", c) }
结果展示:
2.包的封装,实现面向对象
2.1包的逻辑关系图
2.2利用entry.go调用tree包,实现对tree包下,node.go和node1.go的调用
node.go
package tree //定义一个类 type Person struct { Name string Age int Tel int } //修改Person中的Name,但不就该原数据 func (aaa Person) Update_name(Name string) Person { aaa.Name = Name return aaa } //修改Person中的Name,也修改原数据 func (aaa *Person) Update(Name string) Person { //指针下的Name,落脚点是Name,Name并不是指针 aaa.Name = Name return *aaa }
node1.go
package tree import "fmt" //构造函数 func Con(Name string, Age, Tel int) *Person { return &Person{Name, Age, Tel} } //方法 func (aaa Person) Fanfa() { fmt.Println(aaa.Tel * aaa.Age) }
entry.go
package main import ( "../tree" "fmt" ) func main() { //实例化类1 var a tree.Person a.Tel = 15888888888 //实例化类2 b := tree.Person{Name: "王八", Age: 18, Tel: 18566654124} //实例化类3 c := tree.Person{"张二", 19, 15888888888} fmt.Println(a, b, c) //调用类中的方法 c.Fanfa() //修改现数据 fmt.Println("这是现在的Name:", c.Update_name("狗儿")) //修改原数据 c.Update("二比") fmt.Println("这是原来的Name:", c) }
通过运行entry.go实现调用tree,效果如下: