今天学方法和接口,感觉相对来说有些难的,毕竟没基础
package main
import(
"fmt"
_ "fmt"
)
func main(){
fmt.Println("冬至快乐!")
//一、结构体:
//Go 语言中没有“类”的概念,也不支持像继承这种面向对象的概念。
//但是Go 语言的结构体与“类”都是复合结构体,而且Go 语言中结构体的组合方式
//比面向对象具有更高的扩展性和灵活性。
//1、定义:
//结构体中字段的类型可以是任何类型,包括函数类型,接口类型,
//甚至结构体类型本身。例如我们声明一个链表中的节点的结构体类型。
type Student struct{
Name string
Age int
}
type ListNode struct{
Val int
Next *ListNode
}
type Person struct{
ID string
int //不给指定字段名字,匿名字段
}
//2、操作结构体
//三种创建结构体实例的方法:
//使用new函数会创建一个指向结构体类型的指针,创建过程中会
// 自动为结构体分配内存,结构体中每个变量被赋予对应的零值。
s1 := new(Student)
//此时给结构体赋值的顺序需要与结构体字段声明的顺序一致。
s2 := Student{"james", 35}
//创建结构体的同时显示的为结构体中每个字段进行赋值。
s3 := &Student{
Name: "LeVB",
Age: 36,
}
fmt.Println(s1,s2,s3)
s1.Name = "Aten"
s1.Age = 35
fmt.Println(s1)
//匿名字段的操作
p := Person{"tang", 100}
fmt.Println(p)
//3、内嵌结构体
type A struct{
X, Y int
}
type B struct{
A //内嵌,注意与声明一个结构体类型区分
X int
Name string
}
b := new(B)
b.X = 10
b.Y = 20
b.Name = "james"
fmt.Println(b)
//二、方法
//1、方法定义,方法与函数类似,只不过在方法定义时会在func和方法名之间增加一个参数,如下所示:
//func (r Receiver)func_name(){ //r被称为方法的接收者
//body
//}
p2 := Person2{
name:"james",
}
//调用GetName方法,值接收
fmt.Println(p2.GetName())
//2、方法接收者
//指针接收者
p3 := Person2{
name:"jamessss",
}
p3.SetName("Bing")
fmt.Println(p3.GetName())
//三、接口(接口相当于一种规范,它需要做的是谁想要实现我这个接口要做哪些内容,而不是怎么做。)
//1、接口定义
//type Namer interface {
// Method1(param_list) return_type
//}
//2、实现接口(在go语言中不需要显示的去实现接口,只要一个类型实现了该接口中定义
//的所有方法就是默认实现了该接口,而且允许多个类型都实现该接口,也允许一个类型实现多个接口。)
bi := Bird{"Bird"}
d := Dog{"Dog"}
EatWhat(bi)
EatWhat(d)
}
//方法
type Person2 struct{
name string
}
func (p Person2) GetName()string{
return p.name
} //其中GetName方法的接收者为p是Person2结构体类型,也就是说我们为结构体Person2
// 绑定了一个GetName方法
//指针接收者
func(p *Person2)SetName(name string){
p.name = name
}
//实现接口
type Animal interface {
Eat()
}
type Bird struct {
Name string
}
func (b Bird) Eat() {
fmt.Println(b.Name + "吃虫")
}
type Dog struct {
Name string
}
func (d Dog) Eat() {
fmt.Println(d.Name + "吃肉")
}
func EatWhat(a Animal) {
a.Eat()
}