Go 语言入门指南(二) | 青训营

简介: Go 语言入门指南(二) | 青训营

Go 语言入门指南(二) | 青训营

这篇博客继续对go的基础语法进行整理。主要包括:函数、结构体。

一. go 的函数

函数其实除了参数、返回值的位置有些不同外,其实和其他语言的函数没什么区别,都是一样,注意函数名、参数列表和返回值即可。其次,go的函数传递的都是值,在函数内的修改并不影响函数外。

另外就是,理解函数也是一个类型,函数类型。例:func(int, string) int表示参数是intstring类型、返回值是int类型的函数。

函数参数、返回值也都可以是函数类型。

第二是理解defer:

defer 修饰的函数调用会在函数即将返回时最后执行,==但是传递的参数已经传递了,只是保存起来了==。一般用在释放资源(如文件描述符)的语句,当函数退出时最后释放资源。多个时最先defer修饰的最后执行(栈)。

go底层函数return时不是原子的,会分为两步:一是给返回值赋值;二是RET(返回),defer语句在两者之间,即返回值赋值之后执行defer语句,最后是RET

defer修饰的函数参数有嵌套的函数调用时会先执行嵌套的函数调用,得到具体的值保存起来,最后只执行一层函数调用。

最后是闭包的理解,闭包一般都是通过匿名函数实现的。这个理解起来确实有点抽象!看两个示例:

func f1(x int) func(int) int{
  return func(y int) int{
    // 这个x就是外部的变量
    return x + y
  }
}
func main(){
  // x : 100
  ret := f1(100)
  // y : 200
  ret2 := ret(200) // ret2: 300 int类型
}
func f1(f func()){
  // ...
  f() // 闭包后f1里调用的这个f就是f2
  // ...
}
func f2(x, y int){
  // ...
}
// f3参数是f2的那一套,返回值是f1的参数
func f3(f func(int,int), x,y int) func(){
  return func(){
    // 这里就相当于调用了传入的函数
    f(x, y)
  }
}
func main(){
  // 想要 f1(f2), 但是类型不匹配。借助f3  闭包,像一个跳板一样。
  // f3的返回值(匿名函数)刚好是f1的参数,而f3的参数是f2的。这样把原来需要传递两个int类型的参数包装成了一个匿名函数传给f1
  f1(f3(f2, 100, 200))
  f3(f2, 100, 200)() // 这样就相当于调用f2
  // 一般这样用
  ret := f3(f2, 100, 200)
  f1(ret)
}

在第二个示例中,想要 f1(f2), 但是类型不匹配。就借助f3 闭包,像一个跳板一样。

下面是一些常用的内置函数:

close:关闭channel

len:求长度

new:分配内存,用于值类型,如内置类型和数组、结构体。返回指针

make:分配内存,用于引用类型,如切片、mapchannel。返回类型本身

append:追加元素到数组、切片中

panic:处理错误,直接报错退出程序

recover:处理错误,尝试恢复

二. 结构体

go的结构体也很简单,看下面的实例:

// 在函数外声明
type person struct{
  name string
  age int
  hobby []string
}
func main(){
  // 初始化方法1
  var p person
  p.name = "sfsda"
  // 初始化方法2
  // new 返回结构体的指针, go中访问结构体变量没有 ->
  // 即使是结构体指针,也可以用 .
  var p1 = new(person)
  p1.name = " sdfsdf"
  // 初始化方法3
  var p3 = &person{   // &可以省略,加上表示p3是结构体指针 
    name: "fsdaf",
    age: 12,
  }
  p33 := &person{
    // ...
  }
  // 初始化方法4
  var p3 = &person{
    "fsdaf",
    12,
    []string{"asfk", "safkls"},
  }
}

需要注意的是:结构体函数传参一般==传指针==,不然拷贝数据量太大!!性能低(go中函数传参都是传值)。

这一篇文章就介绍到这里吧!下一篇是入门的最后一篇,总结一下接口和文件操作。

相关文章
|
1月前
|
Cloud Native 安全 Java
Go语言深度解析:从入门到精通的完整指南
🌟蒋星熠Jaxonic,Go语言探索者。深耕云计算、微服务与并发编程,以代码为笔,在二进制星河中书写极客诗篇。分享Go核心原理、性能优化与实战架构,助力开发者掌握云原生时代利器。#Go语言 #并发编程 #性能优化
388 43
Go语言深度解析:从入门到精通的完整指南
|
1月前
|
存储 安全 Java
【Golang】(4)Go里面的指针如何?函数与方法怎么不一样?带你了解Go不同于其他高级语言的语法
结构体可以存储一组不同类型的数据,是一种符合类型。Go抛弃了类与继承,同时也抛弃了构造方法,刻意弱化了面向对象的功能,Go并非是一个传统OOP的语言,但是Go依旧有着OOP的影子,通过结构体和方法也可以模拟出一个类。
161 1
|
2月前
|
Cloud Native 安全 Java
Go语言深度解析:从入门到精通的完整指南
🌟 蒋星熠Jaxonic,执着的星际旅人,用Go语言编写代码诗篇。🚀 Go语言以简洁、高效、并发为核心,助力云计算与微服务革新。📚 本文详解Go语法、并发模型、性能优化与实战案例,助你掌握现代编程精髓。🌌 从goroutine到channel,从内存优化到高并发架构,全面解析Go的强大力量。🔧 实战构建高性能Web服务,展现Go在云原生时代的无限可能。✨ 附技术对比、最佳实践与生态全景,带你踏上Go语言的星辰征途。#Go语言 #并发编程 #云原生 #性能优化
|
3月前
|
Cloud Native 安全 Java
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
287 1
|
3月前
|
Cloud Native Go API
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
364 0
|
3月前
|
Cloud Native Java Go
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
236 0
|
3月前
|
Cloud Native Java 中间件
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
213 0
|
3月前
|
Cloud Native Java Go
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
308 0
|
9月前
|
编译器 Go
揭秘 Go 语言中空结构体的强大用法
Go 语言中的空结构体 `struct{}` 不包含任何字段,不占用内存空间。它在实际编程中有多种典型用法:1) 结合 map 实现集合(set)类型;2) 与 channel 搭配用于信号通知;3) 申请超大容量的 Slice 和 Array 以节省内存;4) 作为接口实现时明确表示不关注值。此外,需要注意的是,空结构体作为字段时可能会因内存对齐原因占用额外空间。建议将空结构体放在外层结构体的第一个字段以优化内存使用。
|
9月前
|
运维 监控 算法
监控局域网其他电脑:Go 语言迪杰斯特拉算法的高效应用
在信息化时代,监控局域网成为网络管理与安全防护的关键需求。本文探讨了迪杰斯特拉(Dijkstra)算法在监控局域网中的应用,通过计算最短路径优化数据传输和故障检测。文中提供了使用Go语言实现的代码例程,展示了如何高效地进行网络监控,确保局域网的稳定运行和数据安全。迪杰斯特拉算法能减少传输延迟和带宽消耗,及时发现并处理网络故障,适用于复杂网络环境下的管理和维护。