Go语言基础
介绍
基础
介绍
- 本文介绍Go语言中方法定义、方法调用、String方法、结构体嵌套方法调用、方法初始化变量、接口定义、接口声明、接口变量赋值、接口的嵌套、类型断言、匿名接口与空接口等相关知识。
基础
方法
- 方法是对类型定义的,且只能由该类型调用的函数。
- 通过 type 自定义类型(结构体或任何自定义的类型),可对此类型定义方法。* 方法具有特定接收者(附加的类型),接收者可以是指针或值类型。
- 函数不属于任何类型,方法指定特定的接收者类型。
// 方法的一般格式
func (t *T或T) MethodName(参数列表) (返回值列表) {// 方法体
}
方法定义
- 方法必须是自定义类型,Go语言内置类型不支持用户对此类型拓展方法,使用 type 对内置类型自定义别名,自定义后的别名可以定义方法。
- 方法声明要与接收者参数的基类型声明放在同一个包内。
type Cpu struct {Name stringId int
}// 接收者为值类型
func (c Cpu) GetName() string {return c.Name
}func (c Cpu) GetId() int {return c.Id
}// 接收者为指针类型
func (c *Cpu) PGetName() string {return c.Name
}func (c *Cpu) PGetId() int {return c.Id
}
方法调用
- 定义类型对象,调用类型方法时使用其对象调用。
- 指针类型对象,调用接收者为值类型方法时,Go 编译器会自动将指针对象解引用为值调用方法。
- 值类型对象,调用接收者为指针类型方法时,Go 编译器会自动将值对象取引用为指针调用方法。
- 实际使用时若存在指针接收者,则所有方法使用指针接收者,否则都是用值接收者。
- 接收者为指针类型的方法,运行时必须确保接收者不为 nil。
package mainimport "fmt"type Cpu struct {Name stringId int
}func (c Cpu) GetName() string {return c.Name
}func (c Cpu) GetId() int {return c.Id
}func (c *Cpu) PGetName() string {return c.Name
}func (c *Cpu) PGetId() int {return c.Id
}func main() {// 定义结构体对象cpu := Cpu{"Intel",10001,}fmt.Print("Name = ", (&cpu).PGetName()) // 常用写法 cpu.PPGetName()fmt.Println(", Id = ", cpu.GetId())// 定义结构体对象指针cpu2 := &Cpu{"AMD",10002,}// 两种方式均可调用fmt.Print("Name = ", (*cpu2).GetName())fmt.Println(", Id = ", cpu2.PGetId())
}
输出结果
Name = Intel, Id = 10001
Name = AMD, Id = 10002
String方法
- 对于自定义结构体类型,通过实现 String 方法,就能调用 fmt.Println 函数输出结构体信息。
package mainimport "fmt"type Cpu struct {Name stringId int
}func main() {// 定义结构体对象cpu := Cpu{"Intel",10001,}fmt.Print(&cpu)
}func (c *Cpu) String() string {ret := fmt.Sprintf("Name = %v, Age = %v", c.Name, c.Id)return ret
}
输出结果
Name = Intel, Age = 10001
结构体嵌套方法调用
- 结构体嵌套有两种方式,匿名嵌套与命名嵌套。
- 命名嵌套时,通过嵌套结构体的对象可以调用嵌套结构体的方法。
- 匿名嵌套时,通过被嵌套结构体的对象可直接调用嵌套结构体的方法&