go 基本语法(简单案例)

news2024/9/30 17:38:26

!注: 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 = 11
	if 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 = 1234
	var 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 string
	tempA, tempB, tempC, stringVla = 1, 2, 3, "测试字符串"
	fmt.Println(tempA)
	fmt.Println(tempB)
	fmt.Println(tempC)
	fmt.Println(stringVla)

在这里插入图片描述

重复申明

var intVal int
	intVal := 1

	intVal1 := 10
	fmt.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, "参数"+c1
	return a, b, c
}

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

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

常量元素自动+1(iota)

	// 在const常量中,使用iota进行计算,它后面的的值都会依次+1
	const (
		a = iota
		b
		c
	)
	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 = 12
	if a < 10 {
		fmt.Print("a<10")
	}

if-else


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

```bash
	var a int = 10
	var b int = 12
	if 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 := 0
	for {
		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集合中kv
	for i, s := range map1 {
		fmt.Println(i, s)
	}

	// 读取map集合中的k
	for i := range map1 {
		fmt.Println(i)
	}

	// 读取map集合中的v
	for _, 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集合中kv
	if 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 int
	if 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, "参数"+c1
	return a, b, c
}

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

package main

import "fmt"

/* 声明全局变量 */
var g int

func main() {

   /* 声明局部变量 */
   var a, b int

   /* 初始化参数 */
   a = 10
   b = 20
   g = a + b

   fmt.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 = 20
	var tempAge *int
	tempAge = &i // 指向变量存储地址
	fmt.Println(name, age, tempAge)

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

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

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

type Books struct {
	title   string
	author  string
	subject string
	book_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])

	// 默认下限为 0
	fmt.Println("numbers[:3] ==", numbers[:3])

	// 默认上限为 len(s)
	fmt.Println("numbers[4:] ==", numbers[4:])

	//append 数组元素追加
	// 追加一个10
	numbers = 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-v
		for i, s := range currentMap {
			fmt.Println(i, s)
		}
		fmt.Println("取出集合k")
		// 取出集合中的k
		for i := range currentMap {
			fmt.Println(i)
		}
		fmt.Println("取出集合v")
		// 取出集合中的v
		for _, s := range currentMap {
			fmt.Println(s)
		}

	}
	// 删除集合元素
	// 根据key删除
	fmt.Println("源集合", currentMap)
	delete(currentMap, 1)
	fmt.Println("删除后集合", currentMap)

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

	// 类型转换
	// int转float
	var a int = 10
	var b float64 = float64(a)
	fmt.Println("int转float64", b)

	//string转int
	var str string = "10"
	var num int
	num, _ = strconv.Atoi(str)
	fmt.Println("string转int", num)

	//int转string
	num1 := 1234
	strVlue := strconv.Itoa(num1)
	fmt.Printf("整数 %d  转换为字符串为:'%s'\n", num1, strVlue)

在这里插入图片描述

21.接口 interface

	// go变量 对象在前,类型在后
	var phone Phone

	// java 类型在前,对象在后
	//private Object object

	phone = 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.coloradmin.cn/o/837027.html

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

相关文章

短信端口和端口短信的概念

什么是端口短信 端口短信是针对点到点短信来说的,点到点即手机直接发给手机的,端口就是使用软件发给手机的。软件是移动运营商合作的内容提供商开发的,遵守运营商的规范,有端口号。 短信端口是什么意思? 是针对点到点短信来说的,点对点即手机直接发给手机的,端口就是使用软…

C# PaddleDetection 版面分析

效果 项目 代码 using OpenCvSharp; using OpenCvSharp.Extensions; using Sdcb.PaddleDetection; using Sdcb.PaddleInference; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Lin…

java:JUnit单元测试

背景 一般软件测试分为白盒测试和黑盒测试 黑盒测试&#xff1a;就是现在一般测试人员的工作点点点&#xff0c;只要功能正常就行白盒测试&#xff1a;需要关注代码的具体执行过程&#xff0c;是需要写代码的 JUnit 框架是进行白盒测试使用的。 不使用单元测试框架 没有单…

看一家头部实干派互娱公司如何玩转DataOps?

DataOps的概念自首次被提出至今已有8年&#xff0c;并在2018年被Gartner纳入数据管理技术成熟度曲线。从实施上看&#xff0c;当下DataOps仍处在发展初期&#xff0c;鲜少企业或团队能据此真正沉淀一套方法论或技术产品的体系。不过&#xff0c;随着越来越多的企业开启DataOps实…

【flink】使用flink-web-ui提交作业报错

使用WebUI提交作业出现错误。 错误截图&#xff1a; 弹框信息&#xff1a; Server Response Message: org.apache.flink.runtime.rest.handler.RestHandlerException: Could not execute application.at org.apache.flink.runtime.webmonitor.handlers.JarRunHandler.lambda$h…

行业追踪,2023-08-04

自动复盘 2023-08-04 凡所有相&#xff0c;皆是虚妄。若见诸相非相&#xff0c;即见如来。 k 线图是最好的老师&#xff0c;每天持续发布板块的rps排名&#xff0c;追踪板块&#xff0c;板块来开仓&#xff0c;板块去清仓&#xff0c;丢弃自以为是的想法&#xff0c;板块去留让…

idea使用protobuf

本文参考&#xff1a;https://blog.csdn.net/m0_37695902/article/details/129438549 再次感谢分享 什么是 protobuf &#xff1f; Protocal Buffers(简称protobuf)是谷歌的一项技术&#xff0c;用于结构化的数据序列化、反序列化。 由于protobuf是跨语言的&#xff0c;所以用…

进程与线程、线程创建、线程周期、多线程安全和线程池(ThreadPoolExecutor)

目录 进程与线程线程和进程的区别是什么&#xff1f;线程分两种&#xff1a;用户线程和守护线程线程创建四种方式run()和start()方法区别&#xff1a;为什么调用 start() 方法时会执行 run() 方法&#xff0c;为什么不能直接调用 run() 方法&#xff1f;Runnable接口和Callable…

最强实战,接口自动化测试Python3+Requests+Unittest+ddt框架封装(详细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 接口自动化测试框…

RDP远程桌面服务的RD授权过期解决方法

RDP远程桌面服务的RD授权过期解决方法 一、打开远程桌面会话主机配置二、打开远程桌面授权模式属性三、选择远程桌面授权模式四、添加许可证服务器五、选择确定保存设置六、RD授权设置成功七、查看“授权诊断” 一、打开远程桌面会话主机配置 二、打开远程桌面授权模式属性 双…

35岁,不是体能衰老的分界线!

35岁&#xff0c;不是体能衰老的分界线 1. 35岁以上求职者同比增长14.9%&#xff0c;体能下滑成为35岁以上年龄群体的标签。 2. 35岁人群开始感觉经常失眠、腰背痛和肥胖&#xff0c;体力不济可能是常年累积的不规律作息和饮食习惯导致。 3. 35岁以后体能下滑&#xff0c;无法高…

视频添加字幕

1、依靠ffmpeg 命令 package zimu;import java.io.IOException;public class TestSrt {public static void main(String[] args) {String videoFile "/test/test1.mp4";String subtitleFile "/test/test1.SRT";String outputFile "/test/testout13…

openpnp - 吸嘴站(Nozzle Tip Changer)的选择

文章目录 openpnp - 吸嘴站(Nozzle Tip Changer)的选择概述磁铁吸嘴库带抱轴的吸嘴库我的吸嘴库选择我的吸嘴库实现 - 磁铁吸嘴库吸嘴座主体吸嘴座上盖我的吸嘴库实现 - 带抱轴的吸嘴库吸嘴座主体拔吸嘴时的受力挡板抱轴层上盖备注END openpnp - 吸嘴站(Nozzle Tip Changer)的选…

同城预约上门小程序开发:为用户带来便捷与个性化的服务体验“

上门服务小程序开发具有许多优势&#xff0c;下面我将介绍一些重要的优点。   方便快捷&#xff1a;上门服务小程序可以让用户随时随地通过手机进行预约和安排上门服务。无需等待电话回复或亲自前往实体店面&#xff0c;用户可以直接在小程序中选择时间、服务类型和地点&…

openGauss学习笔记-29 openGauss 高级数据管理-UNION子句

文章目录 openGauss学习笔记-29 openGauss 高级数据管理-UNION子句29.1 语法格式29.2 示例29.2.1 UNION29.2.2 UNION ALL openGauss学习笔记-29 openGauss 高级数据管理-UNION子句 UNION计算多个SELECT语句返回行集合的并集。UNION内部的SELECT语句必须拥有相同数量的列&#…

《剑指offer》(4)二叉树篇

二叉树深度有两种递归思路&#xff1a; &#xff08;1&#xff09;递归返回当前的深度&#xff0c;当root是空时&#xff0c;返回0 &#xff08;2&#xff09;将当前深度和节点一起传入递归&#xff0c;设置全局变量&#xff0c;每经过一个节点就更新全局变量的值。 方法一&a…

控制台窗口和powershell运行服务会卡住的解决办法

问题描述 在 windows 环境下开发的时候&#xff0c;使用 PowerShell 执行 python.exe test.py 等命令经常会出现程序会卡在不动的问题。这时候需要到控制台按一下回车程序才会继续往下执行。 解决办法 原因: 控制台开启了快速编辑模式的情况下&#xff0c;如果鼠标选中了文本…

弘扬“两弹一星”精神,勇攀科学技术高峰——道本科技商业大学党日活动圆满落幕

2023年8月2日&#xff0c;道本科技与商业大学携手举办了一场主题为“弘扬‘两弹一星’精神&#xff0c;勇攀科学技术高峰”的党日活动。本次活动旨在了解党领导下的中国核工业发展历程&#xff0c;传承和弘扬“两弹一星”精神&#xff0c;同时展示道本科技创新产品&#xff0c;…

【力扣】链表题目总结

文章目录 链表基础题型一、单链表翻转、反转、旋转1.反转链表2.反转链表II——反转部分链表3.旋转链表4.K个一组翻转链表5.反转偶数长度组的节点 二、删除单链表中的结点1.删除链表的结点2.删除未排序链表中的重复节点3.删除已排序链表中的重复元素I——重复元素只剩下一个4.删…

带你简单认识淘宝 API 接口,API接口适用场景和业务类型

淘宝 API 接口是为开发电商类应用程序而设计的一套完整的、跨浏览器、跨平台的接口规范。通过开放接口&#xff0c;开发者可以不改变现有系统&#xff0c;直接在原有系统上实现新功能。该规范于 2007 年发布&#xff0c;是目前业界唯一完整覆盖电商系统各相关业务领域的接口标准…