GO 中方法与函数的区别

233 阅读2分钟

这是我参与「掘金日新计划 · 8 月更文挑战」的第13天,点击查看活动详情

这篇文章记录了 GO 中方法与函数的区别以及如何使用 GO 中的方法。

在go语言中同时有函数也有方法,两者在使用和定义上不同。

函数同JS中函数功能类似,都是用于执行一个任务,区别是 Go 语言最少有个 main() 函数。在定义时要指明返回值类型。

方法是一种特殊的函数,与普通函数存在的区别是:必须再方法名称前加上一个额外的参数。此附加参数成为接收方。这个接收方可以是 命名类型或者结构体类型的一个值或者是一个指针

1、声明方法

声明方法的语法如下:首先你需要一个结构,这个结构必须存在方法的参数中。

type typeName struct {
    // struct body
}

func (variable typeName) MethodName(parameters ...) {
    // method functionality
}

可以按如下方式调用,如果尝试按平常的方式调用 MethodName 函数,则此函数将无法正常工作,因为此函数的签名表明它需要接收方。

func main() {
    t := typeName{ 1 }
    fmt.Println("Perimeter:", t.MethodName())
}

下面定义一个结构体类型和该类型的一个方法:

package main

import (
   "fmt"  
)

/* 定义结构体 */
type Sum struct {
  sum int
}

func main() {
  var count Sum
  count.sum = 10
  fmt.Println("与10求和", count.getSum()) // 20
}

//该 method 属于 Sum 类型对象中的方法
func (n Sum) getSum() int {
  //n.sum 即为 Sum 类型对象中的属性
  return n.sum + n.sum
}

2、声明其他类型的方法

不能通过属于其他包的类型来定义结构。 因此,不能在基本类型(如 string)上创建方法。

package main

import (
    "fmt"
    "strings"
)

func (s string) Upper() string {
    return strings.ToUpper(string(s))
}

func main() {
    s := string("Learning Go!")
    fmt.Println(s)
    fmt.Println(s.Upper())
}

程序报错:

.\main.go:9:6: cannot define new methods on non-local type string
.\main.go:16:15: s.Upper undefined (type string has no field or method Upper)

尽管如此,你仍然可以利用一点技巧,基于基本类型创建自定义类型,然后将其用作基本类型。例如,假设你要创建一个方法,以将字符串从小写字母转换为大写字母。 你可以按如下所示写入方法:

package main

import (
    "fmt"
    "strings"
)

type upperstring string

func (s upperstring) Upper() string {
    return strings.ToUpper(string(s))
}

func main() {
    s := upperstring("Learning Go!")
    fmt.Println(s)
    fmt.Println(s.Upper())
}