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

简介: 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值的指针
  • 赋值一个指针比赋值一个复杂的结构消耗小,指针的真正用途就是分享它所指的值
目录
相关文章
|
3月前
|
程序员 Go 云计算
2023年学习Go语言是否值得?探索Go语言的魅力
2023年学习Go语言是否值得?探索Go语言的魅力
|
3月前
|
缓存 NoSQL Go
通过 SingleFlight 模式学习 Go 并发编程
通过 SingleFlight 模式学习 Go 并发编程
|
12天前
|
存储 Rust Go
Go nil 空结构体 空接口有什么区别?
本文介绍了Go语言中的`nil`、空结构体和空接口的区别。`nil`是预定义的零值变量,适用于指针、管道等类型;空结构体大小为0,多个空结构体实例指向同一地址;空接口由`_type`和`data`字段组成,仅当两者均为`nil`时,空接口才为`nil`。
Go nil 空结构体 空接口有什么区别?
|
6天前
|
数据采集 监控 Java
go语言编程学习
【11月更文挑战第3天】
23 7
|
16天前
|
设计模式 测试技术 Go
学习Go语言
【10月更文挑战第25天】学习Go语言
19 4
|
2月前
|
Go
Go to Learn Go之结构体
Go to Learn Go之结构体
37 5
|
2月前
|
编译器 Go
go语言学习记录(关于一些奇怪的疑问)有别于其他编程语言
本文探讨了Go语言中的常量概念,特别是特殊常量iota的使用方法及其自动递增特性。同时,文中还提到了在声明常量时,后续常量可沿用前一个值的特点,以及在遍历map时可能遇到的非顺序打印问题。
|
2月前
|
存储 Shell Go
Go语言结构体和元组全面解析
Go语言结构体和元组全面解析
|
3月前
|
JSON 中间件 Go
go语言后端开发学习(四) —— 在go项目中使用Zap日志库
本文详细介绍了如何在Go项目中集成并配置Zap日志库。首先通过`go get -u go.uber.org/zap`命令安装Zap,接着展示了`Logger`与`Sugared Logger`两种日志记录器的基本用法。随后深入探讨了Zap的高级配置,包括如何将日志输出至文件、调整时间格式、记录调用者信息以及日志分割等。最后,文章演示了如何在gin框架中集成Zap,通过自定义中间件实现了日志记录和异常恢复功能。通过这些步骤,读者可以掌握Zap在实际项目中的应用与定制方法
130 1
go语言后端开发学习(四) —— 在go项目中使用Zap日志库
|
2月前
|
存储 Go
Go: struct 结构体类型和指针【学习笔记记录】
本文是Go语言中struct结构体类型和指针的学习笔记,包括结构体的定义、成员访问、使用匿名字段,以及指针变量的声明使用、指针数组定义使用和函数传参修改值的方法。