【Golang学习笔记】入门:结构体、方法与接口
一、结构体struct
Golang作为一门面向过程的语言,没有类的概念;但为了面向对象开发,设计有结构体struct这一数据类型。
结构体是复合类型,当需要定义类型,它由一系列属性组成,每个属性都有自己的类型和值的时候,就应该使用结构体,它把数据聚集在一起。
组成结构体类型的那些数据成为字段(fields)。每个字段都有一个类型和一个名字;在一个结构体中,字段名字必须是唯一的。
type 结构体名 struct {
字段1 类型
字段2 类型
}
声明和初始化
结构体但声明和初始化,有以下形式:
- 使用var关键字
- 使用new函数
- 使用字面量
// 1. 使用var关键字
var s T
s.a = 1
s.b = 2
// 2.使用new函数
type people struct {
name string
age int
}
func main() {
ming := new(people)
ming.name = "xiao ming"
ming.age = 18
}
// 3.使用字面量
type people struct {
name string
age int
}
func main() {
ming := &people{"xiao ming", 18}
}
第一种形式返回但是实例但结构类型,后两种返回的是指向这个结构类型的一个指针。
后两种形式下,修改值的方式是先*
取值再修改:
(*ming).name = "xiao hong"
但Golang中可以直接如此修改,但是要记住其本质是指针取值再修改:
ming.name = "xiao hong"
二、方法
方法是类的方法,函数是大家的函数。
Go 不是面向对象的语言,而我们知道常见的 Java、C++ 等面向对象编程的语言中,实现类的方法的做法都是编译器隐式的给函数加一个 this 指针,而在 Go 里,这个 this 指针需要明确的申明出来,其实和其它 OO 语言并没有很大的区别。
在C++中,
class Circle {
public:
float getArea() {
return 3.14 * radius * radius;
}
private:
float radius;
}
// 其中 getArea 经过编译器处理大致变为
float getArea(Circle *const c) {
...
}
在Go中,
func (c Circle) getArea() float64 {
//c.radius 即为 Circle 类型对象中的属性
return 3.14 * c.radius * c.radius
}