回答

收藏

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

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

在 Go如果你定义了一种新型号,例如:
  V0 [! {  Z% E  H7 ?$ F9 d
    type MyInt int% O) |4 y( V+ ?0 n( r6 q3 u5 X' e% h
那你就不能 了a 传递给MyInt需要 int 函数,反之亦然:$ v6 \# f( [/ X, u2 x, y; l
    func test(i MyInt) {      do something with i}func main()      anInt := 0    test(anInt) //doesn't work,int is not of type MyInt}
    $ h/ P7 |8 g, M5 @5 [
美丽。但为什么这也不适用于函数呢?
4 z: W/ C3 y2 j5 n2 y, f
    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}, b( H9 L+ S. G: d" Y
现在,我不是在抱怨,因为它使我不必像第一个例子那样强制转换newfunc为 type MyFunc;这似乎是不一致的。我相信分的理由;任何人都能激励我吗?) i3 [# B: k  u
我问的主要原因是我想这样缩短一些相当长的函数类型,但我想确保这是预期和可接受的:)
3 \& h& Y/ T4 s- {4 \* i/ }' f5 l                                                               
6 P) Y: r, {; ]9 i' H4 I    解决方案:                                                                - X2 ]& K6 @! E8 S* ?8 @
                                                                事实证明,这是我对 Go 阅读规范的相关部分可以解决如何处理类型误解:  u5 X1 H7 `7 e: ?  ?; U
http://golang.org/ref/spec#Type_identity
; o5 e# K/ A0 S% d8 x# R3 f我不知道的区别是命名未命名类型差异。
7 o: V( A0 g! S" T2 Y$ z9 l- a. k命名类型是名称类型,如 int、int64、float、string、bool。此外,您还使用type”创建的任何类型都是命名类型。6 b5 Y+ l$ K1 K# c
未命名类型如 []string、map[string]string、[4]int 类型。它们没有名字,只是对其结构的描述。! _( p1 y7 v/ p$ p% U2 N
如果比较两个命名类型,名称必须匹配才能互换。如果您比较命名类型和未命名类型,那么只要底层表示匹配,你可以开始!; s' i5 j: g. w  ?0 i% b- g
例如,给定以下类型:
% i- P/ s. M& i# q  c
    type MyInt inttype MyMap map[int]inttype MySlice []inttype MyFunc func(int)
    % V  O, s$ F8 m8 \
以下无效:5 f' i' R! ]8 u! X& y; w
    var i int = 2var i2 MyInt = 4i = i2 //both named (int and MyInt) and names don't match,so invalid
      _9 u; s; h+ ~1 N0 j" h
以下是好的:
( j. i; k  `  B& @
    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)
    ' j7 R$ w. l& h1 x: [
我有点内疚。我不知道早点,所以我希望澄清其他类型的云雀!这意味着它比我最初想象的要少得多:)
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则