写点什么

Go- 接口 -2

用户头像
HelloBug
关注
发布于: 3 小时前
Go- 接口-2

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
用户头像

HelloBug

关注

还未添加个人签名 2018.09.20 加入

还未添加个人简介

评论

发布
暂无评论
Go- 接口-2