zoukankan      html  css  js  c++  java
  • golang基础--strcut结构体

    • 结构体struct类似python语言中的类class,结构体类的元素可以是一个变量,或者函数或者其它的类型,好比python的属性和方法。

      // struct结构体,类似python语言中的class类
      package main
      import "fmt"
      type person struct { //定义一个strcut
      	Name string
      	Age  int
      }
      
      func main() {
      	a := person{}    //赋值给一个变量a
      	fmt.Println(a)
      	a.Name = "faily"  //为结构体赋值
      	a.Age = 28
      	fmt.Println(a)
      }
      /*输出结果
      	{ 0}			//空结构体时,int元素为0
      {faily 28}
      */
      
    • 简单的方式进行结构体的初始化

      package main
      import "fmt"
      
      type person struct { //定义一个strcut
      	Name string
      	Age  int
      }
      func main() {
      	a := person{ //也可以这样初始化一个结构体
      		Name: "msy",
      		Age:  27,
      	}
      	fmt.Println(a)
      }
      
    • struct也是一个值类型,也就是说传递的时候,拷贝的是值,正常途径无法改变结构内的值,需通过指针的方式进行修改

      package main
      import "fmt"
      
      type person struct { //定义一个strcut
      	Name string
      	Age  int
      }
      
      func main() {
      	a := person{ //初始化结构体
      		Name: "msy",
      		Age:  27,
      	}
      	fmt.Println("1", a)
      	A(a)
      	fmt.Println("3", a)
      	B(&a)			//指针引用
      	fmt.Println("4", a)
      
      }
      
      func A(per person) { // 参数引用person--结构体
      	per.Age = 13 	//初始化person属性的值
      	fmt.Println("2", per)
      }
      
      func B(per *person){	//传递指针
      	per.Age =13
      	fmt.Println("2",per)
      }
      /*输出
      初始化:		1 {msy 27}
      修改A:		2 {msy 13}
      修改失败:	3'{msy 27}
      修改B:		2 {msy 13}
      修改成功:	3"{msy 13} 
      */
      
    • 推荐结构体初始化时,使用结构体指针,修改的时候更加方便

      package main
      import "fmt"
      
      type person struct { //定义一个strcut
      	Name string
      	Age  int
      }
      
      func main() {
      	a := &person{ //初始化结构体,建议使用结构的指针
      		Name: "msy",
      		Age:  27,
      	}
      	a.Name = "MYF" //这种方式就可以直接修改结构体
      	fmt.Println("1", a)
      	A(a) //此时就可以直接修改结构体
      	B(a)
      	fmt.Println("3", a)
      }
      
      func A(per *person) { 			//传递指针
      	per.Age = 13 				//初始化person属性的值
      	fmt.Println("2", per)
      }
      
      func B(per *person) { //传递指针
      	per.Age = 100
      	fmt.Println("2", per)
      }
      
      /*输出
      1 &{MYF 27}
      2 &{MYF 13}
      2 &{MYF 100}
      3 &{MYF 100}
      */
      
    • 匿名结构:没有名字的结构

      package main
      import "fmt"
      
      func main() {
      	a := &struct {		//指向结构体指针
      		Name string
      		Age  int
      	}{					//直接初始化
      		Name: "moshaoying",
      		Age:  27,
      	}	
      	fmt。Println(a)
      }
      
      /*输出
      &{moshaoying 27}
      */
      
    • 嵌套匿名结构体,初始化方式

      package main
      import "fmt"
      
      type person struct { //嵌套匿名结构
      	Name    string
      	Age     int
      	Content struct {
      		Phone int
      		Addr  string
      	}
      }
      
      func main() {
      	a := person{Name: "moshaoying", Age: 22}
      	a.Content.Phone = 13636269334		//嵌套匿名结构体初始化方式
      	a.Content.Addr = "shanxi,xian"
      
      	fmt.Println(a)
      }
      
      /*输出
      {moshaoying 22 {13636269334 shanxi,xian}}
      */
      
    • 结构体比较: 命名是结构体的一部分,所以只有当结构体命名相同时才可以进行比较

      package main
      import "fmt"
      
      type person struct { //嵌套匿名结构
      	Name string
      	Age  int
      }
      
      type person1 struct {
      	Name string
      	Age  int
      }
      
      func main() {
      	a := person{Name: "moshaoying", Age: 22}
      	b := person1{Name: "moshaoying", Age: 22}
      	c := person{Name: "moshaoying", Age: 22}
      	d : =  person{Name: "moshaoying", Age: 21}
      	fmt.Println(a == b)
      	fmt.Println(a == c)
      	fmt.Println(a == d)
      }
      
      /*输出报错
      a=b		invalid operation: a == b (mismatched types person and person1)
      a=c		true
      a=d		false
      */
      
    • 结构体没有python类的继承,但是结构体也会有类似的功能,结构体嵌套,达到继承其它结构体的属性

      package main
      import "fmt"
      
      type human struct {
      	Sex int
      }
      type person struct { //结构体继承(嵌套)
      	human
      	Name string
      	Age  int
      }
      
      func main() {
      	a := person{Name: "failymao", Age: 22, human: human{Sex: 250}} //第一种方式,注意原理
      	fmt.Println(a)
      	//第二种方式
      	a.Name = "allen"
      	a.Age = 29
      	a.Sex = 222
      	fmt.Println(a)
      }
      
      /*输出报错
      第一种方式:	{{250} failymao 22}
      第二种方式:	{{222} allen 29}
      */
      
  • 相关阅读:
    editplus 支持lua语言语法高亮显示
    云服务器使用: 域名备案
    2-使用git管理一个单片机程序
    1-git的安装和基本使用
    编译lua固件NodeMcu 8266
    linux 安装Apache服务器
    2-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案安全篇(监听Wi-Fi和APP的数据)
    Spring源码学习之:ClassLoader学习(3)
    Spring源码学习之:ClassLoader学习(2)
    Spring源码学习之:ClassLoader学习(1)
  • 原文地址:https://www.cnblogs.com/failymao/p/9310107.html
Copyright © 2011-2022 走看看