iis服务器助手广告
返回顶部
首页 > 资讯 > 精选 >Go 的“类型断言”方式背后的原因是什么?
  • 919
分享到

Go 的“类型断言”方式背后的原因是什么?

overflow 2024-02-06 07:02:16 919人浏览 薄情痞子
摘要

问题内容 我试图理解这样一个事实:golang 的类型断言仅适用于显式定义为接口类型的变量,不适用于具体类型(即“string”、“int32”)等..)。 这是一个快速而简单的代码示

问题内容

我试图理解这样一个事实:golang 的类型断言仅适用于显式定义为接口类型的变量,不适用于具体类型(即“string”、“int32”)等..)。

这是一个快速而简单的代码示例,它说明了我困惑的根本原因:

package main

import "fmt"

// here we define an interface type:
type Shape interface {
    DoubleSize() int32
}

// here we define a new type which is really just an int32:
type Rect int32

// here we make "Rect" type above comply with the "Shape" interface by implementing the methods of that interface
// and so, since the interfaces in Go are implemented implicitly, this should make the "Rect" type an implicit instance of the "Shape" interface
func (theShape Rect) DoubleSize() int32 {
    return int32(theShape) * 2
}

// this function expects its "someShape" parameter to be of "Shape" type (or "the type that quacks like "Shape" interface does))
func whateverFunction(someShape Shape) int32 {
    return someShape.DoubleSize()
}

func main() {
    var newRect = Rect(5)
    // ^^ if this is instead written as "var newRect Shape = Rect(5)" no error with type assertion happens down the line

    whateverFunction(newRect) // the function works just fine because "newRect" implicitly implements the "Shape" interface — the one that this function expects to receive.  

    // !! but type assertion doesn't work on "newRect"
    v, ok := newRect.(Shape) // error: invalid operation: newRect (variable of type Rect) is not an interface
    if !ok {
        fmt.Println("type assertion failed")
        return
    }
    fmt.Println("This is v:", v)
}
正如这个问题的标题所暗示的,我无法理解实现类型断言仅适用于接口类型背后的推理,并检查分配给显式实现该接口的变量的基础值是否是我们在内部指定的值“.(t)”断言方法。这让我觉得“类型断言”是一个无意的用词不当,意味着它适用于所有类型,但不适用于,仅适用于接口类型。

我的意思是,这个语言设计决策背后显然一定有一个原因,我认为这可能与惯用的 golang 的编写方式有关,但尽管我已经看到了关于这个问题的大量资源,他们从未具体说明原因。

对我来说有意义的原因是,如果 go 程序应该“最好(我假设,因为显式接口定义是可选的)”,用表示某些接口(行为)的所有变量编写,因此定义一个出于清晰性和可读性的目的,变量上的显式接口是有意义的。

但正如我所提到的,我从未见过任何资源具体说明为什么“类型断言”功能是如何在 go 中实现的,我希望您能帮助我澄清这种困惑。

-- upd 1 - 添加一些内容来澄清我的问题:

我认为,我的核心问题是关于原因(我不明白)类型断言仅在显式实现变量的接口时才起作用,而在隐式实现接口时则不起作用。

正如“whateverfunction”所演示的,代码确实考虑“newrect”来实现“shape”接口,或者“成为“shape”接口的实现”(否则该函数将不会不适用于该变量,但确实如此),但类型断言“.(t)”方法背后的代码将“newrect”视为“shape”接口的实现。

因此,如果 golang 中关于接口实现的考虑因素存在差异,我认为这样的设计决策背后一定有一个原因(区分)。

这就是为什么我提到到目前为止我能想到的唯一原因是这是否是一种让人们以某种​​方式编写 go 代码的方法。


正确答案


您可以查看Burak Serdar的答案 - 您可能会发现它更加简洁和有帮助。尽管如此,我还是会发布整个推理链,最终让我“点击”了它:

|-> 当我们无法确定我们期望接收的数据的确切类型时,使用接口(因为,例如,作为用户输入的结果,程序中某个函数中的相同参数可能会接收不同类型的数据),但我们知道所提供的数据应该具有的确切行为。

^^ 因此,接口中存储的值的实际类型在编译时是未知的。 (否则,显然,我们会在代码中指定它。)

| -> 因此,我们获得类型断言,以便能够根据我们期望程序在执行期间提供的可能值来定义程序的行为。

|-> 因此,类型断言仅适用于显式指定为接口类型的变量,而不适用于那些可能实现相同接口但未显式指定为接口类型的变量

是因为

当我们使用接口时,我们只在运行时需要这种类型断言,因为我们不知道将发送到程序的数据的确切类型 - 只有在使用接口时才需要这种类型断言,因此类型断言仅适用于显式指定为接口类型的类型,因为在所有其他情况下,数据类型都是已知的(允许编译器隐式地假定变量实现接口 - 因为它已经知道所涉及数据的所有数据类型)我们根本不需要对已知类型的数据使用类型断言。

以上就是Go 的“类型断言”方式背后的原因是什么?的详细内容,更多请关注编程网其它相关文章!

--结束END--

本文标题: Go 的“类型断言”方式背后的原因是什么?

本文链接: https://www.lsjlt.com/news/561306.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Go 的“类型断言”方式背后的原因是什么?
    问题内容 我试图理解这样一个事实:golang 的类型断言仅适用于显式定义为接口类型的变量,不适用于具体类型(即“string”、“int32”)等..)。 这是一个快速而简单的代码示...
    99+
    2024-02-06
    overflow
  • 探索Go语言火爆的背后原因
    标题:探索Go语言火爆的背后原因 近年来,Go语言作为一门程序设计语言备受关注,其在各个领域都展现出强大的潜力和广泛的应用。作为一名程序员,不得不好奇Go语言为何能够如此火爆,究竟有着...
    99+
    2024-03-10
    原因分析 编程探索 go语言火爆 go语言 网络编程 标准库
  • 解密Go语言火爆背后的原因
    标题:解密Go语言火爆背后的原因 近年来,Go语言作为一种新兴的编程语言,在软件开发领域迅速崛起并备受关注。其简洁高效的语法结构、强大的并发性能以及丰富的标准库,使得Go语言在大型系统...
    99+
    2024-03-10
    解密 go语言 原因 网络编程 标准库
  • javascript是弱类型语言的原因是什么
    本篇内容主要讲解“javascript是弱类型语言的原因是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“javascript是弱类型语言的原因是什么”吧!在...
    99+
    2024-04-02
  • 放弃Golang编程语言的背后真正原因是什么?
    放弃Golang编程语言的背后真正原因是什么? 作为一种高效、静态类型的编程语言,Golang(又称Go)自诞生以来备受程序员的青睐。然而,随着时间的推移,一些开发者开始放弃Golan...
    99+
    2024-03-01
    性能 兼容性 失望 标准库
  • GO语言查询类型断言的方法
    这篇文章主要介绍“GO语言查询类型断言的方法”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“GO语言查询类型断言的方法”文章能帮助大家解决问题。类型查询我们知道interface的变量里面可以存储任意...
    99+
    2023-06-30
  • JavaScript属于宽松类型语言的原因是什么
    这篇文章主要介绍“JavaScript属于宽松类型语言的原因是什么”,在日常操作中,相信很多人在JavaScript属于宽松类型语言的原因是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,...
    99+
    2024-04-02
  • docker用go语言的原因是什么
    小编给大家分享一下docker用go语言的原因是什么,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!首先主流服务使用Unix/Linux操作系统,而go语言对于第三方的依赖相当的少,这样使用go语言开发的Docker基本能够...
    99+
    2023-06-14
  • 为什么微软不支持php8背后的原因是什么?
    微软不支持php8的背后原因是什么? 随着PHP 8的发布,许多开发者对于微软不支持这个最新版本的PHP表达了惊讶和疑惑。作为一家技术巨头,微软一直以来都在支持并积极推动开发者生态系统的发展,为什么会选择不支持PHP 8呢? 首...
    99+
    2024-01-26
    微软 PHP 不支持
  • Go语言中熔断的原理是什么
    本篇内容介绍了“Go语言中熔断的原理是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!今天我们就来一起看...
    99+
    2024-04-02
  • Go语言名为何为Go的原因是什么?
    标题:Go语言名为何为Go的原因是什么? Go语言(也称为Golang)是一种由Google开发的编程语言,自2009年首次发布以来,其受欢迎程度不断增长,被广泛应用于各种领域,包括网...
    99+
    2024-03-08
    语言 原因 命名 go语言 网络编程
  • mybatis参数String与Integer类型的判断方式是什么
    这篇文章主要介绍“mybatis参数String与Integer类型的判断方式是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“mybatis参数String与Integer类型的判断方式是什么”...
    99+
    2023-06-29
  • Go语言类型别名指的是什么
    这篇文章主要介绍了Go语言类型别名指的是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Go语言类型别名指的是什么文章都会有所收获,下面我们一起来看看吧。在Go语言中,类型别名就是为已存在的“类型”定义一个别...
    99+
    2023-07-05
  • 断电后Redis数据不会丢失的原因是什么
    这篇文章将为大家详细讲解有关断电后Redis数据不会丢失的原因是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。前言Redis 作为一款内存数据库,被广泛使用于缓存,分布式锁等场景,那么假如断电或者因其...
    99+
    2023-06-20
  • Go语言不提供隐式数字转换的原因是什么
    这篇文章主要介绍“Go语言不提供隐式数字转换的原因是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Go语言不提供隐式数字转换的原因是什么”文章能帮助大家解决问题。什么是隐式转换在 C 语言中,隐...
    99+
    2023-07-05
  • Go语言struct要使用tags的原因是什么
    这篇文章主要介绍了Go语言struct要使用tags的原因是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Go语言struct要使用tags的原因是什么文章都会有所收获,下面我们一起来看看吧。struct ...
    99+
    2023-07-05
  • MySQL中不使用Text类型的原因是什么
    MySQL中不使用Text类型的原因是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。众所周知,MySQL广泛应用于互联网的OLTP(联机事...
    99+
    2024-04-02
  • java类型转换异常的原因及解决方法是什么
    Java类型转换异常的原因是由于在进行类型转换时,源类型与目标类型之间存在不兼容的关系。这包括以下几种情况: 源类型与目标类型之间...
    99+
    2024-02-29
    java
  • Go语言函数返回值类型推断的实现原理
    go语言函数返回值类型推断通过以下原理实现:编译器分析函数上下文并查找类型签名。编译器创建可用于多种类型签名的函数对象。编译器生成可根据调用上下文实际类型进行调整的泛型代码。 Go语言...
    99+
    2024-04-29
    go语言 返回值类型推断
  • JavaScript中WebSocket断开的原因是什么
    这篇文章给大家介绍JavaScript中WebSocket断开的原因是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。JavaScript是什么JavaScript是一种直译式的脚本语言,其解释器被称为JavaScr...
    99+
    2023-06-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作