गो भाषा में किसी अन्य फ़ाइल से फ़ंक्शन कैसे कॉल करें?


107

मैं गो लैंग में किसी अन्य फ़ाइल से फ़ंक्शन कॉल करना चाहता हूं, क्या कोई मदद कर सकता है?

test1.go

package main

func main() {
    demo()
}

test2.go

package main

import "fmt"

func main() {
}

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

demoअंदर test2से कॉल कैसे करें test1?


आपका क्या मतलब है go fmt? जैसे टर्मिनल में या क्या? यह कैसे दिखाता है कि वह किसी भी चीज़ की परवाह करता है?
चार्ली पार्कर

जवाबों:


77

mainआपके पैकेज में एक से अधिक नहीं हो सकते ।

आमतौर पर, आपके पास एक पैकेज में दिए गए नाम के साथ एक से अधिक फ़ंक्शन नहीं हो सकते हैं।

निकालें mainमें test2.goऔर आवेदन संकलित करें। demoसमारोह से दिखाई जाएगी test1.go


1
मैं maintest2.go में हटाने के बाद निर्माण और चला सकता हूं, लेकिन go run test1.goअभी भी test1.go का उपयोग करने में विफल रहा । क्यों ?
जेफ ली

87
go run test1.go test2.go
रिच चर्चर

2
@ रीचर्च, आपने जवाब दिया। धन्यवाद । इसके अलावा, आपको ऊपरी मामले में डेमो () करना चाहिए , सार्वजनिक समारोह अधिवेशन द्वारा ऊपरी तौर पर पेश किए जाते हैं
रेमंड चेनन

यदि टेस्ट 2 में एक संरचना है, तो क्या यह भी आयात किया जाएगा?
एंगर

@RaymondChenon ऊपरी मामला केवल तभी आवश्यक है जब किसी फ़ंक्शन को किसी अन्य पैकेज में उपयोग करने की आवश्यकता हो। इस मामले में, चूंकि दोनों फाइलें एक ही पैकेज 'मुख्य' में हैं, इसलिए वे 'गैर-निर्यात' (निजी पढ़ें) कार्यों तक भी पहुंच सकते हैं। दौरे
सिनोजिया से मिलिए

49

डिफ़ॉल्ट लैंग द्वारा गो लैंग केवल उल्लिखित फ़ाइल बनाता / चलाता है। सभी फ़ाइलों को लिंक करने के लिए आपको दौड़ते समय सभी फाइलों का नाम निर्दिष्ट करना होगा।

नीचे दिए गए दो कमांड चलाएं:

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

यदि आप उन्हें बनाना चाहते हैं, तो आपको भी ऐसा ही करना चाहिए।


1
सीधा मुद्दे पर। धन्यवाद!
रूसो

37

मैं उसी चीज की तलाश में था। आपके प्रश्न का उत्तर देने के लिए " टेस्ट 1 से टेस्ट 2 में डेमो कैसे कॉल करें? ", यहां मैंने इसे किया है। इस कोड को go run test1.goकमांड के साथ चलाएं । बदले current_folder को फ़ोल्डर जहां test1.go है।

test1.go

package main

import (
    L "./lib"
)

func main() {
    L.Demo()
}

lib \ test2.go

सबफ़ोल्डर में test2.go फ़ाइल डालें lib

package lib

import "fmt"

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

5
सुनिश्चित करें कि विधि का नाम पूंजीकृत है, अन्यथा यह काम नहीं करेगा।
अधिकतम

1
आपके समाधान के लिए धन्यवाद, इसने मेरी बहुत मदद की! :)
jenkizenki

क्षमा करें, लेकिन यह स्पष्ट रूप से काम नहीं कर रहा है:package lib; expected main
मेडो

0

यदि आप बस चलाते हैं go run test1.go और उस फ़ाइल में एक ही पैकेज में किसी अन्य फ़ाइल में एक फ़ंक्शन का संदर्भ होता है, तो यह त्रुटि देगा क्योंकि आपने पूरे पैकेज को चलाने के लिए गो को नहीं बताया था, आपने इसे केवल एक फ़ाइल चलाने के लिए कहा था।

आप फाइलों को समूचे पैकेज के रूप में चलाने के लिए कह सकते हैं, जो कई तरह से शुरू किए गए रन के पैकेज के रूप में है। यहां कुछ उदाहरण दिए गए हैं (यदि आपका टर्मिनल आपके पैकेज की निर्देशिका में है):

go run ./

या

go run test1.go test2.go

या

go run *.go

आप बिल्ड कमांड का उपयोग करके समान व्यवहार की उम्मीद कर सकते हैं, और निष्पादित निष्पादन योग्य चलाने के बाद एक समूहीकृत पैकेज के रूप में चलेगा, जहां फाइलें प्रत्येक मदर फ़ंक्शन के बारे में जानती हैं, उदाहरण:

go build ./

या

go build test1.go test2.go

या

go build *.go

और फिर बाद में कमांड लाइन से केवल निष्पादन योग्य को कॉल करना आपको रन कमांड का उपयोग करने के लिए एक समान आउटपुट देगा जब आप सभी फाइलों को एक पूरे पैकेज के रूप में एक साथ चलाते थे। उदाहरण के लिए:

./test1

या जो भी आपके निष्पादन योग्य नाम होता है, उसे उस समय कहा जाता है जब इसे बनाया गया था।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.