Go语言入门到实战——00主目录
在上一讲中我们学习了Go语言的函数的相关知识。
一.封装数据
1.定义结构体
type Employee struct{
Id string
Name string
Age int
}
2.实例的创建与初始化
package test
import (
"testing"
)
type Employee struct{
Id string
Name string
Age int
}
func Test(t *testing.T) {
e := Employee{"1","Jack",20}
e1 := Employee{Name:"Jack",Age:20}
e2 := new(Employee)//这里返回了指针引用,等价于e2 := &Employee{}
e2.Id = "10"//注意,实例的指针访问成员使用的是.不是->
t.Log(e,e1,e2)
t.Logf("e's type is %T,\ne2's type is %T",e,e2)//打印结果我们可以看出来
//e是结构体类型,而e2是指针类型
}
二.行为(方法)
行为和函数很像,但是又不太一样,我们来看看下面的内容就明白了.
//从下面我们可以看到行为是在函数名前面加上了(参数),这种方式指定了这个方法可以被
//被前面的参数类型调用,这有点面向对象的意思了,不过我们更加的推荐方案2,因为方案1会
//进行拷贝复制比较占用空间
package test
import (
"testing"
"fmt"
)
type Employee struct{
Id string
Name string
Age int
}
func (e Employee) String1() string{
return fmt.Sprintf("Id:%s-Name:%s-Age:%d",e.Id,e.Name,e.Age)
}
func (e *Employee) String2() string{
return fmt.Sprintf("Id:%s-Name:%s-Age:%d",e.Id,e.Name,e.Age)
}
func Test(t *testing.T) {
e := Employee{"1","Jack",20}
e2 := &e
//不能使用e.String2(),String2()是指针的方法
t.Log(e.String1())
//这里使用e2.String1()其实也是可以的,因为String1()可以看成是Employee的成员函数
//而go的指针调用成员变量或者函数都是使用.而不是->,没有区别
t.Log(e2.String2())
//关于上面两段注释,如果不理解,可以这么进行记忆来理解(只是方便记忆,不是真的)
//可以理解为指针类型是类型的儿子,类型是父亲,父亲无法强转为儿子(可能报错),而
//儿子可以转为父亲
}