2015-03-24 3 views
1

это мой код:Указатели структурировать в Go Язык

package main 
import ("fmt") 

type Message struct { 

    Text []byte 
    Tag string 
} 

func main() { 

    var m Message 

    pkt := []byte("Hey") 
    editMessage(&m, &pkt) 

    fmt.Println(string(m.Text)) 
    } 

func editMessage(m *Message, pkt *[]byte) { 

    m.Text = *pkt 
} 

И я получаю «Эй», как ожидается, на выходе.

Если я изменю m.Text = *pkt с (*m).Text = *pkt Он также работает!

Какая правильная/более эффективная версия? Или это просто ярлык?

Эта вещь теперь не работает все время, если я использую

c *net.Conn 

в качестве входных данных в функции, я должен использовать

something := (*c).RemoteAddr() 

, чтобы заставить его работать.

Спасибо

+0

Обратите внимание, что это не происходит в реальном коде, потому что вы почти никогда не должны использовать указатель на интерфейс. – JimB

+1

И вы обычно не используете указатели на срезы (или карты или строки). Срез уже относится к базовым данным, поэтому нет необходимости в дополнительном указании (если вы не хотите обновлять длину или емкость среза, но во многих таких случаях лучше вернуть результирующий срез, например, «append»). –

+0

Я использую его, потому что мне нужно получить исходный IP-адрес соединения, внутри функции и повысить эффективность. Я передал соединение как ссылку вместо того, чтобы справляться с ней. Я ошибаюсь? – Michael

ответ

4

Если вы обратитесь к the Golang Language Specification - Method values разделе, Вы отметите эту цитату (курсив мой):

Как селекторов, ссылка на без интерфейса метод с значение с использованием указателя будет автоматически разыменовать этот указатель: pt.Mv эквивалентно (* pt) .Mv.

Таким образом, ваш указатель автоматически разыгрывается для вас.

net.Conn - это интерфейс .. и поэтому вы должны вручную разыменовать указатель, чтобы это работало.

Смежные вопросы