我正在尝试学习Go语言,文档非常好。但是我在文档中没有找到函数和方法之间的区别。
据我目前的理解:函数是“全局”的,这意味着我不需要导入包就可以使用函数,它们始终存在。而方法则绑定在包上。这样说正确吗?
我正在尝试学习Go语言,文档非常好。但是我在文档中没有找到函数和方法之间的区别。
据我目前的理解:函数是“全局”的,这意味着我不需要导入包就可以使用函数,它们始终存在。而方法则绑定在包上。这样说正确吗?
func MyFunction(a, b int) int {
return a + b
}
// Usage:
// MyFunction(1, 2)
type MyInteger int
func (a MyInteger) MyMethod(b int) int {
return a + b
}
// Usage:
// var x MyInteger = 1
// x.MyMethod(2)
a
强制转换为 int
或将 b
转换为 MyInteger
。例如:return int(a) + b
或者 return a + MyInteger(b)
。在第二种情况下,您需要更改方法签名中的返回值类型为 MyInteger
而不是 int
。【playground】(http://play.golang.org/p/tVlSCnkbx5) - SunSparcTux的回答很好,但是我想通过Go语言中与struct
相关的方法来补充它(因为我经常使用这种方法)。所以假设你想要构建一个用于计算三角形各种方法的东西。你可以从一个struct
开始:
type Triangle struct {
a, b, c float64
}
然后您想添加一些函数来计算周长和面积:
func valid(t *Triangle) error {
if t.a + t.b > t.c && t.a + t.c > t.b && t.b + t.c > t.a {
return nil
}
return errors.New("Triangle is not valid")
}
func perimeter(t *Triangle) (float64, error) {
err := valid(t)
if err != nil {
return -1, err
}
return t.a + t.b + t.c, nil
}
func square(t *Triangle) (float64, error) {
p, err := perimeter(t)
if err != nil {
return -1, err
}
p /= 2
s := p * (p - t.a) * (p - t.b) * (p - t.c)
return math.Sqrt(s), nil
}
现在你已经拥有了一个可工作的程序Go Playground。在这种情况下,你的函数需要一个参数(指向三角形的指针),并且会进行某些操作。在面向对象编程中,人们可能会创建一个类,然后添加方法。我们可以将结构体视为一种具有字段的类,现在我们添加方法:
func (t *Triangle) valid() error {
if t.a + t.b > t.c && t.a + t.c > t.b && t.b + t.c > t.a {
return nil
}
return errors.New("Triangle is not valid")
}
func (t *Triangle) perimeter() (float64, error) {
err := t.valid()
if err != nil {
return -1, err
}
return t.a + t.b + t.c, nil
}
func (t *Triangle) square() (float64, error) {
p, err := t.perimeter()
if err != nil {
return -1, err
}
p /= 2
s := p * (p - t.a) * (p - t.b) * (p - t.c)
return math.Sqrt(s), nil
}
我们有一个完整的 工作示例。
请注意,它看起来非常像对象的方法。
这里详细解释了它们 - https://anil.cloud/2017/01/26/golang-functions-methods-simplified/
Go语言中的函数遵循以下语法:
func FunctionName(Parameters...) ReturnTypes...
例子:
func add(x int, y int) int
执行:
add(2,3)
方法类似于函数,但附加在类型上(称为接收器)。官方指南中指出:“方法是带有特殊接收器参数的函数”。接收器出现在func关键字和方法名称之间。方法的语法如下:
func (t ReceiverType) FunctionName(Parameters...) ReturnTypes...
例子:
func (t MyType) add(int x, int y) int
执行:
type MyType string
t1 := MyType("sample")
t1.add(1,2)
func FunctionName(*Pointers...,Parameters...) ReturnTypes...
示例
func add(t *MyType, x int, y int) int
执行:
type MyType string
t1 := MyType("sample")
add(&t1,4,5)
(译注:此处为原文内容,请勿删除)
func (*Pointer) FunctionName(Parameters...) ReturnTypes...
例子
func (t *MyType) add(x int, y int) int
要执行:
type MyType string
t1 := MyType("sample")
t1.add(2,3)
以上答案对我来说很好。除此之外,我还想补充一点。
函数
是从包中调用的东西。而方法
也是一个函数,但是从特定类型的值中调用。而值
则是函数的返回值。
例如:
rightNow := time.Now()
time
--> 包,Now()
--> 函数,因为它是由一个包调用的,rightNow
是从Now()函数返回的type
为time.Time的value
。
year := rightNow.Year()
rightNow
--> 值,Year()
--> 函数
,但由于它是由某个类型
(这里是time.Time)的值
调用的,因此它被称为方法
。为了方便识别,方法具有与其调用的相同类型的接收器。
Go方法与Go函数类似,唯一的区别在于方法中包含一个接收器参数。通过接收器参数,方法可以访问接收器的属性。这里,接收器可以是结构类型或非结构类型。
func(reciver_name Type) method_name(parameter_list)(return_type){
// Code
}