go 第二章--顺序编程

【Go面试向】Go程序的执行顺序 【Go面试向】Go程序的执行顺序 一文带你梳理Go程序的执行顺序(包括包、init函数等等) 让你对Go程序的执行顺序清楚明白、更好地应对面试官的提问! 阅读详情

变量 相当于是对一块数据存储空间的命名。


  • 定义变量
var v1 int
var v2 string
var v3 [10]int // 数组
var v4 []int // 数组切片
var v5 struct {
f int
}
var v6 *int // 指针
var v7 map[string]int // map, key为string类型, value为int类型
var v8 func(a int) int

懒人写法

var (
v1 int
v2 string
)
  • go变量初始化
var v1 int = 10 // 正确的使用方式1
var v2 = 10 // 正确的使用方式2,编译器可以自动推导出v2的类型
v3 := 10 // 正确的使用方式3,编译器可以自动推导出v3的类型

出现在:=左侧的变量不应该是已经被声明过的,否则会导致编译错误。

  • 变量赋值
var v10 int
v10 = 123

//特别
i, j = j, i //i ,j交换,多重赋值
  • 匿名变量
func GetName() (firstName, lastName, nickName string) {
	return "May", "Chan", "Chibi Maruko"
}
//若只想获得nickName,则函数调用语句可以用如下方式编写:
_, _, nickName := GetName()
  • 常量是指编译期间就已知且不可改变的值。常量可以是数值类型(包括整型、
    浮点型和复数类型)、布尔类型、字符串类型

字面常量 go里无类型,只要这个常量在相应类型的值域
范围内,就可以作为该类型的常量,比如上面的常量12,它可以赋值给int、 uint、 int32、
int64、 float32、 float64、 complex64、 complex128等类型的变量。

常量定义

const Pi float64 = 3.14159265358979323846
const zero = 0.0 // 无类型浮点常量
const (
size int64 = 1024
eof = -1 // 无类型整型常量
)
const u, v float32 = 0, 3 // u = 0.0, v = 3.0,常量的多重赋值
const a, b, c = 3, 4, "foo"
// a = 3, b = 4, c = "foo", 无类型整型和字符串常

const mask = 1 << 3  //右值是常量表达式
  • 常量定义右值不能为运行时才出结果的值,会报错。

  • 预定义常量
    Go语言预定义了这些常量: true、 false和iota。
    iota比较特殊,可以被认为是一个可被编译器修改的常量,在每一个const关键字出现时被
    重置为0,然后在下一个const出现之前,每出现一次iota,其所代表的数字会自动增1。

const (		   // iota被重设为0
	c0 = iota // c0 == 0
	c1 = iota // c1 == 1
	c2 = iota // c2 == 2
)
const (
	a = 1 << iota // a == 1 (iota在每个const开头被重设为0)
	b = 1 << iota // b == 2
	c = 1 << iota // c == 4
)
const (
	u = iota * 42 // u == 0
	v float64 = iota * 42 // v == 42.0
	w = iota * 42 // w == 84
)
const x = iota // x == 0 (因为iota又被重设为0了)
const y = iota // y == 0 (同上)

const ( // iota被重设为0
	c0 = iota // c0 == 0
	c1 // c1 == 1
	c2 // c2 == 2
)
const (
	a = 1 <<iota      // a == 1 (iota在每个const开头被重设为0)
	b                      // b == 2
	c                      // c == 4
)
  • 枚举
const (
	Sunday = iota
	Monday
	Tuesday
	Wednesday
	Thursday
	Friday
	Saturday
	numberOfDays // 这个常量没有导出
)
  • 类型
Go语言内置以下这些基础类型:
 布尔类型: bool。
 整型: int8、 byte、 int16、 int、 uint、 uintptr等。
 浮点类型: float32、 float64。
 复数类型: complex64、 complex128。
 字符串: string。
 字符类型: rune。
 错误类型: error。
此外, Go语言也支持以下这些复合类型:
 指针(pointer)
 数组(array)
 切片(slice)
 字典(map)
 通道(chan)
 结构体(struct)
 接口(interface)

slice切片

1.slice数据结构

struct{
	p *void  //一个指向原生数组的指针
	num  *int  //数组切片中的元素个数
	len  *int   // 数组切片已分配的存储空间
}

2.创建数组切片

  • 基于数组
package main
import "fmt"
func main() {
	// 先定义一个数组
	var myArray [10]int = [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
	// 基于数组创建一个数组切片
	var mySlice []int = myArray[:5]
	fmt.Println("Elements of myArray: ")
	for _, v := range myArray {
		fmt.Print(v, " ")
	}
	fmt.Println("\nElements of mySlice: ")
	for _, v := range mySlice {
		fmt.Print(v, " ")
	}
	fmt.Println()
}
#运行结果为:
Elements of myArray:
1 2 3 4 5 6 7 8 9 10
Elements of mySlice:
1 2 3 4 5
  • 直接创建
创建一个初始元素个数为5的数组切片,元素初始值为0:
mySlice1 := make([]int, 5)
创建一个初始元素个数为5的数组切片,元素初始值为0,并预留10个元素的存储空间:
mySlice2 := make([]int, 5, 10)
直接创建并初始化包含5个元素的数组切片:
mySlice3 := []int{1, 2, 3, 4, 5}

3.动态增减元素

package main
import "fmt"
func main() {
	mySlice := make([]int, 5, 10)
	
	fmt.Println("len(mySlice):", len(mySlice)) //len 计算切片的元素个数
	fmt.Println("cap(mySlice):", cap(mySlice))  //cap 计算切片已分配的存储空间
}
mySlice = append(mySlice, 1, 2, 3)
函数append()的第二个参数其实是一个不定参数,我们可以按自己需求添加若干个元素,
甚至直接将一个数组切片追加到另一个数组切片的末尾:
mySlice2 := []int{8, 9, 10}
// 给mySlice后面添加另一个数组切片
mySlice = append(mySlice, mySlice2...)
等价
mySlice = append(mySlice, 8, 9, 10)
//加上省略号相当于把mySlice2包含的所有元素打散后传入

4.基于数组切片创建数组切片

oldSlice := []int{1, 2, 3, 4, 5}
newSlice := oldSlice[:3] // 基于oldSlice的前3个元素构建新数组切片

5.内容复制

slice1 := []int{1, 2, 3, 4, 5}
slice2 := []int{5, 4, 3}
copy(slice2, slice1) // 只会复制slice1的前3个元素到slice2中
copy(slice1, slice2) // 只会复制slice2的3个元素到slice1的前3个位置

map

map是一堆键值对的未排序集合

package main
import "fmt"
// PersonInfo是一个包含个人详细信息的类型
type PersonInfo struct {
	ID string
	Name string
	Address string
}
func main() {
	var personDB map[string] PersonInfo  //声明
	personDB = make(map[string] PersonInfo)  //创建
	// 往这个map里插入几条数据
	personDB["12345"] = PersonInfo{"12345", 			"Tom", "Room 203,..."}
	personDB["1"] = PersonInfo{"1", "Jack", "Room 101,..."}
	// 从这个map查找键为"1234"的信息
	person, ok := personDB["1234"]
	// ok是一个返回的bool型,返回true表示找到了对应的数据
	if ok {
		fmt.Println("Found person", person.Name, "with ID 1234.")
	} else {
		fmt.Println("Did not find person with ID 1234.")
	}
	delete(personDB, "1") //删除map中的一个元素
}

函数定义

package mymath
import "errors"
func Add(a int, b int) (ret int, err error) {
	if a < 0 || b < 0 { // 假设这个函数只支持两个非负数字的加法
		err= errors.New("Should be non-negative numbers!")
		return
	}
	return a + b, nil // 支持多重返回值
}

函数调用

import "mymath"// 假设Add被放在一个叫mymath的包中
// ...
c := mymath.Add(1, 2)

小写字母开头的函数只在本包内可见,大写字母开头的函数才
能被其他包使用。这个规则也适用于类型和变量的可见性。

不定参数

func myfunc(args ...int) {
	for _, arg := range args {
		fmt.Println(arg)
	}
}

1.不定参数类型
2.不定参数的传递
3.任意类型的不定参数

package main
import "fmt"
func MyPrintf(args ...interface{}) {
	for _, arg := range args {
		switch arg.(type) {
			case int:
				fmt.Println(arg, "is an int value.")
			case string:
				fmt.Println(arg, "is a string value.")
			case int64:
				fmt.Println(arg, "is an int64 value.")
			default:
				fmt.Println(arg, "is an unknown type.")
			}
	}
}
func main() {
	var v1 int = 1
	var v2 int64 = 234
	var v3 string = "hello"
	var v4 float32 = 1.234

	MyPrintf(v1, v2, v3, v4)
}
该程序的输出结果为:
1 is an int value.
234 is an int64 value.
hello is a string value.
1.234 is an unknown type.

多指返回
匿名函数与闭包

package main
import (
	"fmt"
)
func main() {
	var j int = 5
	a := func()(func()) {
	var i int = 10
	return func() {
		fmt.Printf("i, j: %d, %d\n", i, j)
	}
}()
a()
j *= 2
a()
}
上述例子的执行结果是:
i, j: 10, 5
i, j: 10, 10

错误处理

1.error接口
2.defer 一个函数中可以存在多个defer语句,因此需要注意的是, defer语句的调用是遵照
先进后出的原则,即最后一个defer语句将最先被执行.
3.panic()和recover()

Golang 协程顺序打印 Golang 协程顺序打印 A、B 两个协程分别打印 1、2、3、4 和 A,B,C,D 实现:定义 A、B 两个 channal,开 A、B 两个协程,A 协程输出[1, 2, 3, 4]、B 协程输出[A, B, C, D],通过两个独立的 channal 控制顺序,交替输出。 func main() { A := make(chan bool, 1) B := make(chan boo... 阅读详情

相关推荐

【Golang】深入探索Go语言中的网络编程实现方式

Go语言作为一种简洁而强大的编程语言,在网络编程方面表现尤为出色。其内置的net包提供了丰富的网络I/O基础设施,支持TCP、UDP协议,以及DNS解析等功能。 TCP提供可靠的、面向连接的通信,适用于需要确保数据传输完整性的场景。而UDP提供无连接的快速数据传输,适用于实时性要求较高但对数据完整性要求不高的场景。 Go语言的并发模型基于轻量级的goroutines和channels。每个网络请求都可以在自己的goroutine中处理,实现高效的并发。Channels用于在goroutines之间安全地

景天科技苑 5万+

【学习记录】【python】【tkinter】自学tkinter的简要记录

1. Lable Button 显示时间 from tkinter import * import time #给button按钮用的函数 def refresh_time(): timestring.set('%s'%time.ctime()) complexLabel.update() root=Tk() frame1=Frame(root) frame1.pack() ...

wldcmzy的博客 777

【Golang】关于Go语言中的包

Go语言中包的本质:文件夹,不同的文件夹可以存放不同的功能代码。 在Go语言中,每个源代码文件都必须属于一个包。包通常由一个或多个以.go为后缀的源文件组成,这些源文件通常存放在同一个目录下。 包的名称应该具有描述性,能够清楚地表达其功能。包名一般使用小写字母,并且和包所在的文件夹名保持一致。

景天科技苑 3万+

Tkinter之Radiobutton篇

''' Created on 2017年9月11日 @author: Nick ''' ''' Tkinter之Radiobutton篇 Radiobutton为单选按钮,即在同一组内只能有一个按钮被选中,每当选中组内的一个按钮时,其它的按钮自动改为非选中态,与其他控件不同的是:它有组的概念 ''' #_*_coding:utf-8_*_ import tkinter as tk from t

pengzhi5966885的博客 3323

从原理到调试:一次搞懂Camera Sensor的曝光、增益与帧率三角关系

本文深入解析Camera Sensor中曝光、增益与帧率之间的动态平衡关系,揭示低光环境下帧率下降的根本原因。通过实际调试案例和底层公式分析,帮助开发者理解如何优化相机参数设置,实现画质与流畅度的最佳平衡。

weixin_31310913的博客 429

microduck复刻实战:强化学习机器人从仿真训练到真机部署全攻略

强化学习是智能体通过与环境交互试错来学习最优策略的机器学习范式,在机器人控制领域,常借助物理仿真环境进行策略训练,以降低真实世界的试错成本。其核心原理是通过奖励信号引导策略网络迭代优化,PPO等算法则在稳定性和样本效率之间取得平衡。仿真训练的价值在于可批量验证控制策略,但仿真与真实硬件之间存在物理参数偏差,需通过域随机化等技术实现迁移。从四足机器人到仿生机器人,这类方案广泛应用于复杂运动控制任务。microduck作为一个典型的强化学习机器人项目,其复刻过程涉及环境搭建、奖励设计、PPO调参及Sim-to-

weixin_29061425的博客 357

Tkinter 模块

模块module为什么使用模块 它使得python文件更小,在代码中更容易找到东西 共享性,一旦创建了一个模块,可以在许多程序中使用它。下次在我们需要相同的功能时,可以直接使用。 不需要使用所有的模块,模块化意味着您可以使用不同的部件组合来完成不同的作业,灵活的实现需求。 桶块function就像是积木 可以把一个模块当做是一个构建块,可以在一个桶块中拥有尽可能少或者尽可能多的块,并且

qjk19940101的博客 2296

解决RocketMQ中@Bean配置DefaultMQProducer时的MQClientException问题

本文针对Spring Boot整合RocketMQ时,因在@Bean配置中手动调用DefaultMQProducer的start()方法而引发的MQClientException问题,深入剖析了其根本原因在于生命周期管理冲突。文章提供了简洁有效的解决方案——移除手动启动,让Spring容器自动管理,并给出了完整的配置示例与生产环境最佳实践。

rnn9storyteller的博客 688

tkinter使用基础

本来想学习写游戏,但是有个事件机制不会,就想着想学个GUI,结果我这一天停下来越听越没耐心--我为啥不直接学事件机制呢? 不过今天好不容易累死累活学的这么一点东西,还是做点总结吧. 写了十一个小例子,先贴在底下感受一下: import tkinter as tk app=tk.Tk()#使用该函数可以创建一个root,顶层窗口,注意k是小写 app.title("root window"...

realliyuhao的博客 364

UNet改进(47):Deformable Convolution在UNet中的集成与应用

本文提出了一种可变形U-Net(DeformableUNet)结构,通过在U-Net的双卷积模块中集成可变形卷积(DeformConv2d)来提升模型对物体形变和复杂结构的建模能力。传统卷积受限于固定感受野,而可变形卷积通过动态调整采样位置,能更好地适应不规则形状。实现中,在DoubleConv模块的第二个卷积层替换为可变形卷积,同时保持第一层为标准卷积以确保稳定性。实验表明,该方法在保持参数量基本不变的情况下,显著提升了分割精度(mIoU从0.712提升到0.743)。

2501_91516851的博客 201

CVPR 2023 中的半监督学习: FixMatch 的升级版 UniMatch

我们首先回顾下发表在 NeurIPS 2020 上的 FixMatch: Simplifying Semi-Supervised Learning with Consistency and Confidence,FixMatch 是一种更轻量的半监督分类方法。如下图所示,FixMatch 首先使用模型(带标签数据训练后的)对弱增强的未标记图像进行预测,生成伪标签。对于给定的图像,只有在模型产生高置信度的预测时,伪标签才会被保留。然后,在输入同一图像的强增强版本时,训练模型预测伪标签。

NJU phd 在读。 2632

对小甲鱼67课v.append(IntVar())的理解

from tkinter import * root=Tk() GIRLS=["西施","貂蝉","王昭君","杨玉环"] v=[] frame1=Frame() frame2=Frame() for girl in GIRLS: v.append(IntVar()) #用IntVar()创建一个IntVar类型的数值,此时...

finedayforu的博客 995

FPGA工程师面试试题集锦11~20

时钟抖动是指芯片的某一个给定点上时钟周期发生暂时性变化,也就是说时钟周期在不同的周期上可能加长或缩短。它是一个平均值为0的平均变量。

FPGA/MATLAB学习教程/源码/项目合作开发 678

《GO》第二章 顺序编程

第二章 2.1 变量 声明 示例:var v1 int 关键字:var 变量名:v1 变量类型:int 初始化 var v1 int = 10(var v1 int 这是声明; = 10这是初始化) var v2 = 10(编译器自动推导数据类型为int) v3 := 10(利用 := 表示声明和初始化一步完成),注意:出现在 := 左边的变量不能是已经被声明过的。 赋值 var v1 int v1 = 10 其余与别的语言基本一致 多重赋值 i, j = j, i//一行代码实现两

NH优快云MD的博客 300

JAX/JAXlib GPU 加速版本安装教程(CUDA)

本文介绍了在Windows WSL2+Ubuntu22.04环境下配置JAX/JAXlib GPU加速版本的详细步骤。使用RTX 4060显卡,安装CUDA 12.4和cuDNN 8.9.7驱动,通过Miniconda创建Python 3.9虚拟环境。具体步骤包括:安装Miniconda、配置CUDA环境变量、安装cuDNN驱动、下载并安装JAX/JAXlib。最后通过测试代码验证GPU加速功能,成功检测到GPU并完成矩阵运算。整个过程配有详细命令和截图说明,适合需要搭建JAX GPU开发环境的用户参考。

猿小白的博客 625

linux平台Modbus TCP测试

【代码】linux平台Modbus TCP测试。

无线互联&网络介绍 817

第二章 GO语言顺序编程

一:变量,对于声名变量Go引入了var 如:var str string 声名一批变量: var ( v1 int v2 string ) 变量初始化: var v1 int =10 var v2 =10 v3 :=10 二::=但含义是明确表...

LL0006的博客 281

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Go语言编程第二章顺序编程

参考书:Go语言编程 第二章 顺序编程 1 变量声明使用关键字var ,如下 var v1 int var v2 string var v3 [10]int //数组 var v4 []int //数组切片 var v5 struct { f int }...

haima95的博客 328

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

GO语言-第二节-顺序编程

const zero = 0.0 // 无类型浮点常量const (eof = -1 // 无类型整型常量const u, v float32 = 0, 3 // u = 0.0, v = 3.0,常量的多重赋值// a = 3, b = 4, c = "foo", 无类型整型和字符串常量Go的常量定义可以限定常量类型,但不是必需的。如果定义常量时没有指定类型,那么它 与字面常量一样,是无类型常量。常量定义的右值也可以是一个在编译期运算的常量表达式,比如。

weixin_60619404的博客 1807

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

第二章、顺序编程

一、变量 变量声明: 使用var关键字进行变量的声明,形式为:var 变量名 类型。示例如下: var v1 int // int型变量v1 var v2 *int // 指向int型的指针 var v3 [10]int // 存储有10个int型元素的数组v3 var v4 []int // int型...

HappyMrSpring 302

详解Golang中的go mod以及Golang包

本文介绍了Golang中的包管理和使用。主要内容包括:1) 包的三种类型(系统内置包、自定义包和第三方包);2) Go1.11后引入的gomod包管理工具及其常用命令;3) 自定义包的创建规则和导入方式;4) init()函数的特性和执行顺序;5) 第三方包的使用流程,包括查找、安装和依赖管理。文中重点说明了如何通过gomod管理项目依赖,以及如何定义和使用自定义包,同时介绍了匿名导入和包别名等实用技巧。

m0_75163045的博客 1610

Go(Golang)编程语言

(又称)是谷歌开发的一种静态强类型、编译型、,并的编程语言。Go于2009年11月正式宣布推出,成为开放源代码项目,并在Linux及Mac平台上进行了实现,后来追加了Windows系统下的实现。Go 语言语法与相近,但功能上有:内存安全,(垃圾回收),及 CSP-style。

m0_72572822的博客 4967

初探Golang顺序编程概念

Golang学习笔记,便于自己后续查看。 变量 变量是几乎所有编程语言中最基本的组成元素。从根本上说,变量相当于是对一块数据存储空间的命名,程序可以通过定义一个变量来申请一块数据存储空间,之后可以通过引用变量名来使用这块存储空间。 Go语言中的变量使用方式与C语言接近,但具备更大的灵活性。  变量声明 Go语言的变量声明方式与C和C++语言有明显的不同。对于纯粹的变量声明,G

职场里拉开差距的不是知识,而是认知! 9311

【Golang】Go语言中defer与return的精妙交织:探索延迟执行与返回顺序的微妙关系

【Golang】Go语言中defer与return的精妙交织:探索延迟执行与返回顺序的微妙关系 在Go语言中,defer 和 return 是两个非常重要的关键字,defer 和 return 同时出现时,其执行顺序可能会引发一些混淆和困惑。因此,本文将深入探讨Go语言中 defer 和 return 的执行顺序,并解释清楚它们之间的关系!

寸铁的博客 3443

golang初始化顺序

在GO程序中,初始化的几个结构通常为:包(package),常量(const),变量(var),init()和main()。 接下来我说一下这几个结构的执行顺序: 当 A 没有引入其他包的情况下执行顺序是:package > const > var > init() > main() 当 A 里引入了包 B 的时候会有一些变化,程序会先执行包 B 里面的import,c...

runner668的博客 2923

Go语言顺序编程

流程控制函数类型转换类型断言错误处理顺序编程是 Go 语言重要的一部分,但也是很小的一部分,后续将为大家带来更多 Go 语言的优美特性!

lll123789456hhh的博客 288
上一篇: go第一章
下一篇: 添加用户and授权root
龘麤三思
博客等级 码龄10年 11粉丝 50原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值