在Go语言中,允许在同一包中创建两个或多个具有相同名称的方法,但是这些方法的接收者必须具有不同的类型。该功能在Go函数中不可用,这意味着不允许您在同一包中创建相同名称的方法,如果尝试这样做,则编译器将抛出错误。
语法:
func(reciver_name_1 Type) method_name(parameter_list)(return_type){ // Code } func(reciver_name_2 Type) method_name(parameter_list)(return_type){ // Code }
让我们借助示例来讨论这个概念:
范例1:
package main import "fmt" //创建结构体 type student struct { name string branch string } type teacher struct { language string marks int } //名称相同的方法,但有不同类型的接收器 func (s student) show() { fmt.Println("学生姓名:", s.name) fmt.Println("Branch: ", s.branch) } func (t teacher) show() { fmt.Println("Language:", t.language) fmt.Println("Student Marks: ", t.marks) } func main() { // 初始化结构体的值 val1 := student{"Rohit", "EEE"} val2 := teacher{"Java", 50} //调用方法 val1.show() val2.show() }
输出:
学生姓名: Rohit Branch: EEE Language: Java Student Marks: 50
用法说明:在上面的示例中,我们有两个相同的名称方法,即show(),但接收器的类型不同。这里,第一个show()方法包含s student类型的接收者,第二个show()方法包含t teacher类型的接收者。在main()函数中,我们借助各自的结构体变量来调用这两种方法。如果尝试使用相同类型的接收器创建此show()方法,则编译器将抛出错误。
范例2:
//创建相同名称的方法 //非结构类型的接收器 package main import "fmt" type value_1 string type value_2 int //创建具有相同名称的函数 //不同类型的非结构接收器 func (a value_1) display() value_1 { return a + ".com" } func (p value_2) display() value_2 { return p + 298 } func main() { //初始化值 res1 := value_1("nhooo") res2 := value_2(234) // 打印显示结果 fmt.Println("Result 1: ", res1.display()) fmt.Println("Result 2: ", res2.display()) }
输出:
Result 1: (528045.com) Result 2: 532