go语言学习笔记(5)--面向对象

一、 go语言中的类与对象

package mian

import (
   "fmt"
)

//面向对象
//面向对象首先写一个类,但是go里面没有类,只有struct
//方法不写在结构体中,写在全局,在方法名前面传入对象, 做值传递,真的很神奇。这种写法,第一次见,长见识了
type Node struct{
   value int;
   l,r *Node;
}//好了,这并不陌生,这是一个结构体,go语言里面没有class


func createNode(value int) *Node{
   return &Node{value:value};
}

func (node *Node) setValues(value int)  { //这个相当于是node的方法,前面的是值传递,如果不用指针,那么就是复制一份拷贝,
                                 //根本不会发生改变,注意的是就算用指针,调用的时候也不用取地址,
  
node.value = value
}
//如上写就可以:对象.setValues(values)。这种调用方法。

func visitBefore(root *Node)  { //树的前序遍历
  
if root == nil {
      return ;
   }
   fmt.Println(root.value)
   visitBefore(root.l)
   visitBefore(root.r)
}


func main() {
   //新建节点
  
var root Node;
   root = Node{value:3} //这样指定了其他参数就默认为zero value
  
root.l = &Node{6,nil,nil}//因为是指针
  
root.r = &Node{}
   root.r.l = new(Node) // new 一个结构体相当于也是新建一个结构体变量
  
root.l.r = createNode(5) //因为是指针,所以返回的记过需要是一个指针
   //          3
   //    6           0
   //       5           0
   //
  
root.r.l.setValues(4) //把右下角改成4
  
visitBefore(&root)

   nodes := []Node{
      Node{value:3},
      Node{3,nil,nil},
      {},
   }//建立一个node数组
  
fmt.Println(nodes) //[{3 <nil> <nil>} {3 <nil> <nil>} {0 <nil> <nil>}]
}

二、 go语言中的“继承”

package mian

import "fmt"

//go语言的“继承”,go 语言是没有继承的,知识模拟继承,为了实现其他面向对象语言的继承特点,
//在go语言中采用组合和或者取别名的方式来实现继承的特点。
type Go struct {
   v int; //好了这是一个类
}

//下面通过组合来实现继承
type GoChlid struct { //这样就可以对原来的类型进行一个扩充
  
go_ *Go //这里可以不用指针也没关系
  
gogo Go //另个组合,都拥有v这个成员
}
//这里要提出来,对于go语言中的封装,变量名首字母小写表示私有(private),变量名大写表示公有(public)

type GoCC Go //这样相当于给go去了个别名

func (g *GoCC)fun() int{
   return g.v //别名加一个方法
}

func main() {
   g := Go{1}
   a := g.v
   fmt.Println(a)

}

三、 go语言面向对象

看下目录结构

package main

import (
   "../forclass"
   "fmt"
)

func main() {
   c := forclass.Class{1,2} //完美的面向对象
  
c.Print()
   c.SetV(2)
   fmt.Println(c.GetV())
   //c.test() //很明显,这个包里面是访问不到首字母小写的
}
package forclass

import "fmt"

type Class struct {
   V int //这个变量小写的话,构造对象的时候就会报错,应为不能被访问到
  
C int
}

func (c *Class)SetV(v int) {
   c.V = v
}

func (c *Class)GetV() int {
   return c.V
}

func (c *Class)Print()  {
   //c.test() //类内部访问完全没有问题!
  
fmt.Println(c.V)
}

func (c *Class)test()  {
   fmt.Println("试试能不能调用成功")
}

猜你喜欢

转载自www.cnblogs.com/luohuayu/p/9173434.html