第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

帶結(jié)構(gòu)的循環(huán)導(dǎo)入

帶結(jié)構(gòu)的循環(huán)導(dǎo)入

Go
慕哥6287543 2021-10-04 15:59:00
我在 Go 中有一個包含多個模塊的項目。由于以下情況,我遇到循環(huán)導(dǎo)入問題:細(xì)節(jié)一個模塊 Game 包含一個具有當(dāng)前 Game 狀態(tài)的結(jié)構(gòu)體。另一個模塊(修改器)正在做一些游戲特定的東西和計算,因此修改游戲狀態(tài)。因此,Modifier 將需要結(jié)構(gòu)體 Game,但不需要 Game 中的任何方法。Modifier 是從 Game 中調(diào)用的,這里我們有循環(huán)導(dǎo)入。問題:游戲啟動修改器修改器需要游戲結(jié)構(gòu)在我看來,這是一個常見的情況,所以我想知道我應(yīng)該如何以最好的方式解決它。我的解決方案是創(chuàng)建第三個模塊“Structs”,它只包含整個應(yīng)用程序的所有結(jié)構(gòu)。這是一個很好的解決方案嗎?
查看完整描述

3 回答

?
ABOUTYOU

TA貢獻(xiàn)1812條經(jīng)驗 獲得超5個贊

使用第三個套餐選項:


yourgame/

  state/

    state.go

  modifier/

    modifier.go

  main.go

main.go 將兩個組件粘合在一起:


import "yourgame/state"

import "yourgame/modifier"


type Game struct {

    state    state.State

    modifier modifier.Modifier

}


func main() {

    // something like: 

    var game Game

    game.modifier.Modify(game.state)

}

不過,這種方法可能過于緊密耦合。與其操作本質(zhì)上是全局的狀態(tài)對象,不如嘗試將數(shù)據(jù)分割成修改器所需的數(shù)據(jù)。


抽象的推理很難,所以這里有一個具體的例子來說明我的意思。在你的游戲中:


type Object struct {

    ID, X, Y int

    // more data here

}

type Game struct {

    Objects map[int]*Object

}

在您的“修改器”中,假設(shè)我們有一個移動對象的 AI 模塊。如果他只關(guān)心單個對象的位置,您可以創(chuàng)建一個界面:


// in yourgame/modifier

type Object interface {

    GetCoordinates() (int, int)

    SetCoordinates(int, int)

}

type Modifier struct {}

func (m *Modifier) Update(obj Object) { }

然后我們只需要將這些方法添加到我們的原始對象中:


type (obj *Object) GetCoordinates() (int, int) {

    return obj.X, obj.Y

}

type (obj *Object) SetCoordinates(x, y int) {

    obj.X, obj.Y = x, y

}

現(xiàn)在您可以將對象傳遞給您的修改器,而無需循環(huán)依賴。


現(xiàn)在,如果事實證明您的“修改器”界面最終看起來與您的游戲?qū)ο髱缀跬耆嗤?,那么第三個結(jié)構(gòu)包可能是合理的,因此您不必總是重復(fù)自己。例如,考慮net/url.


查看完整回答
反對 回復(fù) 2021-10-04
?
慕容3067478

TA貢獻(xiàn)1773條經(jīng)驗 獲得超3個贊

通常,如果 packageB有直接讀取/修改的代碼,A.Type那么該代碼應(yīng)該在 package 中A。至少需要直接訪問的部分應(yīng)該是。


要在單獨的包之間拆分某些內(nèi)容A,B您通常會嘗試隔離 API 以訪問A.Type可以表示為接口的 API 。然后B將定義和使用這個接口并A.Type實現(xiàn)它(隱式地,不需要包含 B 對它的定義)。


然后一些東西(可能A,可能是一個單獨的包)將B通過適當(dāng)?shù)貍鬟f一個A.Type或*A.Type值來使用。


或者,根據(jù)您的設(shè)計,這種關(guān)系可以顛倒,B.OtherType隱式實現(xiàn)由A. 或兩者A并B只能通過接口使用對方; 這一切都取決于細(xì)節(jié)。


例如,也許是這樣的:


package Game // "A"


type State struct {

        data int // etc

}


func (s State) IsValid() bool          { return true }

func (s *State) ChangeY(arg int) error { return nil }

// …etc…

和:


package Modifier // "B"


type GameState interface {

        IsValid() bool

        ChangeY(int) error

}


type M struct {

        s GameState

        //…

}


func New(s GameState) *M {

        return &M{s: s}

}


func (m M) DoSomething() {

        if s.IsValid() {

                // …

        }

        s.ChangeY(42)

        // …etc…

}


查看完整回答
反對 回復(fù) 2021-10-04
?
神不在的星期二

TA貢獻(xiàn)1963條經(jīng)驗 獲得超6個贊

我會在同一個包中定義類型(在這種情況下是游戲)及其所有方法。你甚至不能根據(jù)語言規(guī)范定義從另一個包導(dǎo)入的類型的方法,


//you should first do 

type MyPackageType ImportedType

//and only then

func (foo MyPackageType) Modify() {

...

}


查看完整回答
反對 回復(fù) 2021-10-04
  • 3 回答
  • 0 關(guān)注
  • 200 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號