方法是和数据类型绑定的,自定义数据类型可以用方法
package main
import "fmt"
type Person struct {
Name string
Age int
}
//方法是结构体的指针拷贝 会改变原结构体的数值
func(p *Person) say() {
p.Name ="jack"
fmt.Println("方法中Name:", p.Name)
}
//方法是结构体的值拷贝 不会改变原结构体的数值
func(p Person) sayhello() {
p.Name ="love"
fmt.Println("方法中Name:", p.Name)
}
func say(p *Person){
p.Age=28
fmt.Println("Age:", p.Age)
}
//结构体拷贝 变量拷贝
func(p *Person) getSum(n1 int, n2 int) (int){
return n1+n2
}
//String函数会在println中自动调用 绑定了Person这个类型
func(p Person) String() string{
str := fmt.Sprintf("Name=[%v], Age=[%v]",p.Name,p.Age)
return str
}
func main() {
//方法的使用
var p Person
p.Name="Tom"
p.say()
fmt.Println("主函数中Name:", p.Name)
(&p).sayhello()//形式上是引用类型,但是方法中变量为值类型,因此还是值拷贝,无法改变变量的数值。
fmt.Println("主函数中Name:", p.Name)
var result = p.getSum(2,3)
fmt.Println(result)
//变量调用方法时,变量本身也会传到方法里面,如果变量是值类型,则值拷贝
//如果是引用类型,则是地址拷贝
fmt.Println(p)
var sp Person
fmt.Println(sp)
say(&p)
fmt.Println(p)
}
Go语言工厂模式,如果一个包内结构体名字首字母为小写,需要编写new函数。如果结构体中某个字段首字母为小写,需要在此包内新建一个在Get函数。
package student
type student struct {
Name string
age int
}
func NewStudent(name string, age int ) *student{
return &student{
Name: name,
age: age,
}
}
func GetAge(stu *student) int{
return stu.age
}
package main
import (
"exceise/student"
"fmt"
)
func main() {
stu := student.NewStudent("Loveyou", 18)
fmt.Println("新建的student类型为:",*stu)
fmt.Println("name=",stu.Name,"Age",student.GetAge(stu))
}
输出结果如下:
新建的student类型为: {Loveyou 18}
name= Loveyou Age 18