2015-10-04 2 views
3

У меня есть некоторые проблемы с Golang и включают в себя пакет. У меня есть, что scructureGolang импортные пакеты

src/ 
├── hello_world 
│   ├── hello.go 
│   └── math 
│    └── add.go 

hello.go файл содержит этот код:

package main 

import (
    "fmt" 
    math "hello_world/math" 
) 

func main() { 
    fmt.Println("Hello World") 
    x := math.add(6, 5) 
} 

и add.go

package math 

func add(x, y int) int { 
    return x + y 
} 

и когда я go run hello go я вижу:

[email protected]:~/go/src/hello_world$ go run hello.go 
# command-line-arguments 
./hello.go:10: cannot refer to unexported name math.add 
./hello.go:10: undefined: "hello_world/math".add 

GOPATH:

[email protected]:~/go/src/hello_world$ echo $GOPATH 
/home/evgen/go 

Как это исправить? Спасибо вам!

ответ

9

За пределами пакета могут быть доступны и указаны только экспортированные идентификаторы, то есть идентификаторы, начинающиеся с прописной буквы.

Так проще всего починка экспортировать math.add() функцию, изменив свое название на Add() в math.go:

func Add(x, y int) int { 
    return x + y 
} 

И, конечно, когда вы обратитесь к нему с main.go:

x := math.Add(6, 5) 

И обратите внимание, что при импорте вашего пакета hello_world/math вам не нужно указывать новое имя для ссылки на его экспортированные идентификаторы: по умолчанию это будет последняя его часть путь импорта s, так что это эквивалентно Вашего импорта:

import (
    "fmt" 
    "hello_world/math" 
) 
+0

Hah! Я тупой! Большое вам спасибо! –

0

И при вызове Добавить в основной функции, не использовать этот

x := math.Add(6 + 5) 

Вместо этого используйте этот

x := math.Add(6, 5) 
+0

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

0

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

пример:

package main 

import "fmt" 
import "other/out" 

func main(){ 

fmt.Println(out.X) 

// hello 

} 
package other 

var X string = "hi" 
2

заглавной функцию в вашем пакете, который вы хотите другие функции следующим образом:

func Add(x, y int) int { 
     return x + y 
} 

затем вызвать его в hello.go, как это :

x := math.Add(6, 5) 

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

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