2015-12-20 6 views
-1

Теперь я действительно смущен. Вот моя проблема (Go является новым для меня):Go: вызов функции из библиотеки

Елки файл:

// main.go 
package main 

import "./libraries/test" 

func main() { 

    test.foo() 
} 

Второй файл:

// test.go 
package test 

import "fmt" 

func foo() { 

    fmt.Println("foo") 
} 

Моя структура выглядит следующим образом:

main.go 
    /libraries 
     /test 
      test.go 

If Я скомпилирую этот код. Я получу следующие сообщения:

./main.go:7: не может ссылаться на неэкспортируемое имя test.foo

./main.go:7 не определен: test.foo

Если изменить foo к Foo везде ошибка исчезла, и программа работает должным образом.

+1

Возьмите полный тур по дороге первым; эти два часа хорошо потрачены. – Volker

+0

@ Volker Я прочитал эту книгу: https://www.golang-book.com Я мог бы пропустить несколько вещей здесь и там. – DevAndArtist

ответ

3

В Go, это важное различие, является ли имя символа, написанные в верхнем или нижнем регистре верблюда. Это касается функций, но также и для типов (например, структур или интерфейсов), а также для элементов структуры.

Вы можете прочитать вверх в Go documentation (курсив мой):

Имена имеют важное значение в Go, как и в любом другом языке. У них даже есть семантический эффект: видимость имени вне пакета определяется его первым символом в верхнем регистре.

Это означает, что вы не можете назвать функции и типы произвольно. Если вам нужно вызвать эту функцию из другого модуля, ее нужно называть Foo, а не foo.

3

Я полагаю, что вы не читали документы Go очень близко. Все имена, начинающиеся с заглавных букв, экспортируются из их пакета. Все имена в нижнем регистре не экспортируются.

+0

Отлично, я, возможно, пропустил эту деталь в своей книге «Go». Поэтому я могу думать о именах в нижнем регистре, например 'private types'. – DevAndArtist

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