2017-07-17 38 views
1

如何使用函數參數的方法?使用指針作爲函數的參數

func writeToInflux(c interface{}, host string, service string, state string) bool { 
    fmt.Println(reflect.TypeOf(c), host, service) 

    bp, e := client.NewBatchPoints(client.BatchPointsConfig{ 
     Database: database, 
     Precision: "us", 
    }) 

    if e != nil { 
     log.Print(e) 
    } 

    tags := map[string]string{ 
     "host": host, 
     "service": service, 
    } 

    fields := map[string]interface{}{ 
     "state": state, 
    } 

    pt, err := client.NewPoint("mon", tags, fields, time.Now()) 

    if err != nil { 
     log.Print(err) 
    } 

    bp.AddPoint(pt) 

    if err := c.Write(bp); err != nil { 
     log.Print("write failed " + err) 
    } 

    return true 
} 

func handler(w http.ResponseWriter, r *http.Request) { 
    c, err := client.NewHTTPClient(client.HTTPConfig{ 
     Addr:  "http://10.x.x.x:8086", 
     Username: username, 
     Password: password, 
    }) 
    if err != nil { 
     log.Print(err) 
    } 
    a := strings.Split(r.URL.Path, "/") 
    writeToInflux(c, a[3], a[4], a[5]) 
} 

在這個例子中,我不能使用c變量的參數,或者可能有另一個選項使用c作爲參數的功能?

+0

爲什麼'C'在'writeToInflux'的'接口{}'?出於某種原因,您是否需要將多種類型傳遞給該函數?如果你把'c'設爲正確的類型,它就會起作用。 – JimB

回答

-1

「c」是一個接口{}類型,在函數參數中有一個接口,您可以將任何結構或任何數據類型傳遞給它。

In your case you want c to use the function write 
if err := c.Write(bp); err != nil { 
     log.Print("write failed " + err) 
    } 

編譯器不知道c的類型,所以你需要輸入assert it。

試試這個,它會工作

newC,ok:= c.(type of c) type of C -> a struct or any type which has a method write 

if ok { 
    if err := newC.Write(bp); err != nil { 
      log.Print("write failed " + err) 
     } 

}  

或更改您的功能像這樣

func writeToInflux(c client.Client, host string, service string, state string) bool 
+1

我懷疑這是推薦的方法。最好修改函數參數來命名實現write()的實際接口。只有在您真正從界面{}提供的靈活性中受益時才使用類型斷言。 – FuzzyAmi

+1

@FuzzyAmi,我同意你的意見並更新我的回答 –

+0

我相信@yazgazan所做的是更好的方法。由於打算在'c'上調用'Write'方法,因此您需要爲其定義接口,而不是使用空接口並鍵入斷言。 – Gavin

1

writeToInflux中,c interface{}沒有指定任何方法c應該實現。您應該使用正弦波InfluxWriter界面,您可以撥打c.Write

type InfluxWriter { 
    Write(bp client.BatchPoints) (*client.Response, error) 
} 

另外,writeToInflux可以接受client.Client,讓您訪問其所有方法。

+0

也許有一些可能性將c作爲參數傳遞給它的所有方法? –

+0

確實存在:)您的'writeToInflux'可以在其參數中接受'c client.Client'。 – yazgazan

+0

但是在傳遞接口名稱方面有一個好處:通過這樣做,可以使用任何實現該接口的類型,而不僅僅是Client。 – FuzzyAmi