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