结构体

type关键字

用途:
1.定义结构体
2.定义接口
3.定义类型别名
4.类型定义
5.类型判断

别名实际上是为了更好的理解代码,例如chat类型是int类型(ascii码对照表)

//类型别名
    type chatInt = int
    var x chatInt
    fmt.Printf("%T",x)
    输出
    int
  //自定义类型
   type Myint  int
   var i Myint = 12 
   fmt.Printf("%T",i)
   输出
   main.Myint

别名和自定义虽然很像,但别名可以和真名一起使用,而自定义类型不能和真名一起使用。
例如定义了 一个j是int类型,可以和别名相加减运算,但不能和自定义的int类型做加减运算
但是可以用强制类型转换来使用。

  • 定义方法
package main

import "fmt"
import "strconv"
type Myint  int
func (mi Myint) string() string{
    return  strconv.Itoa(int(mi + 2))
}
func main() {

   var i Myint = 12 
   fmt.Println(i,i.string())


}
//输出 
12 14
   var a interface{} = "abc"
   switch a.(type){
       case string :
       fmt.Println("字符串")
   }
   //输出 
   字符串

结构体的定义和初始化

如果没结构体我们定义一个个人集合信息很麻烦。且年龄和身高我们需要的类型并非是string类型

   var persons [][]string
   //定义名字,年龄,地址,身高
   persons = append(persons,[]string{"a","18","厦门","180"})
   fmt.Println(persons)
   //[[a 18 厦门 180] ]

定义及初始化
p1的初始化比较拘谨,必须写上所有值。p2则可以自定义。且位置不受影响例如age和height对调了位置。

type Person struct{
    name string
    age int
    address string
    height float32
}
func main() {
   p1 :=Person{"a",18,"厦门",1.80}
   p2 :=Person{name:"b",height:19,address:"深圳",age:18}
   fmt.Println(p1,p2)
   //{a 18 厦门 1.8} {b 18 深圳 19}
  • 初始化和赋值
package main

import "fmt"

type Person struct{
    name string
    age int
    address string
    height float32
}
func main() {
   p1 :=Person{"a",18,"厦门",1.80}
   p2 :=Person{name:"b",height:19,address:"深圳",age:18}

   var persons []Person
   persons = append(persons,p1)
   persons = append(persons,p2)
   persons = append(persons,Person{name:"c",height:160,address:"北京"})
   persons = append(persons,Person{"d",38,"泉州",1.1})
   fmt.Println(persons)

    var persons2 []Person
    persons2 =[]Person{
        {"a",18,"厦门",1.80},
        {name:"b"},
    }
    fmt.Println(persons2)

}
//输出

[{a 18 厦门 1.8} {b 18 深圳 19} {c 0 北京 160} {d 38 泉州 1.1}]
[{a 18 厦门 1.8} {b 0  0}]

匿名结构体

type Person struct{
    name string
    age int
    address string
    height float32
}
func main() {
   var p Person
   p.age = 18 
   fmt.Println(p,p.age,p.height)

//输出
{ 18  0} 18 0//int和float默认值为0,string默认值为空所以不展示

}

匿名结构体


   address := struct{
       province string
       city string
       address string

   }{
       city:"翔安区",
       province:"厦门市",
       address:"厦大",
   }
   fmt.Println(address)

定义结构体,顺便得实例化了。
实例化方式一样可以键值对传,也可以顺序传。
一次性使用,封装性好,不用定义全局变量

结构体嵌套

  • 结构体嵌套

type Person struct {
    name string
    age  int
}

type Student struct {
    //第一种嵌套方式
    p     Person
    score float32
}

func main() {
    s := Student{
        p:     Person{"young", 18},
        score: 12.1,
    }
    fmt.Println(s, s.p.age)

}

//输出
{{young 18} 12.1} 18
type Person struct {
    name string
    age  int
}

type Student struct {
    //第一种嵌套方式
    p     Person
    score float32
}

func main() {
    s := Student{}
    s.p.name = "young"
    fmt.Println(s, s.p.age, s.p.name)

}
  • 匿名嵌套

type Person struct {
    name string
    age  int
}

type Student struct {
    //匿名嵌套
    Person
    score float32
}

func main() {

    s := Student{
        Person{"yonug", 1},
        12.1,//注意 后面都要逗号结尾
    }
    fmt.Println(s, s.name)

}

//输出
{{yonug 1} 12.1} yonug

注意 匿名结构体如果有带参数传参则应该带上key 例如
    s := Student{
        Person: Person{"yonug", 1},
        score:  12.1,
    }

匿名嵌套初始化时得把匿名结构体放进去不能直接这样操作

  • 外部优先级最高
    `go

type Person struct {
name string
age int
}

type Student struct {
//匿名嵌套
Person
score float32
name string
}

func main() {

s := Student{
    Person: Person{"yonug", 1},
    score:  12.1,
    name:   "young!!",
}
fmt.Println(s, s.name)
s.name = "aa"
fmt.Println(s, s.name)

}

//输出
{{yonug 1} 12.1 young!!} young!!
{{yonug 1} 12.1 aa} aa

### 结构体的定义方法

* 绑定方法

```go
type Person struct {
    name string
    age  int
}
//接收器 在方法中修改p.name值后,实际上仅在方法中生效。(值传递)
//如果要引用传递 则加入*号,变成指针传递"func (p *Person)"
//需要修改值时用指针传递、还有值传递会拷贝数据,如果p很大时建议用指针传递
// func p为传进来的变量,Person为结构体,print为方法名
func (p Person) print() {
    fmt.Printf("name:%s, age:%d", p.name, p.age)
}

func main() {

    s := Person{"yonug", 1}
    s.print()


}
文档更新时间: 2023-07-09 01:24   作者:young