golang的匿名struct

CodingCode · · 2746 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

go语言匿名struct的用例。

  1. 基本用例
package main
  
import "fmt"

func main() {
    v := struct {
        A int
        B string
    } {
        A: 10,
        B: "bb",
    }
        
    fmt.Printf("%+v\n", v)
}

或者

package main
  
import "fmt"

func main() {
    v := struct {
        A int
        B string
    } { 10, "bb"}
        
    fmt.Printf("%+v\n", v)
}
  1. 包含slice
package main
  
import "fmt"

func main() {
    v := struct {
        A int
        B string
        C []int
    } { 10, "bb", []int {1,2,3}}
        
    fmt.Printf("%+v\n", v)
}
  1. 嵌套匿名struct
package main
  
import "fmt"

func main() {
    v := struct {
        A int
        B string
        C struct {
            C1 int
            C2 string
        }
    } {
        10,
        "bb",
        struct {C1 int
                C2 string} {
                    100,
                    "ccc"},
    }
        
    fmt.Printf("%+v\n", v)
}

这个地方需要注意的是在定义嵌套内对象的时候又有一遍类型的声明,感觉是重复的,显得代码不是很简洁,这没有办法go语言就这么设计的槽点,就像第二个例子的slice一样也是声明了两遍。

其实希望的这种语句格式:

     1  package main
     2    
     3  import "fmt"
     4  
     5  func main() {
     6      v := struct {
     7          A int
     8          B string
     9          C struct {
    10              C1 int
    11              C2 string
    12          }
    13      } {
    14          10,
    15          "bb",
    16          {100, "ccc"},
    17      }
    18          
    19      fmt.Printf("%+v\n", v)
    20  }

遗憾的是编译器不接受这种格式:

$ go build test.go
# command-line-arguments
./test.go:16:9: missing type in composite literal

感觉编译器应该完全能支持这种格式,从语法分析上说,这种写法没有问题,而且不会产生二义,不知道golang出于什么原因不支持,很奇怪的说。


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:CodingCode

查看原文:golang的匿名struct

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2746 次点击  
加入收藏 微博
1 回复  |  直到 2019-12-28 23:35:42
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传