在 Go 语言中类似 Java 类的概念叫做结构体,使用 type, struct 两个关键词修饰

开始

定义结构体

1
2
3
4
type User struct {
Id int
Name String
}

结构体的属性希望被外部访问则首字母大写,否则小写。

实例化

结构体实例化有很多种方式

  • 普通实例化
1
2
3
4
var a User
fmt.Println(a) // {0 }
a.Id = 1
fmt.Println(a) // {1 }
1
2
a := User{1, "wxnacy"}
fmt.Println(a) // {1 wxnacy}
1
2
3
4
a := User(Id: 1, Name: "wxnacy")
fmt.Println(a) // {1 wxnacy}
a = User(Name: "wxnacy")
fmt.Println(a) // {wxnacy}
  • 指针实例化

使用 new(T) 或者 $T{} 的方式实例化,并返回指针

1
2
a := new(User)
fmt.Println(a) // &{0 }
1
2
a := &User{1, "wxnacy"}
fmt.Println(a) // &{1 wxnacy}

访问成员变量

1
2
3
a := User{1 "wxnacy"}
fmt.Println(a.Id) // 1
fmt.Println(a.Name) // wxnacy

定义结构体方法

结构体的方法不像 Java 一样是写在类内部的,反而像 Javascript 一样是写在外部的。

1
2
3
func (this User) ToString string{
return fmt.Sprintf("User Id: %d, Name: %s", u.Id, u.Name)
}

访问

1
2
u := User{1, "wxnacy"}
fmt.Println(u.ToString()) // User Id: 1, Name: wxnacy

方法名 ToString 前面的形参是实例化后的结构体将本身拷贝出一份传入的,所以如果想在方法内修改结构体的属性值,需要将形参改为指针。

1
2
3
func (this *User) SetId(id int){
this.Id = id
}

即使将结构体实例化为指针,也要这样写,应为传入的拷贝是普通实例化的数据

继承

1
2
3
4
5
6
7
8
9
10
11
type Human struct {
Msg string
}

func (this Human) ToString() string {
return this.Msg
}

type Man struct {
Human
}

结构体 Man 将 Human 作为成员定义在成员列表即可

1
2
3
4
h := Human{Msg: "I am a Human"}
fmt.Println(h.ToString())
m := Man{Human{Msg: "I am a Man"}}
fmt.Println(m.ToString())
03-16 13:50