Go方法与工厂模式
- Golang中的方法是作用在指定的数据类型上的,和指定的数据类型绑定,因此自定义类型都可以有方法
方法的调用和声明
package main
import (
"fmt"
)
//方法的声明和调用
type Person struct {
Name string
}
//func (p Person)test(){}表示Person结构体有一方法,方法名为test
//()表示接收的参数
//()与{}之间表示返回值
//(p Person)体现test方法是和Person类型绑定
//p表示哪个Person变量调用,p就是它的副本,和函数传参相似
func (p Person) test() {
fmt.Println("test()Name=",p.Name)
}
func main(){
var p Person
p.Name = "tom"
p.test()//调用方法
//将p传给(p Person)中的p
//test方法只能通过Person类型的变量来调用,不能直接调用,也不能使用其他类型变量调用
}
方法的调用和传参机制原理
- 在通过一个变量去调用方法时,其调用机制与函数一样
- 变量调用方法时,该变量本身也会作为一个参数传递到方法(如果变量时值类型,则进行值拷贝;如果时引用类型,则进行地址拷贝)
int等也有方法
package main
import "fmt"
type integer int
func (i integer)print(){
fmt.Println("i = ",i)
}
func (i *integer)change(){
*i = *i + 1
}
func main(){
var i integer = 10
i.print()
i.change()
fmt.Println("i=",i)
}
-
如果一个类型实现了String()这个方法,那么fmt.Println会默认调用这个变量的String()进行输出
-
package main import "fmt" type Student struct { Name string Age int } //给*Student实现方法String() func (stu *Student)String()string{ str := fmt.Printf("Name=[%v] Age=[%v]",stu.Name,stu.Age) return str } func main(){ stu := Student { Name: "tom", Age: 20, } //如果实现了*Student类型的String方法,就会自动调用 fmt.Println(&stu) }
-
方法和函数区别
package main
import "fmt"
type Person struct {
Name string
}
//普通函数,接收者为值类型时,不能将指针类型的数据直接传递,反之亦然
//方法,接收者为值类型时,可以直接用指针类型的变量调用方法,反之亦然
func (p Person)test03(){
p.Name = "Jack"
fmt.Println("test03()=",p.Name)
}
func main(){
p := Person{"tom"}
p.test03()//jack
fmt.Println("main()p.name=",p.Name)//tom
//从形式看是传地址,本质仍为值拷贝
(&p).test03()//jack
fmt.Println("main()p.name=",p.Name)//tom
}
工厂模式
- 如果使用别的包的首字母小写的结构体,引入后不能直接使用,可以用工厂模式解决
package main
import (
"fmt"
"go_code/project01/model"
)
func main(){
var stu = model.NewStudent("tom~",88.8)
fmt.Println((*stu))
fmt.Println("name=",stu.Name,"score=",stu.Score)
}
package model
//定义一个结构体
type student struct {
Name string
Score float64
}
func NewStudent(n string,s float64) *student {
return &student {
Name : n,
Score : s,
}
}