可以将变量”嵌套变量”添加到结构体中吗?

huangapple go评论90阅读模式
英文:

Is it possible to add a variable "embedded variables" to a struct?

问题

你好!以下是翻译好的内容:

type UserModel struct {
    ...
}

func (u *UserModel) C() string {
    return "system_users"
}

上述代码将一个嵌入的结构体赋值给类型UserModel,Go语言是否允许使用varconst来完成相同的操作呢?

类似于:

var (u *UserModel) C = "system_users"

你明白我的意思吧。

英文:
type UserModel struct {
    ...
}

func (u *UserModel) C() string {
    return "system_users"
}

The above will assign an embedded struct to the type UserModel, does Go allow the same to be done with vars or consts?

Something like

var (u *UserModel) C = "system_users"

You get the idea.

答案1

得分: 2

方法

方法是绑定到类型的接收器的函数。接收器可以接受一个值或一个绑定方法的类型的指针。

Go通过示例提供了这个很好的例子

type rect struct {
    width, height int
}

// 这个 `area` 方法的_接收器类型_是 `*rect`。
func (r *rect) area() int {
    return r.width * r.height
}

// 方法可以为指针或值接收器类型定义。这是一个值接收器的例子。
func (r rect) perim() int {
    return 2*r.width + 2*r.height
}

是的,你可以为几乎所有现有的类型定义方法,除了interface。而且它必须是局部类型(在包中定义,而不是内置类型)。

type Int int

func (i Int) Add(j Int) Int {
    return i + j
}

嵌入

稍微推广一下"Effective Go":

嵌入类型的方法是免费的。这意味着如果类型B嵌入到类型A中,那么类型A不仅拥有自己的方法,还拥有类型B的方法。

扩展前面的例子:

type parallelogram struct {
    rect // 嵌入。parallelogram 拥有 area 和 perim 方法
    depth int
}

func (p parallelogram) volume() int { // 扩展 rect
    // 体积逻辑
}
英文:

Methods

Methods is a functions with receivers bound to a types. Receiver could take a value or a pointer to a type which method bound to.

Go by example provides this nice example:

type rect struct {
    width, height int
}

// This `area` method has a _receiver type_ of `*rect`.
func (r *rect) area() int {
    return r.width * r.height
}

// Methods can be defined for either pointer or value
// receiver types. Here's an example of a value receiver.
func (r rect) perim() int {
    return 2*r.width + 2*r.height
}

And yes you can define methods on almost all existing types except interface. Also it must be local type (defined in a package not built-in)

type Int int

func (i Int) Add(j Int) Int {
    return i + j
}

Embedding

Generalizing "Effective Go" a bit:

The methods of embedded types come along for free. Which means that if type B embedded to type A than type A not only has its own methods it also has methods of type B.

Extending previous example:

type parallelogram struct {
    rect // Embedding. parallelogram has area and perim methods
    depth int
}

func (p parallelogram) volume () int { // Extending rect
    // Volume logic
}

huangapple
  • 本文由 发表于 2017年2月1日 12:31:27
  • 转载请务必保留本文链接:https://go.coder-hub.com/41971939.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定