2013-06-21 4 views
1

Я пытаюсь добавить указатель на структуру на срезе, но я не могу избавиться от этой ошибки:Добавление указатель на структуру срезу

cannot use NewDog() (type *Dog) as type *Animal in append: 
    *Animal is pointer to interface, not interface 

Как я могу избежать этого ошибка? (В то же время с помощью указателей)

package main 

import "fmt" 

type Animal interface { 
    Speak() 
} 

type Dog struct { 
} 

func (d *Dog) Speak() { 
    fmt.Println("Ruff!") 
} 

func NewDog() *Dog { 
    return &Dog{} 
} 

func main() { 
    pets := make([]*Animal, 2) 
    pets[0] = NewDog() 
    (*pets[0]).Speak() 
} 

ответ

5
package main 

import "fmt" 

type Animal interface { 
    Speak() 
} 

type Dog struct { 
} 

func (d *Dog) Speak() { 
    fmt.Println("Ruff!") 
} 

func NewDog() *Dog { 
    return &Dog{} 
} 

func main() { 
    pets := make([]Animal, 2) 
    pets[0] = NewDog() 
    pets[0].Speak() 
} 

Вам не нужно Кусочек указателей на интерфейсы животных.

http://golang.org/doc/effective_go.html#pointers_vs_values

2

просто изменить код:

func main() { 
    pets := make([]Animal, 2) 
    pets[0] = NewDog() 
    pets[0].Speak() 
} 

значение интерфейса уже неявный указатель.

+2

Я хотел уточнить; значение интерфейса ** не ** неявный указатель. Тип '* Dog' (указатель на Dog) реализует интерфейс, а не тип' Dog' - вот почему. – thwd

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