Go- 接口 -2
发布于: 3 小时前
Go 学习笔记,学习内容《Go入门指南》
主要介绍以下内容:
方法集和接口的使用
接口的应用-排序
空接口类型简单使用
利用空接口构建通用类型
赋值数据切片到空接口切片
接口变量类型转换
代码示例可以直接运行
package main
import (
"fmt"
)
func printDivider(str ...string) {
fmt.Println()
fmt.Println("-----------------------------------------------")
if len(str) > 0 {
fmt.Println(str)
}
}
/*-----------------------------------------------------------------------*/
type List []int // List类型实现了Appender和Lener接口
func (l List) Len() int { // l是值
return len(l)
}
func (l *List) Append(val int) { // l是指针
*l = append(*l, val)
}
type Appender interface {
Append(int) // 定义一个方法,List类型实现了该方法,可以对该接口进行赋值
}
func CountInfo(a Appender, start, end int) { // 函数第一个参数是接口类型,a 变量可以当做List类型使用
for i := start; i <= end; i++ {
a.Append(i) // 因为方法Append定义在指针l上,所以a变量在传值的时候必须是个指针
}
}
type Lener interface {
Len() int
}
func LongEnough(l Lener) bool {
return l.Len()*10 > 42 // 这里虽然Len方法定义在值l上,但是因为指针会被自动解引用,所以这里传参的受
}
/*-----------------------------------------------------------------------*/
func Sort(data Sorter) {
for pass := 1; pass < data.Len(); pass++ {
for i := 0; i < data.Len()-pass; i++ {
if data.Less(i+1, i) {
data.Swap(i+1, i)
}
}
}
}
type Sorter interface {
Len() int
Less(i, j int) bool
Swap(i, j int)
}
type IntArray []int
func (p IntArray) Len() int { return len(p) }
func (p IntArray) Less(i, j int) bool { return p[i] < p[j] }
func (p IntArray) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
/*-----------------------------------------------------------------------*/
type Any interface{} // 空接口类型
type Person struct {
name string
age int
}
/*-----------------------------------------------------------------------*/
type Element interface{}
type Vector struct {
a []Element // a是一个数组,数组里的元素可以为任何类型,因为每个类型都实现了空接口
}
func (v *Vector) At(i int) Element {
return v.a[i]
}
func (v *Vector) Set(i int, e Element) {
v.a[i] = e
}
/*-----------------------------------------------------------------------*/
func main() {
/*
方法集和接口的使用
*/
printDivider("方法集和接口的使用")
var lst List
/*
调用CountInfo产生一个编译错误:
cannot use lst (type List) as type Appender in argument to CountInfo:
List does not implement Appender (Append method has pointer receiver)
即:第一个参数必须是一个指针类型,因为Append方法是定义在指针上的
*/
//CountInfo(lst, 1, 10)
if LongEnough(lst) {
fmt.Println("lst is long enough\n")
}
plst := new(List)
CountInfo(plst, 1, 10)
if LongEnough(lst) {
fmt.Println("lst is long enough\n")
}
/*
接口的应用-排序
*/
printDivider("接口的应用-排序")
data := []int{10, 80, 20, 40, 30, 60}
Sort(IntArray(data))
fmt.Println(data) // 输出:[10 20 30 40 60 80]
/*
空接口类型简单使用
*/
printDivider("空接口类型简单使用")
var x Any
x = 4
fmt.Printf("x has the value: %v\n", x) // 输出:x has the value: 4
x = "Hello"
fmt.Printf("x has the value: %v\n", x) // 输出:x has the value: Hello
pers1 := new(Person)
pers1.name = "Marry"
pers1.age = 27
x = pers1
fmt.Printf("x has the value: %v\n", x) // 输出:x has the value: &{Marry 27}
/*
利用空接口构建通用类型
*/
printDivider("利用空接口构建通用类型")
v1 := new(Vector)
v1.a = []Element{1, "Go", false}
fmt.Println(v1.At(1)) // 输出:Go
fmt.Println(v1.At(2)) // 输出:false
/*
赋值数据切片到空接口切片
必须利用循环一个一个切片,不能直接赋值
*/
/*
接口变量类型转换
接口变量和普通变量只要底层类型支持,接口变量和普通变量可以进行类型转换
*/
}
复制代码
划线
评论
复制
发布于: 3 小时前阅读数: 3
版权声明: 本文为 InfoQ 作者【HelloBug】的原创文章。
原文链接:【http://xie.infoq.cn/article/d7e5d289f5f786cc6d7d4570c】。
本文遵守【CC BY-NC-ND】协议,转载请保留原文出处及本版权声明。
HelloBug
关注
还未添加个人签名 2018.09.20 加入
还未添加个人简介
评论