গো ভাষাতে অন্য ফাইল থেকে ফাংশন কল কিভাবে?


113

আমি গো ল্যাংয়ে অন্য একটি ফাইল থেকে ফাংশনটি কল করতে চাই, কেউ সাহায্য করতে পারে?

test1.go

package main

func main() {
    demo()
}

test2.go

package main

import "fmt"

func main() {
}

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

কিভাবে কল করতে demotest2থেকে test1?


আপনি কি বলতে চাইছেন go fmt? টার্মিনালে বা কি পছন্দ? এটি কীভাবে দেখায় যে সে কোনও কিছুর প্রতি যত্নশীল?
চার্লি পার্কার

উত্তর:


84

mainআপনার প্যাকেজে একের বেশি থাকতে পারে না ।

আরও সাধারণভাবে, আপনার কোনও প্যাকেজে প্রদত্ত নামের সাথে একাধিক ফাংশন থাকতে পারে না।

সরান mainমধ্যে test2.goএবং আবেদন কম্পাইল। demoফাংশন থেকে দৃশ্যমান হবে test1.go


4
আমি maintest2.go এ সরানোর পরে তৈরি করতে এবং চালাতে পারি তবে go run test1.goএখনও ব্যবহার করে test1.go চালাতে ব্যর্থ হয়েছি । কেন?
জেফ লি

89
go run test1.go test2.go
ধনী চুর্চার

4
@ রিচচুরচার, আপনি উত্তর দিয়েছেন। ধন্যবাদ এছাড়াও আপনার উচিত আপু কেস ডেমো () , জনসাধারণের কাজগুলি কনভেনশন দ্বারা আপার কেস করা হয়
রেমন্ড চেনন

টেস্ট 2 এর যদি স্ট্রাক্ট থাকে তবে এটিও কি আমদানি হবে?
রাগ

@ রেইমন্ডচেনন আপার কেস কেবল তখনই প্রয়োজন যখন কোনও ফাংশনকে অন্য প্যাকেজে ব্যবহার করার প্রয়োজন হয়। এই ক্ষেত্রে, যেহেতু উভয় ফাইলই একই প্যাকেজ 'প্রধান' এ রয়েছে, তাই তারা 'অ-রফতানি' (ব্যক্তিগত পড়ুন) ফাংশনগুলিতেও অ্যাক্সেস করতে পারে। ট্যুর.আওলং.আর.
সিনোজিয়া

56

ডিফল্টরূপে লাং যান কেবলমাত্র উল্লিখিত ফাইলটি তৈরি / চালায়। সমস্ত ফাইল লিঙ্ক করতে আপনার চলমান চলাকালীন সমস্ত ফাইলের নাম উল্লেখ করতে হবে।

নীচের দুটি কমান্ডের মধ্যে দুটি চালান:

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

আপনি যদি এগুলি তৈরি করতে চান তবে আপনার অনুরূপ কাজ করা উচিত।


4
go run *.goপরিষ্কার। এটাই আমার প্রয়োজন
আলিফ রামদানি

40

আমি একই জিনিস খুঁজছিলাম। আপনার পরীক্ষার উত্তর দেওয়ার জন্য " টেস্ট 1 থেকে টেস্ট 2-তে ডেমো কল কিভাবে করবেন? ", আমি এটি করেছি এখানে is go run test1.goকমান্ড দিয়ে এই কোড চালান । পরিবর্তন current_folder করার ফোল্ডারে যেখানে test1.go হয়।

পরীক্ষা 1.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")
}

6
পদ্ধতির নামটি মূলধনী হয়ে গেছে তা নিশ্চিত করুন, অন্যথায় এটি কাজ করবে না।
সর্বোচ্চ

4
আপনার সমাধানের জন্য আপনাকে ধন্যবাদ, এটি আমাকে ব্যাপক সাহায্য করেছে! :)
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

অথবা আপনার নির্বাহযোগ্য ফাইলের নাম যা তৈরি হয়েছিল তা ডাকা হতে পারে।


0
ফোল্ডার কাঠামো

নকল
  |
  | - ডুপ্লিকেট_মাইন.গো
  |
  | --countLines.go
  |
  | --abc.txt

সদৃশ_মাইন.গো

    package main

    import (
        "fmt"
        "os"
    )

    func main() {
        counts := make(map[string]int)
        files := os.Args[1:]
        if len(files) == 0 {
            countLines(os.Stdin, counts)
        } else {
            for _, arg := range files {
                f, err := os.Open(arg)
                if err != nil {
                    fmt.Fprintf(os.Stderr, "dup2: %v\n", err)
                    continue
                }
                countLines(f, counts)
                f.Close()
            }
        }

        for line, n := range counts {
            if n > 1 {
                fmt.Printf("%d\t%s\n", n, line)
            }
        }
    }

countLines.go

    package main

    import (
        "bufio"
        "os"
    )

    func countLines(f *os.File, counts map[string]int) {
        input := bufio.NewScanner(f)
        for input.Scan() {
            counts[input.Text()]++
        }
    }
  1. go run ch1_dup2.go countLines.go abc.txt
  2. go run *.go abc.txt
  3. go build ./
  4. go build ch1_dup2.go countLines.go
  5. go build *.go
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.