ch7/ch7-10 #181
Replies: 4 comments 3 replies
-
以下解释来自chatgpt:当我们使用一个接口类型的变量时,变量的值会被分为两个部分:动态类型和动态值。动态类型指的是变量实际所持有的值的类型,而动态值指的是变量实际所持有的值本身。在类型断言中,我们需要检查一个变量的动态类型是否符合某个特定的类型,如果符合,我们就可以使用类型断言后的变量来访问该类型的方法或属性。 如果我们使用类型断言将一个接口类型转换为一个具体类型,那么类型断言会从变量的动态值中提取具体的值,并将其转换为所需的类型。这意味着我们可以直接使用类型断言后的变量来访问该类型的方法或属性,因为变量的动态值已经是具体类型了。 如果我们使用类型断言将一个接口类型转换为另一个接口类型,那么类型断言并不会从变量的动态值中提取具体的值,而是保留了原始变量的动态类型和动态值。这意味着我们可以使用类型断言后的变量来访问新的接口类型的方法或属性,但是变量的动态值仍然是原始类型的值。 |
Beta Was this translation helpful? Give feedback.
-
|
哪位大神能翻译一下从”第二种“开始的部分,完全看不懂 |
Beta Was this translation helpful? Give feedback.
-
|
var w io.Writer = os.Stdout 这段代码想表达什么 GPT的回答: |
Beta Was this translation helpful? Give feedback.
-
Go语言里的类型断言:到底是个啥?想象一下,接口(interface)就像一个贴着标签的盒子。 玩法一:断言为具体类型(把东西从盒子里拿出来)这是最常见的情况。你确信盒子里装的是某个具体的东西,想把它直接拿出来用。
var w io.Writer // w 是一个“能写字”的盒子
w = os.Stdout // 往盒子里放了一个文件(标准输出)
// 我断定盒子里是 *os.File 类型的文件!
f := w.(*os.File) // 成功!f 现在就是 *os.File 类型,可以用 f.Name() 等方法了
// 我断定盒子里是 *bytes.Buffer 类型的内存缓冲区!
b := w.(*bytes.Buffer) // Panic!崩溃!盒子里明明是文件,不是缓冲区玩法二:断言为接口类型(给盒子换个更厉害的标签)有时候,你不想把东西拿出来,只是想给它换个标签,让它看起来功能更强。
var w io.Writer // w 是一个“能写字”的盒子
w = os.Stdout // 里面放了一个文件(文件既能读又能写)
// 我给盒子换个标签,从“能写字”换成“既能读又能写”
rw := w.(io.ReadWriter) // 成功!因为文件确实能读能写。现在 rw 可以用 Read() 方法了
// 假设 ByteCounter 是一个只能写、不能读的东西
w = new(ByteCounter)
rw = w.(io.ReadWriter) // Panic!崩溃!ByteCounter 不会读,不满足新标签的要求如何安全地玩?避免崩溃!直接断言就像赌博,猜错了就崩溃。实际开发中,我们更常用一种“温柔”的方式,叫做 “comma, ok” 模式。
var w io.Writer = os.Stdout
// 温柔地问:w 里面是 *os.File 吗?
if f, ok := w.(*os.File); ok {
// ok 是 true,说明猜对了!
// 在这里可以放心地用 f 这个 *os.File 变量了
fmt.Println("成功拿到文件:", f.Name())
} else {
// ok 是 false,说明猜错了
fmt.Println("里面不是 *os.File")
}
// 再问一次:w 里面是 *bytes.Buffer 吗?
if b, ok := w.(*bytes.Buffer); ok {
// 这段代码不会执行,因为 w 里面不是 Buffer
fmt.Println("成功拿到缓冲区:", b.String())
} else {
// ok 是 false
fmt.Println("里面不是 *bytes.Buffer")
}总结一下
以上内容由AI生成,仅供参考和借鉴 |
Beta Was this translation helpful? Give feedback.
Uh oh!
There was an error while loading. Please reload this page.
-
ch7/ch7-10
中文版
https://golang-china.github.io/gopl-zh/ch7/ch7-10.html
Beta Was this translation helpful? Give feedback.
All reactions