是否可以用var定义1个结构体?

taatcc · 2018-04-08 15:17:29 · 1727 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2018-04-08 15:17:29 的主题,其中的信息可能已经有所发展或是发生改变。

package main
var Book struct{
  title string
  price int
}
func main(){
}

上面的代码没有报错,不是用type定义结构体吗


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

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

1727 次点击  
加入收藏 微博
15 回复  |  直到 2018-05-10 20:04:45
tk103331
tk103331 · #1 · 7年之前

这个应该是定义了匿名struct类型的Book变量

tk103331
tk103331 · #2 · 7年之前
tk103331tk103331 #1 回复

这个应该是定义了匿名struct类型的Book变量

只不过形式和type有很像

taatcc
taatcc · #3 · 7年之前
tk103331tk103331 #1 回复

这个应该是定义了匿名struct类型的Book变量

main中用var b Book会报错:Book is not a type,也不知道怎么回事的。

taatcc
taatcc · #4 · 7年之前
tk103331tk103331 #1 回复

这个应该是定义了匿名struct类型的Book变量

直接Book.title="go"就没报错了

tk103331
tk103331 · #5 · 7年之前
taatcctaatcc #4 回复

#1楼 @tk103331 直接Book.title="go"就没报错了

Book是个变量,不是类型。

定义了一个变量Book,它的类型是 struct{ title string price int }

tk103331
tk103331 · #6 · 7年之前
tk103331tk103331 #5 回复

#4楼 @taatcc Book是个变量,不是类型。 定义了一个变量Book,它的类型是 struct{ title string price int }

是个匿名struct类型

sunanxiang
sunanxiang · #7 · 7年之前

可以的

taatcc
taatcc · #8 · 7年之前
tk103331tk103331 #5 回复

#4楼 @taatcc Book是个变量,不是类型。 定义了一个变量Book,它的类型是 struct{ title string price int }

原来是这样,一直以为Book是结构体,原来只是个变量

taatcc
taatcc · #9 · 7年之前
tk103331tk103331 #6 回复

#5楼 @tk103331 是个匿名struct类型

匿名struct类型,这样就说得通了

barryz
barryz · #10 · 7年之前

这里的Book是个变量,不是类型。

taatcc
taatcc · #11 · 7年之前
barryzbarryz #10 回复

这里的`Book`是个变量,不是类型。

误以为是个结构体了,感觉go有挺多隐匿的东西

icexin
icexin · #12 · 7年之前

type用来定义类型 var用来定义变量

type 类型名 类型type NewInt int var 变量名 类型var count int

所以

var Book struct{
  title string
  price int
}

定义了一个名字为Book的结构体,其类型是struct那一坨,但一般不这样做,通常会先定义一个结构体类型,再定义一个对应的变量

type Book struct{
  title string
  price int
}
var book Book

匿名类型其实我们一直在用,只不多没有注意到罢了,比如平时使用的var x interface{}里面的interface{}就是一个匿名空接口,跟下面代码等价

type EmptyInterface interface {
}
var x EmptyInterface
taatcc
taatcc · #13 · 7年之前
icexinicexin #12 回复

`type`用来定义类型 `var`用来定义变量 `type 类型名 类型` 如`type NewInt int` `var 变量名 类型` 如`var count int` 所以 ``` go var Book struct{ title string price int } ``` 定义了一个名字为`Book`的结构体,其类型是struct那一坨,但一般不这样做,通常会先定义一个结构体类型,再定义一个对应的变量 ``` go type Book struct{ title string price int } var book Book ``` 匿名类型其实我们一直在用,只不多没有注意到罢了,比如平时使用的`var x interface{}`里面的`interface{}`就是一个匿名空接口,跟下面代码等价 ``` go type EmptyInterface interface { } var x EmptyInterface ```

go的匿名还真多,匿名结构体,匿名接口,匿名类型,请问还有哪些匿名?想学习下,按你的提示写了个匿名接口,觉得挺方便

package main
import "fmt"
var Animal interface {
    showColor()
}
type Cat struct{
    color string
}
func (cat Cat) showColor(){
    cat.color="red"
    fmt.Println(cat.color)
}
func main() {
    Animal=new(Cat)
    Animal.showColor()  //输出:red
}
icexin
icexin · #14 · 7年之前
taatcctaatcc #13 回复

#12楼 @icexin go的匿名还真多,匿名结构体,匿名接口,匿名类型,请问还有哪些匿名?想学习下,按你的提示写了个匿名接口,觉得挺方便 ```go package main import "fmt" var Animal interface { showColor() } type Cat struct{ color string } func (cat Cat) showColor(){ cat.color="red" fmt.Println(cat.color) } func main() { Animal=new(Cat) Animal.showColor() //输出:red } ```

匿名有时候跟字面量是等价的,常见的是结构体字面量

type Book struct{
  title string
  price int
}

book := Book {
  title : "Go in action",
  price: 100,
}

等号右边的就是Book结构体字面量

匿名函数是函数的字面量表示,还有用map[string]int{}, []int分别代表字典和slice的字面量。其实就是不用跟具体名字绑定。

其余的你可以探索一下。

taatcc
taatcc · #15 · 7年之前
icexinicexin #14 回复

#13楼 @taatcc 匿名有时候跟`字面量`是等价的,常见的是结构体字面量 ``` go type Book struct{ title string price int } book := Book { title : "Go in action", price: 100, } ``` 等号右边的就是Book结构体字面量 匿名函数是函数的字面量表示,还有用`map[string]int{}`, `[]int`分别代表字典和slice的字面量。其实就是不用跟具体名字绑定。 其余的你可以探索一下。

没想到go能有这么多花样,大开眼界了

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传