谈一谈Go的结构体struct的使用方法
来源:互联网 发布:中国股市周期 知乎 编辑:程序博客网 时间:2024/06/05 13:44
定义结构体
package mainimport ( "fmt")type test struct {}func main() { a := test{} fmt.Println(a)}
输出:
{}
package mainimport ( "fmt")//定义一个person结构,类似于在PHP定义了一个person的classtype Person struct { name string //默认零值为空字符串 age int //默认零值为0}func main() { a := Person{} fmt.Println(a)}
输出:
{ 0}
访问结构体成员
package mainimport ( "fmt")//定义一个person结构,类似于在PHP定义了一个person的classtype Person struct { name string //默认零值为空字符串 age int //默认零值为0}func main() { a := Person{} //对Person进行属性操作,类似于javascript的操作 a.name = "GO" a.age = 8 fmt.Println(a)}
输出:
{GO 8}
字面量初始化
package mainimport ( "fmt")//定义一个person结构,类似于在PHP定义了一个person的classtype Person struct { name string //默认零值为空字符串 age int //默认零值为0}func main() { //也可以通过字面值进行初始化,这是常用的做法,写法类似于JSON的写法 a := Person{ name: "GO", age: 8} //注意,如果没有逗号,则}不能另起新行,否则会报错 fmt.Println(a)}
输出:
{GO 8}
结构体作为参数传递
package mainimport ( "fmt")//定义一个person结构,类似于在PHP定义了一个person的classtype person struct { name string //默认零值为空字符串 age int //默认零值为0}func main() { //也可以通过字面值进行初始化,这是常用的做法,写法类似于JSON的写法 ,注意属性名不能加分号 a := person{ name: "GO", age: 8} //注意,如果没有逗号,则}不能另起新行,否则会报错 fmt.Println("我在A前面输出", a) A(a) //A(&a)就是值传递,A函数应写成func A(per *person) fmt.Println("我在A后面输出", a)//很显然,A里面的赋值并没有改变a的值,证明结构是值类型,传值是值拷贝}//结构也是值类型,传值的时候也是值拷贝func A(per person) { //传递per参数,类型为person结构 per.name = "PHP" fmt.Println("我在A里面输出", per)}
我在A前面输出 {GO 8}
我在A里面输出 {PHP 8}
我在A后面输出 {GO 8}
结构体指针
package mainimport ( "fmt")//定义一个person结构,类似于在PHP定义了一个person的classtype person struct { name string //默认零值为空字符串 age int //默认零值为0}func main() { //如何传递指针 a := &person{ //变量初始化时,加&取地址 name: "GO", age: 8} //注意,如果没有逗号,则}不能另起新行,否则会报错 //当传地址的时候,想操作属性时,Go语言可以不需要加*,直接操作 a.age = 9 fmt.Println("我在A前面输出", a) A(a) fmt.Println("我在A后面输出", a) //很显然,A里面的赋值并没有改变a的值,证明结构是值类型,传值是值拷贝}//结构也是值类型,传值的时候也是值拷贝func A(per *person) { //此时为指针类型 per.name = "PHP" fmt.Println("我在A里面输出", per)}
输出:
我在A前面输出 &{GO 9}
我在A里面输出 &{PHP 9}
我在A后面输出 &{PHP 9}
匿名结构体
package mainimport ( "fmt")//匿名结构func main() { a := &struct { name string age int }{ name: "PHP", age: 10, } fmt.Println(a) //很显然,A里面的赋值并没有改变a的值,证明结构是值类型,传值是值拷贝}
输出:
&{PHP 10}
结构体的嵌套
package mainimport ( "fmt")//结构嵌套type person struct { name string age int contact struct { phone, city string }}func main() { a := person{name: "GO", age: 8} a.contact.phone = "1112345678" a.contact.city = "福州" fmt.Println(a)}
输出:
{GO 8 {1112345678 福州}}
结构体匿名字段
package mainimport ( "fmt")//匿名字段type person struct { string int}func main() { a := person{"GO", 8} //注意这里的位置不能对调,应与声明的顺序一样 fmt.Println(a)}
输出:
{GO 8}
结构体之间的比较(不同结构,没有可比性,会报错,哪怕属性值和属性都一样)
package mainimport ( "fmt")//匿名字段type person struct { string int}type person1 struct { string int}func main() { a := person{"GO", 8} //属性person结构 b := person1{"GO", 8}//属于person1结构 fmt.Println(a == b)}
输出报错
.\hello.go:21:16: invalid operation: a == b (mismatched types person and person1)
结构体之间的赋值
package mainimport ( "fmt")//匿名字段type person struct { string int}func main() { a := person{"GO", 8} b := a fmt.Println(a, b)}
输出:
{GO 8} {GO 8}
结构体之间的“继承“(注意:Go并没有面向对象语言的继承关系,如PHP)
package mainimport ( "fmt")type human struct { sex int}type teacher struct { human name string age int}type student struct { human name string age int}func main() { a := teacher{name: "PHP", age: 15} b := student{name: "GO", age: 8} fmt.Println(a, b)}
输出:
{{0} PHP 15} {{0} GO 8}
嵌入结构体的使用方法
package mainimport ( "fmt")type human struct { sex int}type teacher struct { human name string age int}type student struct { human name string age int}func main() { a := teacher{name: "PHP", age: 15, human: human{sex: 0}} //嵌入结构作为匿名字段时,默认字段名就是嵌入的结果名 b := student{name: "GO", age: 8, human: human{sex: 1}} fmt.Println(a, b)}
输出:
{{0} PHP 15} {{1} GO 8}
嵌入结构体如何修改相关属性
package mainimport ( "fmt")type human struct { sex int}type teacher struct { human name string age int}type student struct { human name string age int}func main() { a := teacher{name: "PHP", age: 15, human: human{sex: 0}} //嵌入结构作为匿名字段时,默认字段名就是嵌入的结果名 b := student{name: "GO", age: 8, human: human{sex: 1}} a.name = "PYTHON" b.sex = 0 //如果是嵌入结构,则把原来的字段全部拷贝过来到现在的结构里了,操作字段时无需写成b.human.sex fmt.Println(a, b)}
{{0} PYTHON 15} {{0} GO 8}
阅读全文
1 0
- 谈一谈Go的结构体struct的使用方法
- 谈一谈Go的切片Slice的使用方法
- 谈一谈Go的函数function的使用方法
- 谈一谈Go的方法method的使用方法
- 谈一谈Go的接口interface的使用方法
- go struct结构的实例
- Go语言,struct结构体的那些奇怪的用法
- 谈一谈Go的Map的使用用法
- struct的用法--------C语言结构体(struct)常见使用方法(转载)
- struct的使用方法
- struct 结构体的创建
- struct 结构体的大小
- 结构体struct的sizeof
- C#的Struct结构体
- struct结构体的大小
- go语言的struct类型
- go结构体的使用
- struct结构的大小
- session机制
- could not find java.dllError: Could not find Java SE Runtime Environment.
- [poj1556]:The Doors
- 剑指Offer-4:二维数组中的查找
- 第五周 项目3 数据结构实践——括号的匹配(栈)
- 谈一谈Go的结构体struct的使用方法
- 条件随机场(Conditinal random field)
- 第14周项目4- 英文单词的基数排序
- Cloudera Manager 安装 CDH5.x 心得
- 图形图像网络参考资料
- java 内存模型
- LayUi Upload组件 和 C# .Net asp
- I2S音频总线学习(四)I2S接口设计
- 第十四周——项目二—用哈希法组织关键字