go 语言入门03--面向对象

1. 结构体

  1. 定义一个结构体
type Cat struct {
	Name  string `json:"name"`
	Age   int	`json:"age"`
	Color string `json:"color"`
}
  1. 使用结构体, 当声明一个结构体时, 它对应的内存空间已存在
	// 使用1
	var cat Cat
	cat.Name = "xx"
	cat.Age = 2
	cat.Color = "witer"
	
	// 使用2(这种更好用哦)
	cat1 := Cat{
		Name : "XXX",
		Age : 5,
	}
	
	
	// 使用3
	// new 返回一个结构体指针
	cat2 := new(Cat)
	// 这种用法, 给字段赋值时, 标准的写法如下
	(*cat2).Age = 3
	// 但也可以直接写成下面的样子, 原因在于为了方便程序员开发, go 的底层会自动将 cat2 作取值操作
	cat2.Name = "QQ"
	
	// 使用4
	cat3 := &Cat{}
  1. 结构体变量是值类型(这个跟java中的对象完全不同); 想达到跟java一样的引用传递需要借助指针
  2. 结构体中的: 指针, 切片, map 字段, 必须先 make, 才能使用

2. 方法

  1. 方法作用在特定数据类型上
  2. 自定义类型, 都可以有方法, 不仅仅是 struct
  3. 方法定义
func (recevier type) methodName(参数列表) (返回值列表) {
	
}


案例:
func testCall() {
	cat := Cat{}
	cat.Name = "tom"

	cat.call()
}

func (cat Cat) call() {
	fmt.Println("My name is ", cat.Name)
}

  1. 方法调用时, 结构体依然遵循值传递原则
  2. 如果希望在方法中修改结构体变量的值, 应该使用结构体指针作为绑定类型
func testCall() {
	cat := Cat{}
	cat.Name = "tom"

	// 等价于 cat.call() 因为编译器底层作了优化
	(&cat).call()
	fmt.Println(cat)
}

func (cat *Cat) call() {
	cat.Age = 5
	fmt.Println("My name is ", cat.Name)
}

  1. 如果一个变量实现 String(), 类似 java 中的 toString()
  2. 一个方法, 调用对象到底是值传递还是引用传递, 完全取决于方法的绑定列表绑定的是类型(值传递), 还是指针(引用传递)

你可能感兴趣的:(go 语言入门03--面向对象)