2014-11-16 1 views
-1

У меня есть два файла .go - client.go (содержит основной фонд) и logic.go. Одна из них содержит функцию, которая должна выполняться при вызове с клиента. {Ориентация объекта в Go - Struct/Composition/Encapsulation

client.go - 

package main 

func main() { 
    // url is the url of the server to which the REST call has to be sent to fetch the response 
    client := NewClient(url) 
    client.DummyFunc() 

} 

logic.go 

import (
"fmt" 
) 

func DummyFunc(){ 

    // Logic here which returns the json response 
} 

}

Я пытаюсь понять, что может быть хорошим объектно-ориентированный путь в Go, чтобы сделать это. Так как Go имеет свой собственный стиль наследования/компоновки/инкапсуляции объектов, не могли бы вы предложить мне способ сделать это, поскольку я новичок в этом языке.

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

ответ

1

Перед тем, как обратиться к способу OO этого, делает client.go необходимо удержать функцию main? Нужно ли от logic.go от client.go? Кроме того, logic.go должен быть частью пакета. Я с трудом подбираю то, что осталось для краткости, и того, что может отсутствовать.

Как бы сделать вещи:

main.go (были бы одинаковыми для обоих случаев)

package main 

import "client" 

func main() { 
    client := client.Client { ClientUrl: url } // This takes the place of NewClient(url) 
    client.DummyFunc() 
} 

client.go

package client 

type Client struct { 
    ClientUrl  string 
} 

func (c Client) DummyFunc() { 
    // Logic here which returns the JSON response 
} 

Если вы хотите сохранить logic отдельно от client, вы могли бы это сделать.

client.go

package client 

type Client struct { 
    ClientUrl  string 
    Logic   // An anonymous field let's you call Logic functions 
} 

logic.go

package client 

type Logic struct { 
    // Fields 
} 

func (l Logic) DummyFunc() { 
    // Logic here which returns the JSON response 
} 

Обратите внимание, так как мы держали Logic анонимную в Client структуры, мы были в состоянии назвать DummyFunc.

Вы можете увидеть еще несколько примеров здесь: http://golangtutorials.blogspot.com/2011/06/inheritance-and-subclassing-in-go-or.html

EDIT -------------------------------- ------------------------

Немного неудобно, но вот client.go с основной функцией в нем и logic.go является отдельным. Если вы добавите дополнительные функции в logic, то client сможет вызывать все остальные функции.

client.go

package main 

import "logic" 

type Client struct { 
    ClientUrl  string 
    logic.Logic 
} 

func main() { 
    client := client.Client { ClientUrl: url } // This takes the place of NewClient(url) 
    client.DummyFunc() 
} 

logic.go

package logic 

import "fmt" 

type Logic struct { 
    // Fields 
} 

func (l Logic) DummyFunc() { 
    fmt.Printf("In DummyFunc\n") 
} 

С этим сказанным, я не уверен, что это лучший способ сделать это. Если logic не имеет полей, то бессмысленно иметь его как отдельную структуру. Я бы сделал его функцией client, как я указал в первом случае в исходном сообщении.

+0

Вы правы. Я хочу основной func() только в файле client.go и в других реализациях функций в logic.go, которые я должен вызывать из моего client.go, передавая параметр URL. – psbits

+0

Хорошо. Ясны ли изменения, которые вам нужно внести, чтобы объединить «клиент» и «главное»? Большая часть этого была бы такой же, просто перемещая некоторый код вокруг. – shellhead

+0

поэтому основной фонд() находится в файле client.go, который при запуске должен вызывать функцию в файле logic.go, передавая URL. Здесь все намерено. Я ценю ваши усилия, хотя, если вы также можете предоставить свой способ сделать это, это будет здорово. Благодаря ! – psbits