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 main
import "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 = b
r.ReadBook()
var w Writer
// r: pair<type:BookOne, value:BookOne{}地址>
w = r.(Writer)// r.(Writer)断言为什么会成功,因为w r具体的type是一致的
w.WriterBook()
}