2013-12-09 3 views
4

Если я запускаю следующий код все компилируется и работает нормально:Импортные метод структура не работает

package main 

import "fmt" 

type Point struct { 
    x, y int 
} 

func (p *Point) init() bool { 
    p.x = 5 
    p.y = 10 
    return true 
} 

func main() { 
    point := Point{} 
    point.init() 
    fmt.Println(point) 
} 

Но когда я двигаю Point struct к пакету в каталоге $GOPATH тогда я получаю следующее сообщение об ошибке: point.init undefined (cannot refer to unexported field or method class.(*Point)."".init)

Может ли кто-нибудь объяснить мне, почему это происходит?

После того, как я поставил Point struct в пакете с именем class код выглядит следующим образом (ошибка на 8-й линии, где я называю метод init):

package main 

import "fmt" 
import "class" 

func main() { 
    point := class.Point{} 
    point.init() 
    fmt.Println(point) 
} 
+1

Это идиоматическое написать функцию 'NewPoint' построить точку из различных параметров вместо вызова' Инициировать "впоследствии. – nemo

+0

Верно, но я использую это с пакетом RPC, и он позволяет регистрировать только один объект, поэтому мне пришлось поставить init как метод. – Tom

ответ

11

Переименование init() to Init() должен работать!
В принципе, все вещи (функция, метод, структура, переменная), которые не начинаются с буквы в верхнем регистре Юникода, будут видны только внутри их пакета!

Вы должны прочитать больше от языка спецификации здесь: http://golang.org/ref/spec#Exported_identifiers

Соответствующий бит:

An identifier may be exported to permit access to it from another package. An identifier is exported if both:

  1. the first character of the identifier's name is a Unicode upper case letter (Unicode class "Lu"); and
  2. the identifier is declared in the package block or it is a field name or method name. All other identifiers are not exported.
+2

Классный, который намного лучше, чем мой, но вы всегда должны включать соответствующую цитату из источник, потому что ссылки могут стать недействительными – Tom

4

только функции/методы, которые имеют первый письмо от их имени заглавного экспортируется

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

Every exported (capitalized) name in a program...

Когда я сменил init на Init, все сработало.

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