Go面向对象三之结构体方法
Posted louis181214
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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}
备注:同样的道理可用在都是小写字母开头的字段和方法上。
以上是关于Go面向对象三之结构体方法的主要内容,如果未能解决你的问题,请参考以下文章