Go学习笔记—结构体、方法、接口
感谢观看,如有错误,请留言指正!谢谢
1、结构体
结构体是各个字段的类型的集合。可以封装多个基本的数据类型。
type student struct{
id int
name string
score int
}
使用这个语法可以创建一个新的结构体元素。
type 类型名 struct {
字段名 字段类型
字段名 字段类型
…
}
- 类型名:标识自定义结构体的名称,在同一个包内不能重复。
- 字段名:表示结构体字段名。结构体中的字段名必须唯一。
- 字段类型:表示结构体字段的具体类型。
上面我们定义了一个student
的自定义类型,还可以定义一个person
实体。
type person struct{
name string
age int
}
结构体实例化:
像定义变量一样,定义一个类型为结构体的变量即可。
type person struct{
name string
age int
}
func main(){
var people person //结构体实例化
people.age = 18
people.name = "林文"
fmt.Println(people)
}
//{林文 18}
使用new()
进行实例化操作时,会生成一个结构体指针变量。在访问结构体成员是,也可以使用.
操作,但是Go语言会对指针自动解引用。
func main(){
var p2 = new(person)
(*p2).name = "胡玉"
//p2.name = "文林"
p2.age = 19
fmt.Println(p2)
}
//&{胡玉 19}
//&{文林 19}
代码的运行结果可以看到,(*p2.name)
和p2.name
是等效的。而且结构体成员的值是可变的。
结构体初始化:
没有初始化的结构体,其成员变量都是对应其类型的零值。
使用键值对的形式进行初始化:
//使用键值对的形式进行初始化
p3 := person{
name:"吴林",
age:20
}
//对结构体指针利用键值对形式进行初始化
p4 := &person{
name:"胡林"
age:21
}
- 没有初始化的结构体成员变量,其对应的值是零值。
使用值列表进行初始化:
//使用值列表进行初始化
p5 := person{
"余林",
22
}
- 必须初始化结构体的所有成员变量
- 初始化值的顺序必须与字段定义的顺序相同
- 不能和键值对混搭使用
2、方法
方法是作用于特定类型变量的函数。这种特定类型变量叫做接收者。
//语法
func (接收者变量 接收者类型) 方法名(参数列表) (返回参数) {
函数体
}
- 接收者变量:接收者中的参数变量名在命名时,官方建议使用接收者类型名称首字母的小写,而不是
self
、this
之类的命名。例如,Person
类型的接收者变量应该命名为p
,Connector
类型的接收者变量应该命名为c
等。 - 接收者类型:接收者类型和参数类似,可以是指针类型和非指针类型。
- 方法名、参数列表、返回参数:具体格式与函数定义相同。
type rect struct{
width,height int
}
//方法,对接收者计算面积的方法
func (r *rect) area() int{
return r.width * r.height
} //指针类型的接收者
//方法,对接收者计算周长的方法
func (r rect) perim() int{
return 2*r.width + 2*r.height
} //值类型的接收者
//构造函数
func newRect(width,height int) rect{
return rect{
width: width,
height: height,
}
}
func main(){
r := rect{
10,4}
fmt.Printf("面积是:%d\n",r.area())
fmt.Printf("周长是:%d\n",r.perim())
rt := newRect(5,5)
fmt.Printf("面积是:%d\n",rt.area())
fmt.Printf("周长是:%d\n",rt.perim())
}