Golang中的方法是作用在特定类型的变量上,因此自定义类型,都可以有方法,而不仅仅是struct。
定义格式
func (var *Struct_Name) FuncName( var0, var1... ) return type {}
package main
import (
"fmt"
)
type test struct {
name string
age int
}
func (v *test) getList() {
fmt.Println("getList")
}
func main() {
var s = new(test)
s.getList()
}
golang中结构体方法没有构造函数,可以自己定义并执行构造函数
package main
import (
"fmt"
)
type test struct {
name string
age int
}
func (this *test) init(name string, age int) {
this.name = name
this.age = age
}
func (this *test) getName() string {
return this.name
}
func (this *test) getAge() int {
return this.age
}
func main() {
var s = new(test)
s.init("zhangsan", 20)
fmt.Println(s.getName())
fmt.Println(s.getAge())
}
自行调用初始化方法来实现构造函数的作用
给一个类型取别名
package main
import "fmt"
type integer int
func (this integer) test() {
fmt.Println("print integer")
}
type test struct {
name string
age int
}
func main() {
var i = new(integer)
i.test()
}
结构体是用户单独定义的类型,不能和其他类型进行强制转换
package main
type integer int
func main() {
var i integer
i = 100
var n = 10
n = i
}
结构体是值类型的,改变的是内部的副本。
package main
import (
"fmt"
)
type integer int
func (this integer) get() {
fmt.Println(this)
}
func (this integer) set(num integer) {
this = num
}
func main() {
var i integer
i = 100
i.set(1999)
fmt.Print(i)
}
package main
import (
"fmt"
)
type integer int
func (this integer) get() {
fmt.Println(this)
}
func (this *integer) set(num integer) {
*this = num
}
func main() {
var i integer
i = 100
(&i).set(1999) //= i.set(1999)
fmt.Print(i)
}
方法的访问控制也是通过控制的
结构体继承
如果一个struct嵌套了另一个匿名结构体,那么这个结构可以直接访问 匿名结构体的方法,从而实现了继承。
结构体方法的继承
package main
import (
"fmt"
)
type test struct {
Name int
Age int
}
func (this test) getName() int {
return this.Name
}
type test1 struct {
test
}
func main() {
var t test1
t.Name = 123
var name = t.getName()
fmt.Println(name)
}
如果一个struct嵌套了另一个匿名结构体,那么这个结构可以直接访问 匿名结构体的方法,从而实现了继承。
如果一个struct嵌套了另一个有名结构体,那么这个模式就叫组合。
package main
import (
"fmt"
)
type test struct {
Name int
Age int
}
func (this test) getName() int {
return this.Name
}
type test1 struct {
t test
}
func main() {
var t test1
t.t.Name = 123
var name = t.t.getName()
fmt.Println(name)
}