2014-10-06 31 views
-2

有没有一种很好的方法将初始化的结构变量嵌入到另一个结构中?如何在结构中嵌入初始化变量?

考虑以下情况:

type Account struct { 
    AdminUser, AdminPass string 
} 

const (
    acc1: "account_user", 
    pass: "111222" 
) 

var AccountDef = Account { 
    AdminUser: "acc1", 
    AdminPass: "pass1" 
} 

type Login struct { 
    Acc *AccountDef 
    Username, Password, Token string 
} 

var LoginDef = Login { 
    Token: "adaasdasddas1123" 
} 

我想重用LoginAccountDef,那么我想在另一个函数以实例LoginDef然后用它来渲染模板像LoginDef.Acc.AdminUser

这是可以做到的?

+1

我发现很难跟随你要问什么。也许我很累,或者你没有解释得很好。你能否更清楚地重写它? – Alasdair 2014-10-06 14:24:50

+0

[嵌入](http://golang.org/doc/effective_go.html#embedding)在Go中有特定的含义,但我没有看到你在这里使用嵌入式结构。你是否试图以这种方式使用它们? – JimB 2014-10-06 14:34:54

+0

@JimB是的。我试图以这种方式使用它们,这样我就可以在Login结构体中使用初始化的AccountDef,所以当我使用'new(Login)'或'Login {}''我想要'AdminUser'和'AdminPass'实例化用默认值填充,这样我就不必为需要它的每个函数使用'Login {AdminUser:“acc1”,AdminPass:“pass1”}'。我可以看看使用另一个私有函数来完成这项工作,并调用它,但想知道是否有更好的方法,而不仅仅是创建工厂功能 – 2014-10-06 14:45:45

回答

0

如果你想有一个Login从一个Account包含的字段,你可以将它们嵌入像这样:

http://play.golang.org/p/4DXnIsILd6

type Account struct { 
    AdminUser string 
    AdminPass string 
} 

type Login struct { 
    *Account 
    Username, Password, Token string 
} 

func main() { 
    acct := &Account{ 
     AdminUser: "username", 
     AdminPass: "pass", 
    } 

    login := Login{Account: acct} 

    fmt.Println("login.AdminUser:", login.AdminUser) 
    fmt.Println("login.AdminPass:", login.AdminPass) 
} 
+0

嗨,感谢您的答案,但我正在寻找的不是在每个函数中实例化默认值。例如,在你的例子中,例如'Account'实例化了大约20-30次。我想引用构造函数 – 2014-10-06 15:01:24

+0

因此,您想要重新使用具有特定值的'Account',而不是初始化新的?如果是这样的话,只需在一个有意义的范围内创建一个“Account”。我不确定现在的问题是什么,或者这与嵌入有什么关系。也许尝试创建一个显示你想要发生的事情的例子。 – JimB 2014-10-06 15:16:11