在 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())
|