• 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("试试能不能调用成功")
    }
  • 相关阅读:
    Bootstrap学习笔记
    鼠标画矩形openCV
    开关openCV
    openCV图像形态学
    Android自定义ListView的Item无法响应OnItemClick的解决办法
    0-1背包问题
    java实现矩阵连乘的动态规划
    java 实现排序
    微信小程序--箭头表达式
    微信小程序--navigator url 跳转失效
  • 原文地址:https://www.cnblogs.com/luohuayu/p/9173434.html
Copyright © 2020-2023  润新知