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中函数传参都是传值)。

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

相关文章
|
2月前
|
Cloud Native 安全 Java
Go语言深度解析:从入门到精通的完整指南
🌟蒋星熠Jaxonic,Go语言探索者。深耕云计算、微服务与并发编程,以代码为笔,在二进制星河中书写极客诗篇。分享Go核心原理、性能优化与实战架构,助力开发者掌握云原生时代利器。#Go语言 #并发编程 #性能优化
448 43
Go语言深度解析:从入门到精通的完整指南
|
2月前
|
存储 安全 Java
【Golang】(4)Go里面的指针如何?函数与方法怎么不一样?带你了解Go不同于其他高级语言的语法
结构体可以存储一组不同类型的数据,是一种符合类型。Go抛弃了类与继承,同时也抛弃了构造方法,刻意弱化了面向对象的功能,Go并非是一个传统OOP的语言,但是Go依旧有着OOP的影子,通过结构体和方法也可以模拟出一个类。
215 1
|
3月前
|
Cloud Native 安全 Java
Go语言深度解析:从入门到精通的完整指南
🌟 蒋星熠Jaxonic,执着的星际旅人,用Go语言编写代码诗篇。🚀 Go语言以简洁、高效、并发为核心,助力云计算与微服务革新。📚 本文详解Go语法、并发模型、性能优化与实战案例,助你掌握现代编程精髓。🌌 从goroutine到channel,从内存优化到高并发架构,全面解析Go的强大力量。🔧 实战构建高性能Web服务,展现Go在云原生时代的无限可能。✨ 附技术对比、最佳实践与生态全景,带你踏上Go语言的星辰征途。#Go语言 #并发编程 #云原生 #性能优化
|
4月前
|
Cloud Native 安全 Java
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
308 1
|
4月前
|
Cloud Native Go API
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
405 0
|
4月前
|
Cloud Native Java Go
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
263 0
|
4月前
|
Cloud Native Java 中间件
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
238 0
|
4月前
|
Cloud Native Java Go
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
343 0
|
10月前
|
存储 缓存 安全
Go 语言中的 Sync.Map 详解:并发安全的 Map 实现
`sync.Map` 是 Go 语言中用于并发安全操作的 Map 实现,适用于读多写少的场景。它通过两个底层 Map(`read` 和 `dirty`)实现读写分离,提供高效的读性能。主要方法包括 `Store`、`Load`、`Delete` 等。在大量写入时性能可能下降,需谨慎选择使用场景。
|
存储 负载均衡 监控
如何利用Go语言的高效性、并发支持、简洁性和跨平台性等优势,通过合理设计架构、实现负载均衡、构建容错机制、建立监控体系、优化数据存储及实施服务治理等步骤,打造稳定可靠的服务架构。
在数字化时代,构建高可靠性服务架构至关重要。本文探讨了如何利用Go语言的高效性、并发支持、简洁性和跨平台性等优势,通过合理设计架构、实现负载均衡、构建容错机制、建立监控体系、优化数据存储及实施服务治理等步骤,打造稳定可靠的服务架构。
301 1

热门文章

最新文章