ホームページ >バックエンド開発 >Golang >Go言語の基礎の構造(春の章)

Go言語の基礎の構造(春の章)

Go语言进阶学习
Go语言进阶学习転載
2023-07-24 17:40:131163ブラウズ

マップを思い出してください

Go 言語のマップはキー値 データを保存する正しい方法は次のとおりです。覚えていない人は、クリックしてください: Go 言語マップの基本と Go 言語の基本マップ補足を理解するための記事です。

//方式一
var student = map[string]string{
    "Name": "张三",
    "Age":  "18",
}
//方式二
var student2 = make(map[string]string, 10)
student2["Name"] = "张三"
student2["Age"] = "18"

しかし、これには欠点があるようです。key がいくつあるのかわかりません。 value 型は固定です。

##理論的に言えば、key 年齢 対応する value 型は int である必要があります。他にも、マップを通じて解決するのが難しい微妙な問題がいくつかあります。

これらの問題を解決するために、構造タイプが導入されました。


##前戯の補足

構造を開始する前に、まず 2 つの奇妙なものを見てください。知識ポイント。


自定义类型

代码

type 自定义类型名 类型名
例:
type NewInt int

完整代码

package main


import "fmt"


type NewInt int


func main() {
    var n1 NewInt = 1
    fmt.Println(n1)//结果为1
}

如果要是理解的话,可以理解为NewInt包含了int的功能。

这里可以把NewInt当作int来使用。

注:NewInt是一个新的类型,它包含int,并不等于int


类型别名

代码

type 类型别名 = 类型名
例:
type Nint = int

完整代码

package main


import "fmt"


type Nint = int


func main() {
    var n1 Nint = 1
    fmt.Println(n1)//1
}

自定义类型和类型别名区别

可能猛一看,感觉自定义类型和类型别名似乎一样,但是其实是不太一样的。

代码

package main


import "fmt"


type Nint1 int   //自定义类型
type Nint2 = int //类型别名


func main() {
    var n1 Nint1 = 1
    var n2 Nint2 = 1
    fmt.Printf("n1类型:%T,n2类型:%T", n1, n2)
}

执行结果。

Go言語の基礎の構造(春の章)

結論:カスタム タイプは実際にはカスタム タイプです。タイプが変更されました。タイプ エイリアスはタイプ名を変更するだけで、本質は同じです。


構造

# Go 言語の構造、言語のクラスJavaPython などは廃止されました。単純な構造です。単純。

構造は、基本データ型に属します。

#メモリ図はおおよそ次のとおりです。

Go言語の基礎の構造(春の章)


#構造定義


構造の定義本文には、キーワード

type および struct が必要です。

语法

type 结构体名 struct {
    字段1 字段类型1
    字段2 字段类型2
    ...
}

示例,通过结构体描述一个学生。

type Student struct {
    Name   string
    Age    int
    Height int
    Weight int
    phone string
}

注:如果字段类型是相同的,可以写在同一行。

type Student struct {
  Name                string
  Age, Height, Weight int
  phone               string
}

结构体初始化

方式一,赋值时初始化

func main() {
  var s1 = Student{
    Name:   "张三",
    Age:    18,
    Height: 180,
    Weight: 120,
    phone:  "6666666",
  }
  fmt.Println(s1)
}

方式二,先声明,后赋值

func main() {
  var s1 Student
  s1.Name = "张三"
  s1.Age = 18
  s1.Height = 180
  s1.Weight = 120
  s1.phone = "66666"
}

两个执行结果。

Go言語の基礎の構造(春の章)


匿名结构体

有时候我们的函数可能会要求传入一个结构体,但是你又不想定义,就想临时用一下,赶紧传参得了。

这时候可以考虑匿名结构体。

方式一,先声明,后赋值

func main() {
  var car struct {
    Name   string;
    CarNum string
  }
  car.Name = "QQ"
  car.CarNum = "京6666"
  fmt.Println(car) //{QQ 京6666}
}

方式二,声明+初始化

func main() {
  var car = struct {
    Name   string;
    CarNum string
  }{
    Name:   "QQ",
    CarNum: "京6666",
  }


  fmt.Println(car) //{QQ 京6666}
}

两个执行结果。

Go言語の基礎の構造(春の章)


通过&方式初始化结构体

通过&的方式初始化,性能会提高一点,因为返回的是第一个的指针

但是操作过程跟上述一样,Go已经封装好了。

代码

func main() {
  //方式一,等于一个空&结构体在赋值
  var s1 = &Student{}
  s1.Name = "张三"
  //...
  //方式二,直接赋值
  var s2 = &Student{
    Name:   "",
    Age:    0,
    Height: 0,
    Weight: 0,
    phone:  "",
  }
  //方式三不可以
  //var s3 &Student//error
}

使用&的方式基本跟原来一样,但是方式三不行。


&初始化结构体函数注意事项

如果使用&的方式,那函数参数也要变一下的。

package main


import "fmt"


type Student struct {
  Name                string
  Age, Height, Weight int
  phone               string
}


func sayStudent1(s Student) {
  fmt.Println(s)
}
func sayStudent2(s *Student) {
  //如果穿的是结构体地址,那么接收就需要用*
  fmt.Println(s)
}
func main() {
  var s1 = Student{
    Name:   "111",
    Age:    0,
    Height: 0,
    Weight: 0,
    phone:  "1111",
  }
  var s2 = &Student{
    Name:   "2222",
    Age:    0,
    Height: 0,
    Weight: 0,
    phone:  "2222",
  }
  sayStudent1(s1)
  sayStudent2(s2)
}

执行结果。

Go言語の基礎の構造(春の章)


关于结构体默认值

代码

func main() {
  var s1 = Student{}
  fmt.Println(s1)
}

执行结果。

Go言語の基礎の構造(春の章)

在操作结构体时,即使没有赋值,也会有默认值,所以不用担心会报错。

int默认值是0,string默认值是"",等。

以上がGo言語の基礎の構造(春の章)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はGo语言进阶学习で複製されています。侵害がある場合は、admin@php.cn までご連絡ください。