Golang的基本使用

目录

变量的声明

Golang常用容器

defer

有趣的多态

结构体标签和reflect 反射

Golang最强的协程

channel

go可能造成的内存泄露

变量的声明

方法 1:有类型,有var,不赋值 在Golang中默认值为0

方法 2:无类型,有var,赋值

方法 3:无类型,无var,赋值

多变量声明

多变量声明,无类型无var

如下

package mainimport ("fmt"
)func main() {//var 用于声明变量var a int // 方法 1:有类型,有var,不赋值 在Golang中默认值为0fmt.Println("a=", a)var b = 0 //方法 2:无类型,有var,赋值fmt.Println("b=", b)c := 0 //方法 3:无类型,无var,赋值fmt.Println("c=", c)//多变量声明var d, e int = 1, 2 //fmt.Println("d=", d, "e=", e)//多变量声明,无类型无varf, g := "string", 3fmt.Println("f=", f, "e=", g)}

常量 

定义后无法改变

Golang常用容器

静态数组(slice)

package mainimport "fmt"func main() {//数组,静态数组var arr [5]intarr[0] = 1arr[1] = 2arr[2] = 3arr[3] = 4arr[4] = 5fmt.Println(arr)      // 输出: [1 2 3 4 5]fmt.Println(len(arr)) // 输出: 5}

动态数组(array)

跟静态数组的区别,就是 不用规定数组大小,自动分配自动扩容

package mainimport "fmt"func main() {//跟静态数组的区别,就是 不用规定数组大小,自动分配自动扩容slice := []int{1, 2, 3, 4, 5}fmt.Println(slice)      // 输出: [1 2 3 4 5]fmt.Println(len(slice)) // 输出: 5
}

自动扩容演示

slice两倍扩容

package mainimport "fmt"func main() {//跟静态数组的区别,就是 不用规定数组大小,自动分配自动扩容slice := []int{1, 2, 3, 4, 5}fmt.Println(slice)      // 输出: [1 2 3 4 5]fmt.Println(len(slice)) // 输出: 5fmt.Println(cap(slice)) //当前容量为5slice = append(slice, 6)fmt.Println(len(slice)) // 输出: 数据数量=6fmt.Println(cap(slice)) // 输出: 10 slice两倍扩容
}

字符串(string)

package mainimport "fmt"func main() {str := "Hello, World!"fmt.Println(str)         // 输出: Hello, World!fmt.Println(len(str))    // 输出: 13fmt.Printf("%s", str[0]) // 输出: H 
}

映射(map)

package mainimport "fmt"func main() {m := make(map[int]string)m[1] = "apple"m[2] = "banana"m[3] = "orange"for i := 1; i < 4; i++ {fmt.Printf("m=%s\n", m[i])}
}

defer

类似c++中的析构函数

defer作用:

        释放占用的资源

        捕捉处理异常

        输出日志

func main() {defer func() {fmt.Println("析构函数")}()fmt.Println("main start")//===//业务//===fmt.Println("main off")
}

当然Golang中有资源自动回收,不用自己析构,当然有特殊的例子下面讲了协程再说

有趣的多态

import "fmt"// 两个类
type Student struct {age int
}type Programmer struct {age int
}// 同一调用
func whatJob(p Person) {p.job()
}func growUp(p Person) {p.growUp()
}// 一个万能接口
type Person interface { //intetface 万能变量job()growUp()
}// Student 函数方法
func (p Student) job() {fmt.Println("I am a student.")return
}func (p *Student) growUp() {p.age += 1return
}// Programmer 函数方法
func (p Programmer) job() {fmt.Println("I am a programmer.")return
}func (p *Programmer) growUp() {p.age += 10return
}func main() {qcrao := Student{age: 18}whatJob(&qcrao)growUp(&qcrao)fmt.Println(qcrao)stefno := Programmer{age: 100}whatJob(&stefno)growUp(&stefno) //同一个函数,调用结果不同fmt.Println(stefno)
}

结构体标签和reflect 反射

import ("fmt""reflect"
)type resume struct {Name string `json:"电影" doc:"喜剧之王"`
}func findDoc(stru interface{}) map[string]string {t := reflect.TypeOf(stru).Elem() //reflect 反射 逆推类型doc := make(map[string]string)for i := 0; i < t.NumField(); i++ {doc[t.Field(i).Tag.Get("json")] = t.Field(i).Tag.Get("doc")}return doc}func main() {var stru resumedoc := findDoc(&stru)fmt.Printf("电影字段=%s\n", doc["电影"])
}

Golang最强的协程

package mainimport ("fmt""time"
)func main() {go func() {fmt.Println("我是协程")}()fmt.Println("我是主协程")time.Sleep(1 * time.Second) // 等待一秒钟,让协程有足够的时间执行
}

身为一个cpp学者,当看见Golang写协程那么方便,异常兴奋

那么协程用什么与主协程通信呢?

channel

管道(channel)接收和发送数据都是阻塞的

package mainimport ("fmt""time"
)func main() {c := make(chan int) //创建管道(channel),而且接收和发送数据都是阻塞的go func() {fmt.Println("我是协程")c <- 666 //向管道内写入666}()a := <-c //管道类读出fmt.Println("我是主协程")fmt.Println("a=", a)time.Sleep(1 * time.Second) // 等待一秒钟,让协程有足够的时间执行
}

go可能造成的内存泄露

func main() {ch := func() <-chan int {ch := make(chan int)go func() {for i := 0; ; i++ {ch <- i}} ()return ch}()for v := range ch {fmt.Println(v)if v == 5 {break}}
}

使用 valgrind 运行 程序,发现 协程内存并没有回收

问题:

上面的程序中后台Goroutine向管道输入自然数序列,main函数中输出序列。

但是当break跳出for循环的时候,后台Goroutine就处于无法被回收的状态了。

因为 Goroutine还在向管道中写数据,主协程已经退出

改正:

使用context

package mainimport ("context""fmt"
)func main() {//WithCancel(ctx Context, cancel CancelFunc)=(名 Context,处理函数 CancelFunc)ctx, cancel := context.WithCancel(context.Background()) //context.Background() 处理 Goroutinech := func(ctx context.Context) <-chan int {ch := make(chan int)go func() {for i := 0; ; i++ {select {case <-ctx.Done():returncase ch <- i:}}}()return ch}(ctx)for v := range ch {fmt.Println(v)if v == 5 {cancel()break}}
}

当main函数在break跳出循环时,通过调用 context 来通知后台Goroutine退出

这样就避免了Goroutine的泄漏。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/17225.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

强大友好的Nginx扩展:VeryNginx

VeryNginx&#xff1a; 简化Web管理&#xff0c;增强网站防御- 精选真开源&#xff0c;释放新价值。 概览 VeryNginx是一个基于lua-nginx-module&#xff08;openresty&#xff09;的高效、友好的Nginx版本&#xff0c;专为满足现代Web应用的需求而设计。它不仅提供了强大的We…

spring-boot 3.2 + spring-boot-starter-quartz + HikariCP配置

第一步&#xff0c;添加 spring-boot-starter-quartz 的 maven 依赖。 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency> 第二步&#xff0c;在 ap…

Adobe Animate AN v24.0.2 安装教程 (动画特效设计及合成工具)

Adobe系列软件安装目录 一、Adobe Photoshop PS 25.6.0 安装教程 (最流行的图像设计软件) 二、Adobe Media Encoder ME v24.3.0 安装教程 (视频和音频编码渲染工具) 三、Adobe Premiere Pro v24.3.0 安装教程 (领先的视频编辑软件) 四、Adobe After Effects AE v24.3.0 安装…

什么是元编程?JavaScript中怎么体现?

历史小剧场 老子曾经说过&#xff0c;最好的国家&#xff0c;是老百姓不知道统治者是谁。从某个角度讲&#xff0c;万历同志做到了。—《明朝那些事儿》 前言 一句话&#xff0c;元编程就是通过代码来编程代码。 即通过代码来生产、修改、操作代码的一种能力。 很多语言都有这…

SSE(Server Sent Event) 踩坑留念

整条链路是 客户端A --> 服务端 A —> 服务端 B 我负责服务端 A 此时要注意 Client 中的 processes 的写法 Post(value “/v2/xx”, processes MediaType.TEXT_EVENT_STREAM) 这样写是一直报错的 改成下面的写法才可以 Post(value “/v2/xx”, processes MediaT…

【荐闻】空中目标检测综述

https://t.zsxq.com/tgUjbhttps://t.zsxq.com/tgUjb 这篇综述论文全面回顾了空中目标检测的最新进展&#xff0c;包括五个不平衡问题、相关方法、实际应用和性能评估。以下是对论文内容的详细描述&#xff1a; 1&#xff09;引言&#xff1a;介绍了空中目标检测的概念&#x…

Ubuntu22.04之扩展并挂载4T硬盘(二百三十三)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

容器(Container)的详细介绍

容器&#xff0c;作为现代软件开发和部署的核心技术之一&#xff0c;已经成为云计算、微服务架构等领域的基石。容器技术通过提供轻量级的虚拟化环境&#xff0c;实现了应用程序的快速部署、迁移和扩展&#xff0c;极大地提高了软件开发的效率和灵活性。本文将详细介绍容器的概…

工控屏(触摸屏)怎么连接电脑

一、使用USB接口连接 连接方法&#xff1a;使用USB线连接触摸屏和电脑&#xff0c;触摸屏会自动识别并连接到电脑上。 二、使用HDMI接口连接 连接方法&#xff1a;1.首先要确认您的触摸屏是否有HDMI接口&#xff1b;2.将一端连接到触摸屏&#xff0c;另一端连接到电脑&#…

选择排序与堆排序

博主主页: 码农派大星. 数据结构专栏:Java数据结构 数据库专栏:MySQL数据库 关注博主带你了解更多数据结构知识 1.选择排序 第一种方法:直接定义一个 i下标 和 j下标(ji1) ,再定义minIdex下标 让 minIdex i, 开始遍历数组,过程中 如果j下标的值大于minIdex下标的值就交换,然…

JVM 常见配置参数

JVM 配置常见参数 Java虚拟机的参数&#xff0c;在启动jar包的时候通过java 命令指定JVM参数 -options表示Java虚拟机的启动参数&#xff0c;class为带有main()函数的Java类&#xff0c;args表示传递给主函数main()的参数。 一、系统查看参数: -XX:PrintVMOptions可以在程序…

超越连接:ZL-450边缘网关全面评测与应用案例

前言 在现代工业自动化和智能设备管理的背景下&#xff0c;对实时数据通信与设备监控的需求日益增加。ZL450边缘网关作为一款先进的串口通信解决方案&#xff0c;不仅满足了这些要求&#xff0c;还通过其多样的连接性和高效的数据处理能力&#xff0c;为企业带来了显著的效率提…

Flutter 中的 Offstage 小部件:全面指南

Flutter 中的 Offstage 小部件&#xff1a;全面指南 在Flutter中&#xff0c;Offstage是一个用于控制子组件是否出现在屏幕上的布局小部件。通过Offstage&#xff0c;你可以轻松地将组件从屏幕上隐藏或显示&#xff0c;而不需要从widget树中移除它。这对于实现条件渲染、动画效…

R可视化:另类的箱线图

介绍 方格状态的箱线图 加载R包 knitr::opts_chunk$set(echo TRUE, message FALSE, warning FALSE) library(patternplot) library(png) library(ggplot2) library(gridExtra)rm(list ls()) options(stringsAsFactors F)导入数据 data <- read.csv(system.file(&qu…

IDEA 上方添加左右箭头按钮

IDEA 版本&#xff1a;2021.3.3 按钮&#xff1a; 左箭头&#xff08;Back&#xff09;&#xff08;快捷键&#xff1a;Ctrl Alt 左箭头&#xff09; 右箭头&#xff08;Forward&#xff09;&#xff08;快捷键&#xff1a;Ctrl Alt 右箭头&#xff09; 日常写代码中经常…

决策树-id3算法要点和难点具体应用

ID3(Iterative Dichotomiser 3)是一种决策树学习算法,由Ross Quinlan在1986年提出。ID3算法使用信息增益(Information Gain)作为选择划分属性的标准,旨在生成一颗决策树来对实例进行分类。下面简要介绍ID3算法的主要步骤: 数据准备: 确保数据集是分类问题,且特征值都…

拼多多笔试题目

大致题意&#xff1a; 题意&#xff1a;给定一个长度为n (n < 1 e 5 1e^5 1e5) 的数组&#xff0c;进行q(< 1 e 5 1e^5 1e5)次对原数组的查询&#xff0c;问最小进行几次操作使得第k大的数为x (< 1 e 9 1e^9 1e9)&#xff0c;每次操作可以选择数组的某个数加1。 思路…

大字体学生出勤记录系统网页源码

源码介绍 上课需要一个个点名记录出勤情况&#xff0c;就借助AI制作了一个网页版学生出勤记录系统&#xff0c; 大字体显示学生姓名和照片&#xff0c;让坐在最后排学生也能看清楚&#xff0c;显示姓名同时会语音播报姓名&#xff0c; 操作很简单&#xff0c;先导入学生姓名…

设计模式 19 模板模式 Template Pattern

设计模式 19 模板模式 Template Pattern 1.定义 模板模式&#xff08;Template Pattern&#xff09;是一种行为设计模式&#xff0c;它定义了一个算法的骨架&#xff0c;将一些步骤的具体实现延迟到子类中。在模板模式中&#xff0c;定义了一个抽象类&#xff0c;其中包含了一个…

设计模式:原型模式(Prototype)

设计模式&#xff1a;原型模式&#xff08;Prototype&#xff09; 设计模式&#xff1a;原型模式&#xff08;Prototype&#xff09;模式动机模式定义模式结构时序图模式实现在单线程环境下的测试在多线程环境下的测试模式分析优缺点适用场景应用场景模式扩展应用实例实例 1&am…