簡體   English   中英

去接收器隱式指針轉換不起作用

[英]Go receiver implicit pointer conversion not working

我正在學習Go,我正在跟隨之旅。

在關於Stringer的練習中, 在這里 ,使用* IPAddr接收器實現該功能似乎不起作用,go tour描述為應該工作。

package main

import "fmt"

type IPAddr [4]byte

// TODO: Add a "String() string" method to IPAddr.
func (ip *IPAddr) String() string {
    return fmt.Sprintf("%v.%v.%v.%v", ip[0], ip[1], ip[2], ip[3])
}
func main() {
    hosts := map[string]IPAddr{
        "loopback":  {127, 0, 0, 1},
        "googleDNS": {8, 8, 8, 8},
    }
    for name, ip := range hosts {
        fmt.Printf("%v: %v\n", name, ip)
    }
}

輸出是:

loopback: [127 0 0 1]
googleDNS: [8 8 8 8]

但是從func (ip *IPAddr)String() string更改為func (ip IPAddr) func (ip *IPAddr)會得到正確的輸出:

loopback: 127.0.0.1
googleDNS: 8.8.8.8

這是為什么?

實現func (ip IPAddr) String()將適用於IPAddr*IPAddr類型。

實現func (ip *IPAddr) String僅適用於*IPAddr

隱式轉換意味着您可以在值或指針上調用該函數,但它不滿足接口的實現。 如果使用指針接收器實現接口,則必須在函數調用中使用指針。

下面的代碼顯示了與Stringer接口*IPAddr使用的*IPAddr ,以及與新的foo()函數IPAddr使用的IPAddr (也使用指針接收器實現):

package main

import "fmt"

type IPAddr [4]byte

// TODO: Add a "String() string" method to IPAddr.
func (ip *IPAddr) String() string {
    return fmt.Sprintf("%v.%v.%v.%v", ip[0], ip[1], ip[2], ip[3])
}

func (ip *IPAddr) foo() string {
    return "bar"
}

func main() {
    hosts := map[string]IPAddr{
        "loopback":  {127, 0, 0, 1},
        "googleDNS": {8, 8, 8, 8},
    }
    for name, ip := range hosts {
        fmt.Printf("%v: %v\n", name, &ip)

    fmt.Println(ip.foo())
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM