2017-06-07 19 views
0

我試圖製作一個簡單的包來將SSH命令發送到服務器。Golang方法Func中的無效接收器類型

我有以下代碼:

type Connection *ssh.Client 

func Connect(addr, user, password string) (conn Connection, err error) { 
    sshConfig := &ssh.ClientConfig{ 
     User: user, 
     Auth: []ssh.AuthMethod{ 
      ssh.Password(password), 
     }, 
     HostKeyCallback: ssh.HostKeyCallback(func(hostname string, remote net.Addr, key ssh.PublicKey) error { return nil }), 
    } 

    conn, err = ssh.Dial("tcp", addr, sshConfig) 
    return 
} 

func (conn Connection) SendCommand() ([]byte, error) { 
    session, err := (*ssh.Client)(conn).NewSession() 
    // ... 
} 

我的問題是關於兩行func (conn Connection) SendCommand() ([]byte, error)session, err := (*ssh.Client)(conn).NewSession()

我不知道如何使用*ssh.Client的方法從我的覆蓋Connection類型。

據我所知,我需要做一些轉換,並使用ssh.Client(*conn).NewSession()將工作,但它複製*ssh.Client這似乎是不正確的方法的值。

使用我的自定義type Connection *ssh.Client類型時,應該如何訪問*ssh.Client的可用方法?

回答

2

你不能用指針TypeSpec聲明一個新類型。另外聲明一個新類型專門用於刪除整個方法集,因此您將不會擁有*ssh.Client中的任何原始方法。

你需要的是在你自己的結構類型嵌入*ssh.Client可用的組合物:

type Connection struct { 
    *ssh.Client 
} 

func Connect(addr, user, password string) (*Connection, error) { 
    sshConfig := &ssh.ClientConfig{ 
     User: user, 
     Auth: []ssh.AuthMethod{ 
      ssh.Password(password), 
     }, 
     HostKeyCallback: ssh.HostKeyCallback(func(hostname string, remote net.Addr, key ssh.PublicKey) error { return nil }), 
    } 

    conn, err = ssh.Dial("tcp", addr, sshConfig) 
    if err != nil { 
     return nil, err 
    } 

    return &Connection{conn}, nil 
} 

func (conn *Connection) SendCommand() ([]byte, error) { 
    session, err := conn.NewSession() 
    // ... 
} 
+0

完美地工作。 '返回連接{康恩},nil'應改爲'返回&連接{康恩},無' – Acidic

+0

@酸:謝謝,錯字固定。 – JimB

1

這是我能拿出最好的:

type Connection ssh.Client 

func (conn *Connection) SendCommand() ([]byte, error) { 
    (*ssh.Client)(conn).NewSession() 

請注意,我已經改變了類型是指針類型(但後來我做了一個指針接收器SendCommand) 。我不確定有什麼方法可以用指針類型創建一個函數作爲接收者。

+0

這個工作,它是當我在等待一個答案,我現在用的方法,但我的棉短絨是給我一條消息說'連接調用複製鎖定值ssh.Client' – Acidic

+0

它抱怨什麼? – smarx

+0

https://play.golang.org/p/dY3xcXpHif第23行和第28行 或者在你的例子中,SendCommand()行 – Acidic

相關問題