这是我参与「掘金日新计划 · 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())
}