【问题标题】:Struct type immtable结构类型不可变
【发布时间】:2014-09-11 18:39:29
【问题描述】:

我编写了一个关于为变量赋值的示例应用程序。看下面的代码sn -p:

package main

import (
    "fmt"
)

func main() {

    cp := 344
    fmt.Println(cp)
    cp = 566565
    fmt.Println(cp)

    res := []struct {
        Email     string `json:"n.email"`
        Activated bool   `json:"n.activated"`
    }{}

    fmt.Println(res)

    res = []struct {
        Email string `json:"n.email"`
    }{}

    fmt.Println(res)
}

第一个 cp 变量,我赋值,然后再做一次,它就可以工作了。最后 cp 携带值 566565。对我来说是 int 可变的。

第二个代码不起作用,将新结构重新分配给 res,我得到编译器错误。

./double_assignment.go:23: 不能使用 []struct { 电子邮件字符串 } 文字(类型 []struct { 电子邮件字符串 })作为类型 []struct { 电子邮件 细绳;在作业中激活 bool }

结构是不可变的吗?

【问题讨论】:

    标签: go


    【解决方案1】:

    第一个short variable declarationres :=确实设置了某种类型([]struct { Email string; Activated bool})。

    如果您想分配不同的类型(这里是不同的 struct 文字 []struct { Email string }),则需要不同的变量。

    res2 = []struct {
            Email string `json:"n.email"`
    }{}
    
    fmt.Println(res2)
    

    (如play.golang.org

    【讨论】:

    • 为什么我需要不同的变量?
    • @zero_coding 因为 res 已经是某种类型:你不能给它分配一个不同类型的对象。
    • @zero_coding 不,你正在学习,帮助他人。你太棒了!
    【解决方案2】:

    不,您的类型不兼容。 res 的类型是

    []struct {
        Email     string
        Activated bool
    }
    

    但你试图给它一个

    []struct {
        Email string
        // notice no Activated!
    }
    

    切片的元素类型是类型的一部分;你不能像这样混搭,即使某些字段看起来是共享的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-11
      • 1970-01-01
      • 1970-01-01
      • 2015-07-07
      • 1970-01-01
      • 2011-12-24
      相关资源
      最近更新 更多