Golang_method_工厂模式

Golang

1 method

在Golang中的struct一般不可以定义方法,所以一般都是另外定义方法的。
比如下面的方法中我将Person定义了三个方法;
第一个方法为输出p1的num
第二个方法为输出0-n的数字的相加的和
第三个方法为输出两个数字的和
第三个方法以return结尾那么就会有一个int接收。

package main
import "fmt"
//方法
type Person struct{
	num int
}
func (p1 Person) test(){
	fmt.Println(p1.num)
}
func (p Person) test2(n int){
	res := 0
	for i := 0;i < n;i++{
		res += i
	}
	fmt.Println(res)
}
func (p Person)test3(n1 int, n2 int)int{
	return n1 + n2
}
func main(){

	var p Person
	p.num = 14
	p.test()
	p.test2(100)
	res := p.test3(10,20)
	fmt.Println(res)
}

结果
14
4950
30

强调 1
在Golang中方法和函数传入的如果是值的话效率会低一些
所以Golang的设计者设计了传入指针的类型,效率更高。

type c1 struct{
	num float64
}

func (c2 c1) area() float64{
	return 3.14 * c2.num * c2.num
}
func (c2 *c1)area1() float64{
	return 3.14 * (*c2).num * (*c2).num
}
//和上面的方法是一样的
//只是因为在go语言的底层有优化
func (c2 *c1)area2()float64{
	return 3.14 * c2.num * c2.num
} 

func main(){
	var r c1
	r.num = 4.0
	fmt.Println(r.area())
	var r2 c1
	r2.num = 5.0
	fmt.Println((&r2).area1())
	fmt.Println(r2.area2())
	fmt.Println(r2.area1())
}

结果
50.24
78.5
78.5
78.5
上面的传入的是指针但是由于有优化,所以赋值和输入参数的时候都不需要添加*和&

强调 2
下面的方法是以string的方法输出的相当于java的tostring方法

type student struct{
	Name string
	Age int
}
//定义String方法:
//可以输出固定的形式
func (stu *student)String()string{
	str := fmt.Sprintf("Name=[%v] Age=[%v]",stu.Name,stu.Age)
	return str
}
func main(){
	stu := student{"张三",18}
	fmt.Println(&stu)
}

结果
Name=[张三] Age=[18]

强调 3
Golang语言支持面向对象
下面的方法为面向对象的实例

//面向对象的实例:
type student struct{
	name string
	age int
	sex string
	id int
}
func (stu *student)say()string{
	str := fmt.Sprintf("name=[%v],age=[%v],sex=[%v],id=[%v]",stu.name,stu.age,stu.sex,stu.id)
	return str
}
func main(){
	var stu = student{
		name : "tom",
		age : 16,
		sex : "男",
		id : 001,
	}
	fmt.Println(stu.say())
}

结果
name=[tom],age=[16],sex=[男],id=[1]

2 工厂模式

一般来书如果是不同包的话Golang如果需要引入另外一个包的结构体的话需要引包而且结构体的首字母需要大写代表的是public
但是有些程序员不想用大写字母,但是小写字母代表的是私有private,所以可以利用工厂模式来引入私有模式的结构体。

扫描二维码关注公众号,回复: 9238678 查看本文章

在这里插入图片描述

student.go

package model

type student struct{
	Name string
	Age int
}

func NewStudent (n string,a int) *student{
	return &student{
		Name : n,
		Age : a,
	}
}

main.go

package main
import "fmt"
import "go_code/project09/chapter04/demo01/model"
func main(){
	
	var stu = model.NewStudent("tom",15)
	fmt.Println(*stu)
	fmt.Println(stu.Name,stu.Age)
}

结果
{tom 15}
tom 15

强调 1
在上面的工程模式需要强调的是结构体的属性也必须是首字母大写,才可以被访问。public
如果是首字母小写的话那么也必须利用工厂模式
如将Age -> age

student.go

type student struct{
	Name string
	age int
}

func NewStudent (n string,a int) *student{
	return &student{
		Name : n,
		age : a,
	}
}
func (a *student)Getage()int{
	return a.age
}

main.go

package main
import "fmt"
import "go_code/project09/chapter04/demo01/model"
func main(){
	
	var stu = model.NewStudent("tom",15)
	fmt.Println(*stu)
	fmt.Println(stu.Name,stu.Getage())
}

3 总结

这里的工厂模式就相当与golang的封装。

发布了101 篇原创文章 · 获赞 12 · 访问量 6187

猜你喜欢

转载自blog.csdn.net/qq_43141726/article/details/104372924