Go面向对象三之结构体方法

一:结构体方法定义

type Student struct {
	Name string 
	Age int 
}
//stu可以看做Student的副本,stu就代表Student func (stu Student) say() string { }

 二:简单举例

package main
import (
	"fmt"
)
type Personal struct {
	Name string 
	Age int 
}

func (p Personal) say() {
	p.Name = "张三"
	p.Age = 18
	fmt.Printf("%v今年%v", p.Name, p.Age)
}

结果
[ `go run struct1.go` | done ]
	张三今年18

 三:结构体方法使用细节

①:结构体类型是值类型,在方法调用中,遵守值类型的传递规则

②:如果希望在方法中的修改结构体变量,可以使用指针方法

package main
import (
	"fmt"
)
type Circle  struct {
	r float64
}


func (c *Circle) area() float64{
	c.r = 10
	return 3.14*c.r*c.r
}

func main() {
	var area Circle
	area.r = 12
	fmt.Println(area.r)
	res := area.area()
	fmt.Println(res)
	fmt.Println(area.r)
}
结果
[ `go run struct1.go` | done ]
	12
	314
	10

 ③:自定义类型也可以有方法,而不仅仅是结构体(struct),如:int,float64;

④:方法的访问控制方法和函数一样,不再阐述;

⑤:如果一个结构体实现String()方法,fmt.Println()默认调用String方法

package main
import (
	"fmt"
)
type Moren  struct {
	r float64
}

func (s Moren) String() string{
	return "默认调用"
}
func main() {
	var str Moren
	fmt.Println(str)
}
结果
[ `go run struct1.go` | done ]
	默认调用

 四:构造体方法与普通函数的区别

①:调用方式

普通函数->函数名()

方法--->变量.方法名()

②:普通函数,接受者为值类型时,不能把指针类型传递给接受者,反之亦然;而构造体方法的接受者为值类型时,同样可以使用指针传递数据,反之亦然。

五:方法传参的本质

真正确定是值类型还是指针类型,由方法和那个类型绑定决定。

如(s Moren)就是值类型,无论是值传递还是指针传递,本质还是值传递(go底层进行了优化处理),反之亦然。

六:工厂模式

当结构体是小写字母开头,但又要被其他包引用时,可以通过工厂模式来解决。

package bao
type students struct { Name string Age int } //工厂模式的声明方式 func Gc(name string, age int) *students{ return &students{ Name : name, Age : age, } }

 其他包调用

package main

import (
	"fmt"
	"go_code/project01/bao"
)

func main() {
	stu := bao.Gc("lois", 180)
	fmt.Println(*stu)	
}
结果
[ `go run struct1.go` | done ]
    {lois 180}

 备注:同样的道理可用在都是小写字母开头的字段和方法上。

猜你喜欢

转载自www.cnblogs.com/louis181214/p/10256569.html
今日推荐