go语言中interface实现泛型编程

package main

import (
“fmt”
“reflect”
)

type GenericSlice struct {
elemType reflect.Type
sliceValue reflect.Value
}

func (self *GenericSlice) Init(sample interface{}) {
value := reflect.ValueOf(sample)
self.sliceValue = reflect.MakeSlice(value.Type(), 0, 0)
self.elemType = reflect.TypeOf(sample).Elem()
}

func (self *GenericSlice) Append(e interface{}) bool {
if reflect.TypeOf(e) != self.elemType {
return false
}
self.sliceValue = reflect.Append(self.sliceValue, reflect.ValueOf(e))
return true
}

func (self *GenericSlice) ElemType() reflect.Type {
return self.elemType
}

func (self *GenericSlice) Interface() interface{} {
return self.sliceValue.Interface()
}

func main() {
gs := GenericSlice{}
gs.Init(make([]int, 0))
fmt.Printf(“Element Type: %s\n”, gs.ElemType().Kind()) // => Element Type:int result := gs.Append(2)
fmt.Printf(“Result: %v\n”, result) // => Result: true
fmt.Printf(“sliceValue: %v\n”, gs.Interface()) // => sliceValue: [2]
}

时间: 2024-08-06 22:43:49

go语言中interface实现泛型编程的相关文章

go语言中interface的实践

package main import ( "fmt" "math" ) type geometry interface { area() float64 perim() float64 } type square struct { width, height float64 } type circle struct { radius float64 } //要在go中实现一个接口,我们只需要实现接口中的所有方法 //`square`的实现,s接收者接受了area(

C语言中void*详解及应用

void在英文中作为名词的解释为"空虚:空间:空隙":而在C语言中,void为"无类型",相应的void *为"无类型指针".void似乎只有"注释"和限制程序的作用,当然,这里的"注释"不是为我们人提供注释,而是为编译器提供一种所谓的注释. 本文地址:http://www.cnblogs.com/archimedes/p/c-void-point.html,转载请注明源地址. void的作用: 1.对函数

Java语言中extend和implement的区别

Java语言并不支持多重继承,而只能继承一个类,不过我们可以使用implements来实现多个接口. extends继承的父类:不能声明为final或者定义为abstract: implements实现接口interface,用逗号分开就好: 如:class A extends B implements C, D, E interface的引入是为了部分地提供多继承的功能. 在interface中只需声明方法头,而将方法体留给实现的class来做. 这些实现的class的实例完全可以当作inte

[转]理解Go语言中的nil

最近在油管上面看了一个视频:Understanding nil,挺有意思,这篇文章就对视频做一个归纳总结,代码示例都是来自于视频. nil是什么 相信写过Golang的程序员对下面一段代码是非常非常熟悉的了: if err != nil { // do something.... } 当出现不等于nil的时候,说明出现某些错误了,需要我们对这个错误进行一些处理,而如果等于nil说明运行正常.那什么是nil呢?查一下词典可以知道,nil的意思是无,或者是零值.零值,zero value,是不是有点

Java语言中的Class类

基本概念 在Object类中定义了以下的方法,此方法将被所有子类继承 public final Class getClass() 这个方法的返回值类型是一个Class类,此类是Java反射的源头,是实际上所谓反射从程序的运行结果来看也很好理解,即:可以通过对象反射求出类的名称. 对象照镜子后可以得到的信息:某个类的属性.方法和构造器.某个类到底实现了哪些接口.对于每个类而言,JRE都为其保留一个不变的Class类型的对象.一个Class对象包含了特定某个结构(class.interface.en

在Swift语言中,关于Any,AnyObject,AnyClass的区别与联系

在Swift语言中,协议定义类或结构体应该遵守的变量和方法集合,如下所示,这个一个标准的协议的声明: protocol NSObjectProtocol { func isEqual(object: AnyObject?) -> Bool var hash: Int { get } var superclass: AnyClass? { get } func `self`() -> Self! func isProxy() -> Bool func isKindOfClass(aClas

GO语言中import的规则和用法

GO语言中引入包使用import,我将在本文讲解下规则和用法. 一些规则: 1.包中不能有main方法. 2.同文件夹中可以直接用方法名调用. 3.main函数建议放在package main里4.main不能调用同个目录下的其它文件中的方法. 5.还可以把包放在上级的目录中,如: /src/myFolder/foo/bar1.go #package foo /src/myFolder/foo/bar2.go #package foo /src/myFolder/foo/bar3.go #pac

Java语言中String累的总结

String类 1.Java.lang包简介 java.lang包是java内置的一个基础包,其中包含了一系列程序中经常要用到的类: 在默认情况下,每个java程序都会自动导入该包,因此无需在程序中显式地声明. 2.String类 Java语言中,字符串是String类的对象: Java语言中,String是引用数据类型: 可以通过使用String类提供的方法来完成对字符串的操作: 创建一个字符串对象之后,将不能更改构成字符串的字符: 每当更改了字符串版本时,就创建了一个新的字符串对象,并在其内

C语言中,头文件和源文件的关系(转)

简单的说其实要理解C文件与头文件(即.h)有什么不同之处,首先需要弄明白编译器的工作过程,一般说来编译器会做以下几个过程: 1.预处理阶段 2.词法与语法分析阶段 3.编译阶段,首先编译成纯汇编语句,再将之汇编成跟CPU相关的二进制码,生成各个目标文件 (.obj文件)4.连接阶段,将各个目标文件中的各段代码进行绝对地址定位,生成跟特定平台相关的可执行文件,当然,最后还可以用objcopy生成纯二进制码,也就是去掉了文件格式信息.(生成.exe文件) 编译器在编译时是以C文件为单位进行的,也就是