回答

收藏

键入别名函数并在不强制转换的情况下使用它们?

技术问答 技术问答 686 人阅读 | 0 人回复 | 2023-09-12

在 Go如果你定义了一种新型号,例如:# }  e# x* Y3 w; b# ?$ B8 E" S
    type MyInt int5 x! t+ O# E4 Z9 a( O
那你就不能 了a 传递给MyInt需要 int 函数,反之亦然:0 s1 c. M6 J0 e3 h. f
    func test(i MyInt) {      do something with i}func main()      anInt := 0    test(anInt) //doesn't work,int is not of type MyInt}
    8 K+ x' ^; r8 s
美丽。但为什么这也不适用于函数呢?
( \2 @5 d- ~% G0 E' I, j- |+ H
    type MyFunc func(i int)func (m MyFunc) Run(i int)    m(i)}func run(f MyFunc,i int)    f.Run(i)}func main()    var newfunc func(int) //explicit declaration    newfunc = func(i int)        fmt.Println(i)   }    run(newfunc,10) //works just fine,even though types seem to differ}
    . g# P% _, j) b8 w8 B# r
现在,我不是在抱怨,因为它使我不必像第一个例子那样强制转换newfunc为 type MyFunc;这似乎是不一致的。我相信分的理由;任何人都能激励我吗?# o8 u, c$ F' B. \# N
我问的主要原因是我想这样缩短一些相当长的函数类型,但我想确保这是预期和可接受的:)
/ i" I: m) l* G' y6 {: X4 G8 X) W, b                                                               
8 _! s. L& O" ?* }    解决方案:                                                                & j0 K" V" Q, P/ S3 `+ v
                                                                事实证明,这是我对 Go 阅读规范的相关部分可以解决如何处理类型误解:
7 }7 }  k" S4 u3 e" p( `http://golang.org/ref/spec#Type_identity; P4 e; S, X% F- ]! v
我不知道的区别是命名未命名类型差异。
, u- a4 ]; A9 i& i# b% P命名类型是名称类型,如 int、int64、float、string、bool。此外,您还使用type”创建的任何类型都是命名类型。
  r1 ]3 H  b& y( _% P未命名类型如 []string、map[string]string、[4]int 类型。它们没有名字,只是对其结构的描述。) E. n- A, ?" T9 L, j0 G
如果比较两个命名类型,名称必须匹配才能互换。如果您比较命名类型和未命名类型,那么只要底层表示匹配,你可以开始!# K6 m: Y8 L1 f" N) m8 j% A! f
例如,给定以下类型:6 u% T* ]. G+ M* O+ s
    type MyInt inttype MyMap map[int]inttype MySlice []inttype MyFunc func(int)1 f; c. k8 n. P9 d4 ^$ ?, ]% v
以下无效:
% W; ?  w  W) u* V
    var i int = 2var i2 MyInt = 4i = i2 //both named (int and MyInt) and names don't match,so invalid0 t) D) p) P' ?6 S* V
以下是好的:1 m, R+ [$ M& y! E: X( }+ w
    is := make([]int)m := make(map[int]int)f := func(i int){}//OK: comparing named and unnamed type,and underlying representation//is the same:func doSlice(input MySlice){...}doSlice(is)func doMap(input MyMap){...}doMap(m)func doFunc(input MyFunc){...}doFunc(f)
    ( V1 a: g6 h6 O+ O
我有点内疚。我不知道早点,所以我希望澄清其他类型的云雀!这意味着它比我最初想象的要少得多:)
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则