Golang变量内置pair结构详细说明
- 变量包括(type, value)两部分
- type 包括 static type和concrete type. 简单来说 static type是你在编码是看见的类型(如int、string),concrete type是runtime系统看见的类型
- 类型断言能否成功,取决于变量的concrete type,而不是static type. 因此,一个 reader变量如果它的concrete type也实现了write方法的话,它也可以被类型断言为writer.
value是实际变量值,type是实际变量的类型。一个interface{}类型的变量包含了2个指针,一个指针指向值的类型【对应concrete type】,另外一个指针指向实际的值【对应value】。
type: static || concrete 要么是静态类型,要么是具体类型
pair = type + value
package mainimport "fmt"type Reader interface {ReadBook()
}type Writer interface {WriterBook()
}// 具体类型-结构体
type BookOne struct {
}// 重写ReadBook
func (this *BookOne) ReadBook() {fmt.Println("Read a Book")
}
// 重写WriterBook
func (this *BookOne) WriterBook() {fmt.Println("Writer a Book")
}func main() {// ================================================================================//var a string pair<static type, value:"zhangsan">//a = "zhangsan"//var allType interface{}////allType = a//str,_ := allType.(string)//fmt.Println(allType)//fmt.Println(str)// ================================================================================ 1.打开文件流 tty: pair<type:*os.File, value:"/Users/a1234/Desktop/test/test.docx"文件描述符>//tty, err := os.OpenFile("/Users/a1234/Desktop/test/test.txt", os.O_RDWR, 0)//if err != nil {// fmt.Println("open file error", err)// return//}// 2.读取文件 r: pair<type: , value: >//var r io.Reader r: pair<type:*os.File, value:"/Users/a1234/Desktop/test/test.docx"文件描述符>//r = tty// 3.写入文件 w: pair<type: , value: >//var w io.Writer w: pair<type:*os.File, value:"/Users/a1234/Desktop/test/test.docx"文件描述符>//w = r.(io.Writer)////w.Write([]byte("w: pair<type:*os.File, value:\"/Users/a1234/Desktop/test/test.docx\"文件描述符>"))// ================================================================================// b: pair<type:BookOne, value:BookOne{}地址>b := &BookOne{}// b: pair<type: , value: >var r Reader// r: pair<type:BookOne, value:BookOne{}地址>r = br.ReadBook()var w Writer// r: pair<type:BookOne, value:BookOne{}地址>w = r.(Writer)// r.(Writer)断言为什么会成功,因为w r具体的type是一致的w.WriterBook()
}