go的结构体【我的go学习第五课】

116 阅读2分钟

go的结构体【我的go学习第五课】

1.struct介绍

  • Go没有对象和继承的概念,也没有很多与面向对象相关的概念,例如多态和重载。
  • Go 所具有的是结构体的概念,可以将一些方法和结构体关联。

虽然 Go 不会像你以前使用的面向对象语言一样,但是你会注意到结构的定义和类的定义之间有很多相似之处。下面的代码定义了一个简单的 Saiyan 结构体:

例如

type User struct{
    name string
    age int
}

需要注意的是:导入没有使用的包会报错。

2.声明和初始化

结构体值最简单的办法如下代码所示。

liming:= User{
    name:"liming",
    age:11,
}

注意:

  • 赋值时,必须 , 隔开。
  • 数值默认值为0 。
  • 也可以只设置一个值。

例如

package main

import (
	"fmt"
)

type User struct {
	name string
	age  int
}

func main() {
	liming := User{name: "li ming"}
	liming.age = 11
	fmt.Printf("name: %s\tage:%d", liming.name, liming.age)
}

3.指针

有时候需要指针关联而不是值关联,举例如下:

package main

import (
	"fmt"
)

type User struct {
	name string
	age  int
}

func main() {
	liming := User{name: "li ming"}
	liming.age = 11
	Super(liming)
	fmt.Printf("name: %s\tage:%d", liming.name, liming.age)
}

func Super(s User) {
	s.age += 1
}

运行结果如下:

Starting: C:\Users\livingbody\go\bin\dlv.exe dap --check-go-version=false --listen=127.0.0.1:9071 from c:\Users\livingbody\goworkspace\hello
DAP server listening at: 127.0.0.1:9071
Type 'dlv help' for list of commands.
name: li ming	age:11
Process 11080 has exited with status 0
Detaching
dlv dap (19808) exited with code: 0

其中打印的年龄并没有发生变化,而需要变化则需要用到指针,具体代码如下。

package main

import (
	"fmt"
)

type User struct {
	name string
	age  int
}

func main() {
	liming := &User{name: "li ming"}
	liming.age = 11
	Super(liming)
	fmt.Printf("name: %s\tage:%d", liming.name, liming.age)
}

func Super(s *User) {
	s.age += 1
}

输入如下

Starting: C:\Users\livingbody\go\bin\dlv.exe dap --check-go-version=false --listen=127.0.0.1:9102 from c:\Users\livingbody\goworkspace\hello
DAP server listening at: 127.0.0.1:9102
Type 'dlv help' for list of commands.
name: li ming	age:12
Process 5424 has exited with status 0
Detaching
dlv dap (19172) exited with code: 0

注意:

  • & 操作符获取值的地址(取地址操作符)
  • 修改Super构造函数 (*User),意思指向类型User值的指针
  • 赋值一个指针比赋值一个复杂的结构消耗小,指针的真正用途就是分享它所指的值

本文正在参加技术专题18期-聊聊Go语言框架