Làm cách nào để gọi hàm từ một tệp khác bằng ngôn ngữ go?


109

Tôi muốn gọi hàm từ một tệp khác trong go lang, có ai có thể giúp tôi không?

test1.go

package main

func main() {
    demo()
}

test2.go

package main

import "fmt"

func main() {
}

func demo() {
    fmt.Println("HI")
}

Làm thế nào để gọi demovào test2từ test1?


Ý bạn là go fmtgì Giống như trong thiết bị đầu cuối hoặc những gì? Làm thế nào nó cho thấy anh ấy quan tâm đến bất cứ điều gì?
Charlie Parker

Câu trả lời:


78

Bạn không thể có nhiều hơn một maintrong gói của mình.

Nói chung, bạn không thể có nhiều hơn một hàm với một tên cụ thể trong một gói.

Loại bỏ maintrong test2.govà biên dịch ứng dụng. Các demochức năng sẽ hiển thị từ test1.go.


1
Tôi có thể xây dựng và chạy sau khi gỡ bỏ maintrong test2.go nhưng không thể chạy test1.go bằng cách sử dụng go run test1.govẫn. Tại sao ?
Jeff Li

87
go run test1.go test2.go
Rich Churcher

2
@RichChurcher, bạn đã đưa ra câu trả lời. Cảm ơn . Ngoài ra bạn trên nên là trường hợp Demo () , chức năng công cộng trên cased theo quy ước
Raymond Chenon

Nếu test2 có cấu trúc, nó cũng sẽ được nhập?
Angger

@RaymondChenon Chữ hoa chỉ được yêu cầu khi một hàm cần được sử dụng trong một gói khác. Trong trường hợp này, vì cả hai tệp đều nằm trong cùng một gói 'chính', chúng cũng có thể truy cập các chức năng 'không được xuất' (đọc riêng tư). Xem tour.golang.org/basics/3
Gặp Sinojia

50

Go Lang theo mặc định chỉ xây dựng / chạy tệp được đề cập. Để liên kết tất cả các tệp, bạn cần chỉ định tên của tất cả các tệp trong khi chạy.

Chạy một trong hai lệnh dưới đây:

$go run test1.go test2.go. //order of file doesn't matter
$go run *.go

Bạn nên làm điều tương tự, nếu bạn muốn xây dựng chúng.


38

Tôi đã tìm kiếm điều tương tự. Để trả lời câu hỏi của bạn " Làm thế nào để gọi bản demo trong test2 từ test1? ", Đây là cách tôi đã làm. Chạy mã này bằng go run test1.golệnh. Thay đổi thư mục current_folder thành thư mục test1.go.

test1.go

package main

import (
    L "./lib"
)

func main() {
    L.Demo()
}

lib \ test2.go

Đặt tệp test2.go vào thư mục con lib

package lib

import "fmt"

// This func must be Exported, Capitalized, and comment added.
func Demo() {
    fmt.Println("HI")
}

5
Đảm bảo rằng tên phương thức được viết hoa, nếu không nó sẽ không hoạt động.
Tối đa

1
Cảm ơn bạn cho giải pháp của bạn, nó đã giúp tôi rất nhiều! :)
jenkizenki

Xin lỗi nhưng điều này rõ ràng là không làm việc:package lib; expected main
Madeo

0

Nếu bạn vừa chạy go run test1.govà tệp đó có tham chiếu đến một hàm trong tệp khác trong cùng một gói, nó sẽ bị lỗi vì bạn đã không yêu cầu Go chạy toàn bộ gói mà bạn bảo nó chỉ chạy một tệp đó.

Bạn có thể nói rằng hãy chạy như một gói toàn bộ bằng cách nhóm các tệp dưới dạng một gói trong quá trình chạy được đánh dấu phẩy theo một số cách. Dưới đây là một số ví dụ (nếu thiết bị đầu cuối của bạn nằm trong thư mục gói của bạn):

go run ./

HOẶC LÀ

go run test1.go test2.go

HOẶC LÀ

go run *.go

Bạn có thể mong đợi hành vi tương tự bằng cách sử dụng lệnh xây dựng và sau khi chạy tệp thực thi được tạo sẽ chạy dưới dạng một gói được nhóm lại, nơi các tệp biết về các chức năng của người khác, v.v. Ví dụ:

go build ./

HOẶC LÀ

go build test1.go test2.go

HOẶC LÀ

go build *.go

Và sau đó chỉ cần gọi tệp thực thi từ dòng lệnh sẽ cung cấp cho bạn kết quả tương tự như sử dụng lệnh chạy khi bạn chạy tất cả các tệp cùng nhau như một gói toàn bộ. Ví dụ:

./test1

Hoặc bất kỳ tên tệp thực thi nào của bạn được gọi khi nó được tạo.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.