2016-09-28 2182 views
1

我很好奇爲什麼只是在var上打印內存地址直接工作,但試圖通過接口執行相同的操作不會打印出內存地址?Golang:打印內存地址的接口函數

package main 

import "fmt" 

type address struct { 
    a int 
} 

type this interface { 
    memory() 
} 

func (ad address) memory() { 
    fmt.Println("a - ", ad) 
    fmt.Println("a's memory address --> ", &ad) 
} 

func main() { 
    ad := 43 
    fmt.Println("a - ", ad) 
    fmt.Println("a's memory address --> ", &ad) 

    //code init in here 
    thisAddress := address{ 
     a: 42, 
    } 
    // not sure why this doesnt return memory address as well? 
    var i this 
    i = thisAddress 
    i.memory() 
} 

https://play.golang.org/p/Ko8sEVfehv

只是想修正錯誤後添加此,它現在預期的功能。 測試移位存儲器指針

package main 

import "fmt" 

type address struct { 
    a int 
} 

type this interface { 
    memory() *int 
} 

func (ad address) memory() *int { 

    /*reflect.ValueOf(&ad).Pointer() research laws of reflection */ 
    var b = &ad.a 

    return b 
} 

func main() { 



    thisAddress := address{ 
     a: 42, 
    } 
    thatAddress := address{ 
     a: 43, 
    } 

    var i this 
    i = thisAddress 
    a := i.memory() 

    fmt.Println("I am retruned", a) 
    fmt.Println("I am retruned", *a) 
    i = thatAddress 
    c := i.memory() 
    fmt.Println("I am retruned", c) 
    fmt.Println("I am retruned", *c) 
} 

https://play.golang.org/p/BnB14-yX8B

+0

在這種情況下,您應該使用'reflect'包。 'reflect.ValueOf(&ad).Pointer()'將返回&ad(這是一個指針值)作爲'uintptr'。 –

+0

謝謝,剛擡起頭反映我現在正在閱讀反射法則。 –

回答

1

因爲在你的memory()方法內第二種情況:

func (ad address) memory() { 
    fmt.Println("a - ", ad) 
    fmt.Println("a's memory address --> ", &ad) 
} 

ad不是int但一個結構,adaddress類型。而且您不打印int的地址,而是打印struct的地址。指向結構體的默認格式爲:&{}

fmt關於默認格式封裝的文檔引用:

struct:    {field0 field1 ...} 
array, slice:  [elem0 elem1 ...] 
maps:    map[key1:value1 key2:value2] 
pointer to above: &{}, &[], &map[] 

如果修改了行打印address.a場是int類型的地址:

fmt.Println("a's memory address --> ", &ad.a) 

您將看到以十六進制格式打印的相同指針格式,例如:

a's memory address --> 0x1040e13c 
+0

我做了你所建議的改變,他們的工作方式與我的想法完全相同,謝謝你的簡要回答。 –