Go基础快速入门

news2024/11/25 6:34:51

目录

一、变量相关基础语法

1、变量的定义以及赋值

2、变量的交换

3、匿名变量

4、变量的作用域

二、常量

三、基本数据类型

1、常见数据类型

2、数据类型的转换

四、运算符

五、函数

函数高级用法

函数也是一个类型

函数也是一个变量,也可以赋值

高阶、匿名函数

根据go语言数据类型特点,可以将一个函数作为另外一个函数的参数

闭包

六、基本语法


一、变量相关基础语法

1、变量的定义以及赋值

var name type

  • var 是声明变量关键字,可省略
  • name是变量名
  • type是变量类型

形式1(只定义不赋值)

var {

  name string

  age int 

}

形式2 (同时定义多个相同类型的变量)

var a,b,c int = 1,1,1

形式3 (简单写法,省略var关键字)

name := "XXX"

age := 18

打印变量类型

fmt.Printf("%T,%T",name,age)

打印内存地址

fmt.Printf("%p",&name)

当一个变量被声明之后,如果没有显示的给他赋值,系统会自动赋予该类型零值

  • 整形和浮点数默认值为0和0.0
  • 字符串默认值为空字符串
  • 布尔类型默认为false
  • 切片、函数、指针默认为nil 

2、变量的交换

var a int = 100

var b int = 200

a, b = b, a

3、匿名变量

匿名变量为一个下划线"_",任何赋值给这个标识符的值都将被抛弃,因为这些值不能再以后的代码中使用

package main

import "fmt"

func main() {
test2()
}

func test() (int, int) {
return 10, 20
}

func test2() {
a, b := test()
fmt.Println(a, b) // 10,20


// 其中第二个返回值用_接受,将不会再被使用
c, _ := test()
fmt.Println(c) // 30
}


#输出

10 20
10

匿名变量不会占用内存空间,不会分配内存,匿名变量之间也不会因为多次声明而无法使用

4、变量的作用域

(1)局部变量

在函数体内声明的变量称之为局部变量,它们的作用域在函数体内,函数的参数和返回值变量都属于局部变量

(2)全局变量

在函数体外声明的变量称之为全局变量,全局变量只要在一个源文件中定义,就可以在所有源文件中使用,全局变量声明必须以var关键字开头。GO语言中全局变量和局部变量名称可以相同,但是函数体内的局部变量会优先考虑,遵循就近原则

func main() {
	var temp int = 100

	if true {
		temp := 50
		fmt.Println(temp) // 50
	}
    fmt.Println(temp) // 100
 
}

二、常量

常量可以是任何数据类型,一旦定义将无法被改变

const identifier [type] = value

  • 显示类型定义:const b string = "abc"
  • 隐式类型定义:const b = "abc"
  • 多个常量定义的声明可以简写为 const a, b = 3.14, "lb"

iota,特殊常量,iota是go语言的常量计数器,iota在const关键字出现时将被重置为0(const内部的第一行),const中每新增一行常量声明将使iota计数一次(iota可以理解为const语句块中的行数索引)

const (

  a = iota  // 输出0 

  b    // 输出1 

  c    // 输出2 

  d = "haha"  // 输出haha iota 3

  e    // 输出haha iota 4

  f = iota  // 输出5 

  g   // 输出6 

)

iota常用于作枚举值

三、基本数据类型

1、常见数据类型

布尔类型

bool

整数型

有符号:

int8,int32,int64(默认)

无符号(大于等于0的值):

uint8,uint16,uint32,uint64

浮点型

float32,float64(默认64,默认保留6位小数)

float32小数点有效数字位数为6位 

float64小数点有效数字位数为14位 

尽量采用float64计算避免精度缺失

字符串

string

2、数据类型的转换

Go语言中不存在隐式类型转换,因此所有的类型转换必须显示的声明 ,高类型向低类型转换会存在精度缺失

a := 3 // int

b := 5.0 // float64

c := float64(a) // 将a转为float64

d := int(b) // int

四、运算符

算术运算符、位运算符、逻辑运算符等 和其他语言一致

五、函数

格式如下

func function_name([parameter list]) [return_types] {

}

func main() {
	test()
	test2("a")
	test3("b", 1)
	c := test4("c")
	d, e := test5("d", "e")
	fmt.Println(c)
	fmt.Println(d, e)
    test6(1,2,3)

}

// 无参无返回值函数
func test() {
	fmt.Println("无参无返回值函数")
}

// 有一个参数的函数
func test2(str string) {
	fmt.Println("有一个参数的函数" + str)
}

// 有两个参数的函数
func test3(str string, a int) {
	fmt.Printf("有一个参数的函数%s,%d\n", str, a)
}

// 有一个返回值的函数
func test4(str string) string {
	return str + "test4"
}

// 有多个返回值的函数
func test5(x, y string) (string, string) {
	return y, x
}

// 可变参数
func test6(num ...int) {
  sum := 0
  for i := 0; i < len(num); i++ {
  sum += num[i]
}
  fmt.Println(num[i])
}

#输出
无参无返回值函数
有一个参数的函数a
有一个参数的函数b,1
ctest4
e d
6
  • 值类型的数据:操作的是数据本身 int、string、bool、float、array、struct
  • 引用类型数据:操作的是数据的地址 指针,slice、map,chan管道, interface接口

其中array是固定长度数组,值类型,slice是可变长度数组,引用类型

array定义方式:

[4]int{1,2,3,4}

slice定义方式:

[]int{1,2,3,4} 

函数高级用法

  • 函数也是一个类型

func main() {
	// fu如果不加括号,函数就是一个变量,如果加了括号就变成函数的调用
	fmt.Printf("%T", fu) // func()
}

func fu() {

}

#输出 
func()

func main() {
	// fu如果不加括号,函数就是一个变量,如果加了括号就变成函数的调用
	fmt.Printf("%T", fu) // func(int, int)
}

func fu(a, b int) {

}

#输出
func(int, int)
  • 函数也是一个变量,也可以赋值

func main() {
	var fu2 func() int
	fu2 = fu
	fmt.Println("fu2=", fu2())
	fu3 := fu
	fmt.Println("fu3=", fu3())
}

func fu() int {
	return 1
}

#输出
fu2=1
fu3=1
  • 高阶、匿名函数

根据go语言数据类型特点,可以将一个函数作为另外一个函数的参数

fun1()、fun2() 将fun1()函数作为fun2()函数的参数,其中

fun2()函数叫做高阶函数

fun1()函数叫做回调函数

// 函数式编程
func main() {

	r1 := oper(1, 2, add)
	fmt.Println(r1)

	r2 := oper(1, 2, sub)
	fmt.Println(r2)

	r3 := oper(2, 1, func(a, b int) int {
		if b == 0 {
			fmt.Println("除数不能为0")
			return 0
		}
		return a / b
	})
	fmt.Println(r3)
}

func oper(a, b int, fu func(a, b int) int) int {
	res := fu(a, b)
	return res
}

func add(a, b int) int {
	return a + b
}

func sub(a, b int) int {
	return a - b
}
  • 闭包

闭包通常是指一个函数中引用了函数外部的变量,这样的函数就形成了一个闭包。闭包可以访问其外部函数的变量,甚至可以修改这些变量的值。在闭包中,变量的生命周期可以得到延长,因为它们被引用了,所以在闭包中仍然存在 
 

func main() {
	x := 10
	f := func() {
		fmt.Println(x)
	}
	f() // 输出 10
	x = 20
	f() // 输出 20
}

在上述代码中,我们定义了一个闭包 f ,它引用了函数外部的变量 x 。在调用 f() 时,它会输出 x 的值,因为闭包中引用的变量 x 实际上是指向函数外部的变量 x 。在之后修改了 x 的值之后,再次调用 f() 时,它会输出新的 x 的值。这就是闭包的一个典型应用场景。

func main() {

	f1 := increment()
	fmt.Println("f1=", f1())
	fmt.Println("f1=", f1())
	fmt.Println("f1=", f1())

	f2 := increment()
	fmt.Println("f2=", f2())
	fmt.Println("f2=", f2())
	fmt.Println("f2=", f2())

	fmt.Println("f1=", f1())
	fmt.Println("f1=", f1())
	fmt.Println("f1=", f1())

}

/*
*
定义了一个返回值为匿名函数的函数
*/
func increment() func() int {
	i := 0
	fun := func() int {
		i++
		return i
	}
	return fun
}

#输出
f1= 1
f1= 2
f1= 3
f2= 1
f2= 2
f2= 3
f1= 4
f1= 5
f1= 6

六、基本语法

1、输入输出fmt

fmt.Println() // 打印并换行

fmt.Printf() // 格式化输出

fmt.Print() // 打印并输出

var x int

var y float64

fmt.Scanln(&x,&y) // 接受输入

2、if语句

if a == b {

}

无中括号

3、switch语句

var int = x

switch var {

case var1:

case var2:

case var3,var4:

default:

}

break关键字可省略,只会匹配其中一个case

fallthrough关键字,可让原本不满足case条件的依然得到执行

	a := false

	switch a {
	case false:
		fmt.Println("false")
		fallthrough //cas穿透,不管下一个条件满不满足,都会执行
	case true:
		fmt.Println("true")
	}

# 同时输出false和true

 如果不需要穿透也可以使用break 

	a := 1

	switch a {
	case 1:
		fmt.Println("1")
		fallthrough //cas穿透,不管下一个条件满不满足,都会执行
	case 2:
		if a == 1 {
			break
		}
		fmt.Println("2")
	case 3:
		fmt.Println("3")
	}

# 只会输出1

4、for语句

	// 方式1
	for i := 1; i <= 10; i++ {

	}

	// 方式3
	i := 1
	for i <= 10 {
		i++
	}

	// 无限循环
	for {
       i++
	}

无中括号,无while语句、也可在for中使用continue,break等关键字和其他语言一致

类似java中foreach的语法

	str := "abc"

	for i, v := range str {
		fmt.Print(i)  // 打印索引
		fmt.Printf("%c", v)  // 打印具体值 %c是转换为字符,如果没有%c默认是打印ASCII值
	}
	#输出 0a1b2c

	// 编译报错 string 是不能修改的
	str[0] = 'd'

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

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

相关文章

视频监控汇聚平台EasyCVR视频监控录像的3种方式介绍

视频监控综合管理平台EasyCVR可以实现海量资源的接入、汇聚、计算、存储、处理等&#xff0c;平台具备轻量化接入能力&#xff0c;可支持多协议方式接入&#xff0c;包括主流标准协议GB28181、RTSP/Onvif、RTMP等&#xff0c;以及厂家私有协议与SDK接入&#xff0c;包括海康Eho…

STM32MP157驱动开发——按键驱动(tasklet)

文章目录 “tasklet”机制&#xff1a;内核函数定义 tasklet使能/ 禁止 tasklet调度 tasklet删除 tasklet tasklet软中断方式的按键驱动程序(stm32mp157)tasklet使用方法&#xff1a;button_test.cgpio_key_drv.cMakefile修改设备树文件编译测试 “tasklet”机制&#xff1a; …

谁说dubbo接口只能Java调用,我用Python也能轻松稿定

由于公司使用基于Java语言的Dubbo技术栈&#xff0c;而本人对Python技术栈更为熟悉。为了使不懂JAVA代码的同学也能进行Dubbo接口层的测试&#xff0c;总结一个通过python实现dubbo接口调用的实现方案。 01、实现原理 根据Dubbo官方文档中提到的&#xff1a;dubbo可以通过tel…

裂缝处理优化策略

裂缝缺陷检测:检测道路中的裂缝,无项目背景 数据:分为两类,正常、裂缝 方案介绍 数据预处理 将原始数据标签处理为两类,正常和裂缝原始图片均为320*480,使用的显卡为2080,内存足够,不进行图片大小调整模型后处理 二分类使用softmax处理,使用最大值作为结果分类效…

操作系统第五章 错题整理

5.1 设备控制器也就是IO控制器 A对于一些简单的IO设备 控制他也许用不到IO寄存器 B 只是设备控制器与CPU&#xff08;主机&#xff09;交互的接口 D 只是 接口 C 对IO控制器所接收到的CPU的信息进行译码 并送到外设中 IO逻辑是个芯片 数据通路是逻辑上的 实际上还是通过总线 …

SpringBoot复习:(2)Tomcat容器是怎么启动的?

SpringApplication的run方法包含如下代码&#xff1a; 其中调用的refreshContext代码如下&#xff1a; 其中调用的refresh方法片段如下&#xff1a; 其中调用的refresh方法代码如下&#xff1a; 其中调用的super.refresh方法代码如下&#xff1a; public void refresh() th…

STM32CUBUMX配置RS485(中断接收)--保姆级教程

———————————————————————————————————— ⏩ 大家好哇&#xff01;我是小光&#xff0c;嵌入式爱好者&#xff0c;一个想要成为系统架构师的大三学生。 ⏩最近在开发一个STM32H723ZGT6的板子&#xff0c;使用STM32CUBEMX做了很多驱动&#x…

python selenium爬虫自动登录实例

拷贝地址&#xff1a;python selenium爬虫自动登录实例_python selenium登录_Ustiniano的博客-CSDN博客 一、概述 我们要先安装selenium这个库&#xff0c;使用pip install selenium 命令安装&#xff0c;selenium这个库相当于机器模仿人的行为去点击浏览器上的元素&#xff0…

24 ==比较的是地址在.equals比较的是内容

public class Demo1 {public static void main(String[] args) {byte[] arr {97,98,99};String s1 new String(arr);String s2 new String(arr);System.out.println(s1s2);System.out.println(s1.equals(s2));} }

pgvector 源码分析

简介 pgvector 库是一种用于计算向量距离的库&#xff0c;它的核心是提供了聚类索引&#xff0c;棸类索引使用的算法是 kmeans&#xff08;相对于 kmeans 最主要的区别是初始化起点的位置&#xff09;。 pgvector 索引的存储结构 meta page → list page → entry page inse…

vue2和vue3关于class类的绑定以及style的绑定的区别

本篇为个人笔记 1.对于class类的绑定的区别 vue2:对于vue2而言&#xff0c;所有类的绑定都是基于对象{}来进行的 例如&#xff1a;单个类绑定 <div :class"{active:isActive}"></div> 多个类绑定&#xff1a; <div :class"{active,hasError…

CNN(卷积神经网络)的实现过程详解

概要 在图像处理领域&#xff0c;CNN(卷积神经网络)处于绝对统治地位&#xff0c;但对于CNN具体是如何用神经网络实现的&#xff0c;能找到的介绍要么是一大堆数学公式&#xff0c;要么是大段晦涩的文字说明&#xff0c;读起来很是辛苦&#xff0c;想写好一片完整的而且有深度的…

【java安全】RMI

文章目录 【java安全】RMI前言RMI的组成RMI实现Server0x01 编写一个远程接口0x02 实现该远程接口0x03 Registry注册远程对象 Client 小疑问RMI攻击 【java安全】RMI 前言 RMI全称为&#xff1a;Remote Method Invocation 远程方法调用&#xff0c;是java独立的一种机制。 RM…

软件检测报告CMA/CNAS标识加盖和不加盖的区别在哪?

在生活中&#xff0c;我们经常会听到CMA(中国计量认证)和CNAS(中国合格评定国家认可委员会)这两个标识&#xff0c;尤其在软件检测领域更是如此。那么&#xff0c;软件检测报告CMA/CNAS标识加盖和不加盖有哪些区别呢CMA和CNAS认可的软件测评机构又有什么样的好处呢?本文将为您…

各电商平台api接口开发系列(数据分享)接口封装高并发

淘宝API接口就是第三方公司&#xff0c;通过淘宝开放平台接入淘宝数据&#xff0c;并进行再开发&#xff0c;将功能封装打包成函数&#xff0c;客户只需要传入参数&#xff0c;接收返回值就可以实现具体功能&#xff0c;其他1688&#xff0c;京东&#xff0c;拼多多以及海外跨境…

[Android 13]Input系列--触摸事件在应用进程的分发和处理

hongxi.zhu 2023-7-21 Android 13 前面我们已经梳理了input事件在native层的传递&#xff0c;这一篇我们接着探索input事件在应用中的传递与处理&#xff0c;我们将按键事件和触摸事件分开梳理&#xff0c;这一篇就只涉及触摸事件。 一、事件的接收 从前面的篇幅我们知道&…

STM32CubeMX v6.9.0 BUG:FLASH_LATENCY设置错误导致初始化失败

背景 今天在调试外设功能时&#xff0c;发现设置了使用外部时钟之后程序运行异常&#xff0c;进行追踪调试并与先前可以正常运行的项目进行对比之后发现这个问题可能是由于新版本的STM32CubeMX配置生成代码时的BUG引起的。 测试环境 MCU: STM32H750VBT6 STM32CubeIDE: Versi…

Android 屏幕适配各种宽高比的手机

由于android 手机的屏幕宽高比样式太多了&#xff0c;在设计UI时&#xff0c;很多时候&#xff0c;会因为宽高比&#xff0c;分辨率不同会有展示上的差异。 我是这样解决的 在activity的onCreate方法前&#xff0c;调用&#xff1a; fun screenFit(context: Context) {val me…

Gitee 上传项目到仓库(上传文件夹)

一、将仓库下载到本地 1.首先打开仓库&#xff0c;点击下载压缩包 2.将下载的压缩包解压&#xff0c;并打开&#xff0c;在当前目录下打开 二、git操作 1.在文件当前目录打开git bash 2.初始化git git init 该命令会生成一个隐藏的.git文件夹 如果不是第一次使用&#…

自然语言处理14-基于文本向量和欧氏距离相似度的文本匹配,用于找到与查询语句最相似的文本

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下自然语言处理14-基于文本向量和欧氏距离相似度的文本匹配&#xff0c;用于找到与查询语句最相似的文本。NLP中的文本匹配是指通过计算文本之间的相似度来找到与查询语句最相似的文本。其中一种常用的方法是基于文本…