func
通过下面的语法创建一个方法:
func (t Type) methodName(parameter list) { }
methodNameType
例子
让我们编写一个简单的程序,它创建一个结构体类型的方法并调用它。
package main import ( "fmt" ) type Employee struct { name string salary int currency string } /* displaySalary() method has Employee as the receiver type */ func (e Employee) displaySalary() { fmt.Printf("Salary of %s is %s%d", e.name, e.currency, e.salary) } func main() { emp1 := Employee { name: "Sam Adolf", salary: 5000, currency: "$", } emp1.displaySalary() //Calling displaySalary() method of Employee type }
EmployeedisplaySalarydisplaySalary()eEmployeeenamecurrencysalary
emp1.displaySalary()
Salary of Sam Adolf is $5000
为什么使用方法而不是函数?
上面的程序可以使用函数而不是方法重写如下
package main import ( "fmt" ) type Employee struct { name string salary int currency string } /* displaySalary() method converted to function with Employee as parameter */ func displaySalary(e Employee) { fmt.Printf("Salary of %s is %s%d", e.name, e.currency, e.salary) } func main() { emp1 := Employee{ name: "Sam Adolf", salary: 5000, currency: "$", } displaySalary(emp1) }
displaySalaryEmployeeSalary of Sam Adolf is $5000
为什么使用方法而不是函数?
上面的程序可以使用函数而不是方法重写如下:
package main import ( "fmt" ) type Employee struct { name string salary int currency string } /* displaySalary() method converted to function with Employee as parameter */ func displaySalary(e Employee) { fmt.Printf("Salary of %s is %s%d", e.name, e.currency, e.salary) } func main() { emp1 := Employee{ name: "Sam Adolf", salary: 5000, currency: "$", } displaySalary(emp1) }
displaySalaryEmployeeSalary of Sam Adolf is $5000
那么为什么我们可以用函数完成同样的工作,却还要使用方法呢?这里有几个原因,我们一个一个地看。
SquareCircleSquareCircle
package main import ( "fmt" "math" ) type Rectangle struct { length int width int } type Circle struct { radius float64 } func (r Rectangle) Area() int { return r.length * r.width } func (c Circle) Area() float64 { return math.Pi * c.radius * c.radius } func main() { r := Rectangle{ length: 10, 5, } fmt.Printf("Area of rectangle %d ", r.Area()) c := Circle{ radius: 12, } fmt.Printf("Area of circle %f", c.Area()) }
程序的输出为:
Area of rectangle 50 Area of circle 452.389342定义非结构体类型的方法
现在我们定义的都是结构体类型的方法。同样可以定义非结构体类型的方法,不过这里需要注意一点。为了定义某个类型的方法,接收者类型的定义与方法的定义必须在同一个包中。目前为止,我们定义的结构体和相应的方法都是在main包中的,因此没有任何问题。
package main func (a int) add(b int) { } func main() { }
addintaddintcannot define new methods on non-local type int
使其工作的方法为定义内置类型的别名,然后以这个新类型为接收者创建方法。
package main import "fmt" type myInt int func (a myInt) add(b myInt) myInt { return a + b } func main() { num1 := myInt(5) num2 := myInt(10) sum := num1.add(num2) fmt.Println("Sum is", sum) }
intmyIntaddmyInt
Sum is 15