GO语言的"类"操作

转载 2015年11月19日 10:44:00
当发现go语言没有类时,小伙伴都震惊了,但是如果你要保证好的代码结构与内部逻辑组织结构,类这种模式貌似又是不可或缺的
那么问题来了,go语言有没有办法来模拟类操作呢?答案是肯定的

首先我们来看go语言struct数据类型
type Godeye struct {  
    name string  
    age int  
}
初始化
p := Godeye{"godeye", 28}  //有序  
p := Godeye{age:28}        //无序

最有意思的是,struct可以增加关联函数
func funcName(varName1 typeName2[,varName2 typeName2, ...]) typeName {...}
例子
func (this Godeye) Test(area string) string {
    return *this.name + area
}
其中Godeye就是对应的Godeye struct而this.name就是Godeye中的name

有没有发现,和类何其的相似,在一个go文件里,可以定义一个struct,name age相当于类里的变量
Test相当于类里的方法

但是光模拟是没有用的,我们该怎么调用呢?
类调用很简单,直接用classname->Test()直接调用类对应的方法
go语言就不同,甚至可以说复杂多,首先你要先理解reflect反射的概念,其次还要熟悉interface,再次还要理解new make是怎么运作的

reflect反射:调用的关键
反射就是动态运行时的状态。对应的包是reflect包
i在这里是一个struct,转化为reflect对象
t := reflect.TypeOf(i)    //得到类型的元数据,通过t我们能获取类型定义里面的所有元素
v := reflect.ValueOf(i)   //得到实际的值,通过v我们获取存储在里面的值,还可以去改变值
转化为reflect对象之后我们就可以进行一些操作了,也就是将reflect对象转化成相应的值,例如
tag := t.Elem().Field(0).Tag        //获取定义在struct里面的标签
name := v.Elem().Field(0).String()  //获取存储在第一个字段里面的值

interface:函数的参数
简单的说,interface是一组method的组合,我们通过interface来定义对象的一组行为
我们可以通过定义interface参数,让函数接受各种类型的参数

还是用一个可运行的完整例子来说明:
1.新建一个main.go
package main

import (
    "./action"
    "fmt"
    "log"
    "net/http"
    "net/url"
    "reflect"
)

func main() {
    http.HandleFunc("/index", do)
    err := http.ListenAndServe(":8080", nil)
    if err != nil {
            log.Fatal("listenAndServer: ", err)
    }
}

func do(w http.ResponseWriter, r *http.Request) {
    r.ParseForm()
    m, a := r.PostFormValue("m"), r.PostFormValue("a")
    queryForm, err := url.ParseQuery(r.URL.RawQuery)
    if err == nil && len(queryForm["m"]) > 0 {
        m = queryForm["m"][0]
    }
    if err == nil && len(queryForm["a"]) > 0 {
        a = queryForm["a"][0]
    }

    //创建实例
    conf := action.Conf{}
    conf.Op = &m

    //值信息
    v := reflect.ValueOf(conf)
    callMethod(&v, m, []interface{}{a})
}

func callMethod(v *reflect.Value, method string, params []interface{}) {
    //字符串方法调用,且能找到实例属性.Op
    f := (*v).MethodByName(method)
    if f.IsValid() {
        args := make([]reflect.Value, len(params))
        for k, param := range params {
            args[k] = reflect.ValueOf(param)
        }
        //调用
        ret := f.Call(args)
        if ret[0].Kind() == reflect.String {
            fmt.Printf("%s Call result: %s\n", method, ret[0].String())
        }
    } else {
        fmt.Println("can't call " + method)
    }
}


2.在main.go的同一级目录创建action文件夹,里面加入action.go文件
package action

type Conf struct {
    Op       *string `json:"jsonop" xml:"xmlOpName"`
}

func (this Conf) Test(name string) string {
    return *this.Op + name
}

3.编译运行,然后浏览器输入 http://localhost:8080/index?m=Test&a=b

查看输出结果


转载自:http://www.godeye.org/lesson/114

go语言操作mysql范例(增删查改)

1 go语言连接mysql简介 go官方仅提供了database package,database package下有两个包sql,sql/driver。这两个包用来定义操作数据库的接口,这就保证了...
  • JesseYoung
  • JesseYoung
  • 2014年10月23日 15:27
  • 12984

Go语言学习(四)常用类型介绍

1.布尔类型var v1 bool v1 = true; v2 := (1==2) // v2也会被推导为bool类型 2.整型类 型 长度(字节) 值 范 围 int8 1  ...
  • mChenys
  • mChenys
  • 2016年03月26日 14:28
  • 3030

go-操作oracle数据库

1. linux oracle  安装 centos7.2 64位 1.oracle-instantclient12.1-basic-12.1.0.2.0-1.x86_64.rpm 2.orac...
  • kikijuju
  • kikijuju
  • 2017年02月14日 15:32
  • 278

Go语言操作Redis

Redis的Go语言驱动已经很成熟了.弄个例子。
  • xcltapestry
  • xcltapestry
  • 2015年03月05日 22:17
  • 2751

Go 语言读写 Excel

Excelize 是 Golang 编写的一个用来操作 Office Excel 文档类库,基于 ECMA-376 Office OpenXML 标准。可以使用它来读取、写入 XLSX 文件。相比较其...
  • m96000000
  • m96000000
  • 2016年12月23日 18:57
  • 1063

Go语言操作PostgreSQL数据库——学习笔记

Go实现的支持PostgreSQL的驱动有很多,但是github.com/lib/pq是目前使用最广泛的,也是最稳定的一个Go语言实现的PostgreSQL驱动。这里,我就使用github.com/l...
  • MyPC2010
  • MyPC2010
  • 2017年07月14日 15:00
  • 515

Go语言·听说你想让程序运行的更快?

作者:孙飞撩技术链接:https://www.jianshu.com/p/0db174aebfec來源:简书共 11254 字,阅读需 28 分钟迁移自CSDN: http://blog.csdn.n...
  • webxscan
  • webxscan
  • 2018年01月02日 14:27
  • 162

Go语言基础学习五-一些数值操作的简单例子

Go语言基础学习5-一些数值操作的简单例子 实现一个网页,在网页上具有数值统计的功能。该数值统计的功能主要是1.将切片排序 2.计算切片的平均数 3.计算切片的中位数 我们先大致知道这个例子我们需要学...
  • qq_21898173
  • qq_21898173
  • 2017年03月28日 15:42
  • 341

Go语言的类型结构

类型系统 Go并没有Java语言那样的面向对象的思想和体系。更多的是类型,结构。每一种结构都是一个类型。对每一个结构来说,又可以分成两种类型,原来的值语义上的结构类型、以及这种结构的指针类型。 ...
  • simplelovecs
  • simplelovecs
  • 2016年04月09日 22:11
  • 1050

go语言json操作指南

package mainimport ( "encoding/json" "fmt" "os" )type ConfigStruct struct { Host ...
  • guoer9973
  • guoer9973
  • 2016年07月27日 17:01
  • 676
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:GO语言的"类"操作
举报原因:
原因补充:

(最多只允许输入30个字)