go 基本语法(简单案例)

!注: go中 对变量申明很是严格,申明了,在没有使用的情况下,也会产生编译错误
1.行分隔符
一行就是代码,无;分割,如果需要在一行展示,需要以;分割,否则编译出错

	fmt.Println("hello world")fmt.Println(111)fmt.Println("hello world");fmt.Println(111)

2.标识符
标识符就是常量或者func命名方式:
不能使用关键字,数字开头,运算符 如:case(关键字),1ab(数字开头无效字符),a+b(编译不通过)之类的来命名;也不允许使用预定义标识符 如 byte bool等

3.关键字
25个关键字

break	    default	     func	   interface	select
case	    defer	     go	       map	        struct
chan	    else	     goto	   package	    switch
const	    fallthrough	 if	       range	    type
continue	for	         import	   return	    var

4.预定义标识符
36个预定义标识符

append	bool	byte	cap	    close	complex	complex64	complex128	uint16
copy	false	float32	float64	imag	int	    int8	    int16		uint32
int32	int64	iota	len  	make	new	    nil   		panic		uint64
print	println	real	recover	string	true	uint		uint8		uintptr

5.go语言中的空格
go语言中的空格 为了提高代码的阅读性个规范,通常两个变量之间必须要有空格隔开,在if条件中是为了提高阅读性,在常量赋值中,没有空格隔开,编译出错。

const a int = 10
const b string = "ccc"func main() {var c int = 11if c < a {fmt.Print("a<10")} else {fmt.Print("a>10")}
}

6.格式化字符串
Go 语言中使用 fmt.Sprintf 或 fmt.Printf 格式化字符串并赋值给新串:

Sprintf 根据格式化参数生成格式化的字符串并返回该字符串。
Printf 根据格式化参数生成格式化的字符串并写入标准输出。
等同于 java中string.format()

    // %d 表示整型数字,%s 表示字符串var tempCode = 1234var endDate = "2023-12-24"var url = "Code=%d&endDate=%s"fmt.Println(fmt.Printf(url, tempCode, endDate))var target_url = fmt.Sprintf(url, tempCode, endDate)fmt.Println(target_url)

在这里插入图片描述
7.变量
go语言中变量同一个func中具有唯一性
只能申明一次
申明变量使用 var申明

var tempA, tempB, tempC int = 1, 2, 3 //申明同一种类型的变量可以采用这种方式fmt.Println(tempA)fmt.Println(tempB)fmt.Println(tempC)

先申明多个变量,在统一赋值

var tempA, tempB, tempC int //申明同一种类型的变量可以采用这种方式var stringVla stringtempA, tempB, tempC, stringVla = 1, 2, 3, "测试字符串"fmt.Println(tempA)fmt.Println(tempB)fmt.Println(tempC)fmt.Println(stringVla)

在这里插入图片描述

重复申明

var intVal intintVal := 1intVal1 := 10fmt.Println(intVal + intVal1)

在这里插入图片描述
go中 对变量申明很是严格
申明了,在没有使用的情况下,也会产生编译错误
在这里插入图片描述
函数调用

	//cc := "测试"var testStr string = "测试"v1, v2, v3 := disposeData(9, 1, testStr)fmt.Print(v1, v2, v3)
}func disposeData(d int, d1 int, c1 string) (int, int, string) {a, b, c := 1+d, 2+d1, "参数"+c1return a, b, c
}

在这里插入图片描述
8.常量
go中常量以 const(a,b,c)这种格式进行来命名常量
普通常量

	const (a = "常量测试"b = len(a)c = unsafe.Sizeof(a))

常量元素自动+1(iota)

	// 在const常量中,使用iota进行计算,它后面的的值都会依次+1const (a = iotabc)fmt.Print(a, b, c)

在这里插入图片描述
9.语言运算符
这里和传统很多语言中的一样就 不写代码实例了
运算符 描述 实例

==	检查两个值是否相等,如果相等返回 True 否则返回 False。	(A == B) 为 False
!=	检查两个值是否不相等,如果不相等返回 True 否则返回 False。	(A != B) 为 True
>	检查左边值是否大于右边值,如果是返回 True 否则返回 False。	(A > B) 为 False
<	检查左边值是否小于右边值,如果是返回 True 否则返回 False。	(A < B) 为 True
>=	检查左边值是否大于等于右边值,如果是返回 True 否则返回 False。	(A >= B) 为 False
<=	检查左边值是否小于等于右边值,如果是返回 True 否则返回 False。	(A <= B) 为 True

逻辑运算符

&&	逻辑 AND 运算符。 如果两边的操作数都是 True,则条件 True,否则为 False。	(A && B) 为 False
||	逻辑 OR 运算符。 如果两边的操作数有一个 True,则条件 True,否则为 False。	(A || B) 为 True
!	逻辑 NOT 运算符。 如果条件为 True,则逻辑 NOT 条件 False,否则为 True。	!(A && B) 为 True

赋值运算符

=	简单的赋值运算符,将一个表达式的值赋给一个左值	C = A + B 将 A + B 表达式结果赋值给 C
+=	相加后再赋值	C += A 等于 C = C + A
-=	相减后再赋值	C -= A 等于 C = C - A
*=	相乘后再赋值	C *= A 等于 C = C * A
/=	相除后再赋值	C /= A 等于 C = C / A
%=	求余后再赋值	C %= A 等于 C = C % A
<<=	左移后赋值	C <<= 2 等于 C = C << 2
>>=	右移后赋值	C >>= 2 等于 C = C >> 2
&=	按位与后赋值	C &= 2 等于 C = C & 2
^=	按位异或后赋值	C ^= 2 等于 C = C ^ 2
|=	按位或后赋值	C |= 2 等于 C = C | 2

其他运算符

&	返回变量存储地址	&a; 将给出变量的实际地址。
*	指针变量。	*a; 是一个指针变量 int  4

运算符优先级
由高到低

5	* / % << >> & &^
4	+ - | ^
3	== != < <= > >=
2	&&
1	||

10.语言条件语句
if if-else 嵌套if switch selct
if语句

	var a int = 10//var b int = 12if a < 10 {fmt.Print("a<10")}

if-else

var a int = 10//var b int = 12if a < 10 {fmt.Print("a<10")}else {fmt.Print("a>10")}```
嵌套if```bashvar a int = 10var b int = 12if a == 10 {fmt.Println("a<10")if b > 10 {fmt.Println("b>10")}}

switch
等于某个值走某一项

switch marks {case 90: grade = "A"case 80: grade = "B"case 50,60,70 : grade = "C"default: grade = "D"  }switch {case grade == "A" :fmt.Printf("优秀!\n" )    case grade == "B", grade == "C" :fmt.Printf("良好\n" )      case grade == "D" :fmt.Printf("及格\n" )      case grade == "F":fmt.Printf("不及格\n" )default:fmt.Printf("差\n" );}fmt.Printf("你的等级是 %s\n", grade );  

select
接收到某个值走某一个

   c1 := make(chan string)c2 := make(chan string)go func() {time.Sleep(1 * time.Second)c1 <- "one"}()go func() {time.Sleep(2 * time.Second)c2 <- "two"}()for i := 0; i < 2; i++ {select {case msg1 := <-c1:fmt.Println("received", msg1) // 获取到c1的值执行case msg2 := <-c2:fmt.Println("received", msg2) // 获取到c2的值执行}} 

11.循环语句
这里的循环分为for,for-each 循环两种
for循环

sum := 0for {sum++          // 无限循环if sum == 10 { // 增加条件跳出循环fmt.Print(sum + 1)break}}

for-each循环
array数组循环

// for-each//数组strings := []string{"abc", "ABC"}for i, s := range strings {fmt.Println(i, s) //rang==java总的 each strings 数组名 i元素index,s元素value index从0开始}
map集合循环
// map集合map1 := make(map[int]string) //定义一个int(key) string(value)类型的map集合map1[1] = "a"map1[2] = "b"map1[3] = "c"map1[4] = "d"// 取出map集合中kvfor i, s := range map1 {fmt.Println(i, s)}// 读取map集合中的kfor i := range map1 {fmt.Println(i)}// 读取map集合中的vfor _, s := range map1 {fmt.Println(s)}

在这里插入图片描述

map集合和array数组结合使用测试

// map集合map1 := make(map[int]int)                        //定义一个int(key) string(value)类型的map集合tempInts := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} //创建一个集合并赋值//var arr []int // 创建一个空数组if !reflect.ValueOf(tempInts).IsNil() {for i, tempInt := range tempInts {map1[i] = tempInt}} else {fmt.Println("集合为空!")}// 取出map集合中kvif len(map1) > 0 {for i, s := range map1 {fmt.Println(i, s)}}

在这里插入图片描述
在循环体当中通常还有一些控制语句

break 语句	经常用于中断当前 for 循环或跳出 switch 语句
continue 语句	跳过当前循环的剩余语句,然后继续进行下一轮循环。
goto 语句	将控制转移到被标记的语句。

用到最多的通常为上面两个
12.函数
函数也叫方法
一个函数当中扩了传参的参数,有些情况还包括了返回参数

	// 函数调用var maxVal = maxVal(10, 12)fmt.Println(maxVal)// 返回多个参数v1, v2, v3 := disposeData(1, 2, "测试")fmt.Println(v1, v2, v3)
}// 返回最大值,类型为int型
func maxVal(val1, val2 int) int {var res intif val1 > val2 {res = val1} else {res = val2}return res
}// 返回多个参数
func disposeData(d int, d1 int, c1 string) (int, int, string) {a, b, c := 1+d, 2+d1, "参数"+c1return a, b, c
}

在这里插入图片描述
13.变量
变量分为全局变量和局部变量两种;通常函数内的变量为局部变量,函数外为全局变量

package mainimport "fmt"/* 声明全局变量 */
var g intfunc main() {/* 声明局部变量 */var a, b int/* 初始化参数 */a = 10b = 20g = a + bfmt.Printf("结果: a = %d, b = %d and g = %d\n", a, b, g)
}

14.数组

// 数组语法格式为
var arrayName [size]dataType// 初始化数组
var arr1[10] int//初始化数组并赋值,两种都可以,根据自己需求选择
var numbers = [5]int{1, 2, 3, 4, 5}
tempInts := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} 

具体操作不在这写了,循环操作那里有

15.指针
指针:go中的指针就是实体中的某个属性,有指针名称,指针名称,指针地址;除了这个以外,还有空指针的概念
这个通常用于校验一个数据是否为空时使用。
指针使用流程:

1.定义指针变量。
2.为指针变量赋值。
3.访问指针变量中指向地址的值。
4.在指针类型前面加上 * 号(前缀)来获取指针所指向的内容。

	// 指针var name *string //指向string类型var age *int     //指向int型var i int = 20var tempAge *inttempAge = &i // 指向变量存储地址fmt.Println(name, age, tempAge)

在这里插入图片描述
空指针

if(ptr != nil)     // ptr 不是空指针 
if(ptr == nil)    // ptr 是空指针

16.结构体
这个结构和java中的实体对象一样,只有赋值和取值方式有所区别

type Books struct {title   stringauthor  stringsubject stringbook_id int
}// 创建一个新的结构体fmt.Println(Books{"go", "fetter", "go教程", 1111})// k-v形式结构fmt.Println(Books{title: "go", author: "fetter", subject: "go教程", book_id: 1111})// 忽略某个字段fmt.Println(Books{title: "go", author: "fetter", subject: "go教程"})// 使用对象接收并获取单个字段book := Books{title: "go", author: "fetter", subject: "go教程", book_id: 1234}fmt.Println(book.book_id)

在这里插入图片描述

17.切片
切片等元素截取,拼接

	// 切片 数组元素截取,拼接//s := arr[startIndex:endIndex]// 开始位置,结束位置;开始位置包括本身,结束位置到结束的前一位numbers := []int{0, 1, 2, 3, 4, 5, 6, 7, 8}printSlice(numbers)// 打印原始切片fmt.Println("numbers ==", numbers)//打印子切片从索引1(包含) 到索引4(不包含)fmt.Println("numbers[1:4] ==", numbers[1:4])// 默认下限为 0fmt.Println("numbers[:3] ==", numbers[:3])// 默认上限为 len(s)fmt.Println("numbers[4:] ==", numbers[4:])//append 数组元素追加// 追加一个10numbers = append(numbers, 10)fmt.Println(numbers)// 追加两个元素numbers = append(numbers, 10, 12)fmt.Println(numbers)}func printSlice(x []int) {fmt.Printf("len=%d cap=%d slice=%v\n", len(x), cap(x), x)
}

在这里插入图片描述

18.语言范围range
Go 语言中 range 关键字用于 for 循环中迭代数组(array)、切片(slice)、通道(channel)或集合(map)的元素。在数组和切片中它返回元素的索引和索引对应的值,在集合中返回 key-value 对。
具体的操作上面有这里不做实例了

19.map集合
map是一个k-v集合,增加删除查询都是基于k来做的

// 创建一个集合var currentMap = make(map[int]string)currentMap[1] = "a"currentMap[2] = "b"currentMap[3] = "c"// 遍历集合if len(currentMap) > 0 {fmt.Println("取出集合k-v")// 取出集合中的k-vfor i, s := range currentMap {fmt.Println(i, s)}fmt.Println("取出集合k")// 取出集合中的kfor i := range currentMap {fmt.Println(i)}fmt.Println("取出集合v")// 取出集合中的vfor _, s := range currentMap {fmt.Println(s)}}// 删除集合元素// 根据key删除fmt.Println("源集合", currentMap)delete(currentMap, 1)fmt.Println("删除后集合", currentMap)

在这里插入图片描述
20.类型转换
一种类型转为另一种类型

	// 类型转换// int转floatvar a int = 10var b float64 = float64(a)fmt.Println("int转float64", b)//string转intvar str string = "10"var num intnum, _ = strconv.Atoi(str)fmt.Println("string转int", num)//int转stringnum1 := 1234strVlue := strconv.Itoa(num1)fmt.Printf("整数 %d  转换为字符串为:'%s'\n", num1, strVlue)

在这里插入图片描述

21.接口 interface

	// go变量 对象在前,类型在后var phone Phone// java 类型在前,对象在后//private Object objectphone = new(NokiaPhone)phone.call()
}type Phone interface {call()
}type NokiaPhone struct {
}// 实现了Phone中的call()接口
func (nokiaPhone NokiaPhone) call() {fmt.Println("I m nokiaPhone , I call you phone")
}

在这里插入图片描述
22.异常处理
异常处理有捕获异常,返回响应前端,也有自己处理,这里直接打印了。

type error interface {Error() string
}
func Sqrt(f float64) (float64, error) {if f < 0 {return 0, errors.New("math: square root of negative number")}
}

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

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

相关文章

Vue3 事件处理简单应用

去官网学习→事件处理 | Vue.js 运行示例&#xff1a; 代码&#xff1a;HelloWorld.vue <template><div class"hello"><h1>Vue 事件处理</h1><button v-on:click"numb 1">点击加1-----{{ numb }}</button><br/&…

安防监控视频融合EasyCVR平台接入RTSP流后设备显示离线是什么原因?

安防监控视频EasyCVR视频汇聚融合平台基于云边端智能协同架构&#xff0c;具有强大的数据接入、处理及分发能力&#xff0c;平台支持海量视频汇聚管理、全网分发、按需调阅、鉴权播放、智能分析等视频能力与服务。平台开放度高、兼容性强、可支持灵活拓展与第三方集成&#xff…

设计模式行为型——观察者模式

目录 什么是观察者模式 观察者模式的实现 观察者模式角色 观察者模式类图 观察者模式举例 观察者模式代码实现 观察者模式的特点 优点 缺点 使用场景 注意事项 实际应用 什么是观察者模式 观察者模式&#xff08;Observer Pattern&#xff09;是一种行为型设计模式…

73. 矩阵置零

题目链接&#xff1a;力扣 解题思路&#xff1a; 方法一&#xff1a;比较容易想到的方向&#xff0c;使用两个数组row和col保存有0的行或者列&#xff0c;然后将有0的那一行或那一列的所有元素都设置为0 AC代码 class Solution {public void setZeroes(int[][] matrix) {in…

Python爬虫——爬虫时如何知道是否代理ip伪装成功?

前言 在进行爬虫时&#xff0c;我们可能需要使用代理IP来伪装自己的身份&#xff0c;以避免被网站封禁。如何判断代理IP是否伪装成功呢&#xff1f;本篇文章将围绕这个问题展开讲解&#xff0c;同时提供Python代码示例。 1. 确认代理IP地址 首先&#xff0c;我们需要确认代理…

数据结构——双链表

我宁愿靠自己的力量&#xff0c;打开我的前途&#xff0c;而不愿求有力者垂青 文章目录 双线向链表各接口函数名或变量名 双向链表接口实现源码 快速索引【头文件及函数声明】 双向链表接口实现 双向链表的构造分析 双向链表的定义及初始化 双向链表的插入和删除 往期…

Mac显示隐藏文件夹

1、设置隐藏文件可见 defaults write com.apple.finder AppleShowAllFiles TRUE 2、killall Finder killall Finder

TS协议概念及传输流程

TS协议之PAT&#xff08;节目关联表&#xff09;TS协议之PMT&#xff08;节目映射表&#xff09;TS协议之PES&#xff08;ES数据包&#xff09; 概要 TS协议是一种媒体流封装协议&#xff0c;类似于MP4&#xff0c;FLV等&#xff0c;可以将编码好的视频流(H164,H265等)和音频…

性能测试的结果如何解读和分析?

性能测试的结果如何解读和分析&#xff1f; 性能测试的结果需要进行细致的解读和分析&#xff0c;以便找出系统的瓶颈和问题&#xff0c;并提出改进建议。以下是一些常见的性能测试结果指标和解读方法&#xff1a; 1. 响应时间&#xff1a;响应时间是指系统处理请求所需的时间…

【5G NR】逻辑信道、传输信道和物理信道的映射关系

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…

【ztree应用】基于jquery实现带检索功能的ztree文件夹折叠效果(附源码下载)

文章目录 写在前面涉及知识效果展示1、搭建dom2、引入ztree和jquery3、实现搜索功能及调用4、源码分享1&#xff09;百度网盘2&#xff09;123云盘3&#xff09;邮箱留言 总结 写在前面 前些日子&#xff0c;领导要求做一个关于数据库管理的工具&#xff0c;主要想支持一些批量…

Java个人博客系统--基于Springboot的设计与实现

目录 一、项目概述 应用技术 接口实现&#xff1a; 数据库定义&#xff1a; 数据库建表&#xff1a; 博客表数据库相关操作&#xff1a; 添加项⽬公共模块 加密MD5 页面展示&#xff1a;http://121.41.168.121:8080/blog_login.html 项目源码&#xff1a;https://gitee…

Android监听电量变化广播(动态广播代码)

activity_main.xml中 <?xml version"1.0" encoding"utf-8"?><LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent&quo…

Ajax入门

文章目录 axios体验axios-查询参数常用请求方法数据提交 axios错误处理 axios体验 引入axios库 使用axios语法 axios({url: 目标资源地址 }).then((result)>{// 对服务器返回的数据做后续处理 })完整实例 <!DOCTYPE html> <html lang"en"><head&g…

知识图谱推荐系统研究综述

基于协同过滤的推荐是当前应用最为广泛的推荐方法,但也存在着新用户或新项目的冷启动以及数据稀疏等问题。针对上述两种方法出现的问题,研究者进一步提出了混合推荐系统。混合推荐系统结合上述两种方法的优点,可以有效缓解其中的不足,增加推荐的准确性。但是,混合推荐系统…

Redis 加入服务列表自启动

1、下载reids windows版本&#xff0c;选择zip格式下载 2、解压zip&#xff0c;并进入路径&#xff1b; 3、命令提示符&#xff08;cmd&#xff09; 进入解压后的路径后&#xff0c;输入指令&#xff1a;redis-server --service-install redis.windows.conf&#xff1b; 4、如…

Vue Router 的query和params的区别?

区别一&#xff1a; &#xff08;1&#xff09;query相当于get请求&#xff0c;页面跳转的时候可以在地址栏看到请求参数 &#xff08;2&#xff09;params相当于post请求&#xff0c;参数不会在地址栏中显示&#xff0c;所以用params传值相对安全 &#xff08;简记&#xff1…

适配器模式(C++)

定义 将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 应用场景 在软件系统中&#xff0c;由于应用环境的变化&#xff0c;常常需要将“一些现存的对象 ”放在新的环境中应用&#xff0c;但是新环境要求…

最长公共子序列

dp思路&#xff1a;dp[i][j]代表第一个字符串前i个字符和第二个字符串前j个字符的最长公共子序列的长度 其中对于某一个状态dp[j][j]存在四种情况&#xff1a; 1、s[i],t[j]都包括在最长公共子序列中&#xff0c;则有转移&#xff1a; 2、s[i],t[j]都不包含在最长公共子序列中&…

20.5 HTML 媒体

1. video视频标签 video视频标签: 是HTML中用于在网页上嵌入视频的元素.常用的视频标签属性: - src属性: 指定视频文件的URL地址. - controls属性: 用于显示视频播放控件(如播放按钮, 进度条等), 使用户能够控制视频的播放. - width和height: 指定视频的宽度和高度. - autopla…