Go语言基本语法

张开发
2026/4/13 18:27:59 15 分钟阅读

分享文章

Go语言基本语法
Go的基本语法Go的基本语法Go的特点基本格式基本语法注释Go的变量变量的声明变量的赋值变量的类型Go的输入输出标准输入fmt.Scanfmt.Scanlnfmt.Scanfbufio输入标准输出fmt.Printfmt.Printlnfmt.Printffmt.SprintfGo的占位符输出九九乘法表Go的数据类型整型有符号整型无符号整型无符号整数类型指针浮点型复数进制类型字符字符串转义字符字符串的截取字符串的转换Int转stringstring转int字符串的遍历按字节数遍历按字符数遍历字符串的常用方法Contains/Count字符串的拼接字符串的查找替换字符串的切割大小写转换Trim/TrimSuffix判断开头/结尾布尔类型练习运算符算数运算符关系运算符逻辑运算符位运算符赋值运算其他运算符流程控制分支结构循环结构GotoGo的基本语法Go的特点Go是编译型语言 静态类型语言 强类型语言静态类型语言在进行变量声明时需指定数据类型在编译时会进行类型检查灵活性低但性能高动态类型语言中变量存放的是引用复制数据类型可以随时变化只有在运行时才会校验类型合法性Golang里面设置文件和代码模板// -*- coding: utf-8 -*-// Time: ${DATE} ${TIME}// Author: TomDeng// Email: 2623984159qq.com// File: ${NAME}.py基本格式packagemainimportfmt每个go文件都需要在文件的开头声明它是属于哪一个包每个执行的go文件都必须有一个main包main包里面包含一个main函数程序入口基本语法Go是函数式编程范式的语言代码由函数来组织函数也可以作为参数传递Go程序只会从main函数开始运行到其他文件Go 语言是把编码风格写入语法的语言//这样写会报错functom(){}// 大括号必须与函数名同行functom(){}注释// 单行注释/* 多行注释 */Go的变量变量的声明Go变量名的命名规则必须是数字字母下划线组成不能以数字开头关键字不能作为变量名可以但不建议使用中文定义变量varusernamestring// 声明字符串varnumberint// 声明整数类型varb10//声明 赋值varcint20// 声明 赋值 这里的int并没有用变量的赋值Go的同一个语句块里面不支持重复声明同一个变量packagemainfuncmain(){varnamestringnametomdeng// name : Tomdeng 在同一个main函数里面声明会报错// var name string 这也会报错fori:1;i10;i{varnamestringnameabc// 这里不会报错}}变量的类型Go的变量分为局部变量、全局变量、常量全局变量声明在main函数在外的变量作用域为整个Go程序可以被使用和修改局部变量声明在局部里面的变量函数内或者循环、判断作用域为声明的代码块常量使用const声明的变量一旦定义不能被修改且定义是应该对其进行赋值注意局部变量如果定义了但是没有使用会报错consta1000const(x10y e//y,e 如果不定义常量表达式赋值则与前面保持一样)使用示例packagemainimportfmt// 全局变量varnamestringTomdengvar(age20sexstring)// 常量const(grand7pro湖南)funcmain(){// 局部变量可以使用 变量名 : value 进行赋值name:Denguniversity:HUAUNfmt.Println(name,university,age)}Go的输入输出标准输入输出包fmtbufiofmt提供Scan()、Scanln()、Scanf()等函数直接读取输入底层其实也用到了缓冲但封装得很彻底用户感知不到优点是代码少、上手快。bufio基于 “缓冲区” 设计 —— 先把大量输入数据读到内存缓冲区再从缓冲区读取减少系统调用次数适合读取大文本、高频输入场景。标准输入使用fmt包输入fmt.Scan使用空格或换行符进行下一个变量的输入 必须传入指定数量的值否则不退出packagemainimportfmtfuncmain(){test_Scan()}functest_Scan(){varnamestringfmt.Println(请输入名字)fmt.Scan(name)fmt.Println(name)}fmt.Scanln输入时换行则提前结束输入多变量输入时使用空格进行下一个变量的输入packagemainimportfmtfuncmain(){test_Scanln()}functest_Scanln(){varnamestringvarageintfmt.Println(请输入名字和年龄)fmt.Scanln(name,age)fmt.Println(name,age)}fmt.Scanf必须按照指定的格式进行输入否则读取不到传入的数据packagemainimportfmtfuncmain(){test_scanf()}functest_scanf(){varnamestringfmt.Println(请输入名字)fmt.Scanf(name is %s,name)// 只有驶入name is tomdeng 才能读取到tomdengfmt.Println(name)}bufio输入packagemainimport(bufioos)funcmain(){//test_Scan()//test_Scanln()//test_scanf()test_bufio()}functest_bufio(){read:bufio.NewReader(os.Stdin)fmt.Println(读取输入中)line,err:read.ReadString(\n)fmt.Println(line is,line,error is,err)}标准输出标准输出包fmtfmt提供Print、Println、Printffmt.Print末尾不会自动换行funcmain(){//test_Scan()//test_Scanln()//test_scanf()//test_bufio()test_Print()}functest_Print(){fmt.Print(Im tom)fmt.Print(Im back)}fmt.Println末尾自动换行funcmain(){test_Println()}functest_Println(){fmt.Println(Im tom)fmt.Println(Im back)}fmt.Printf可以使用占位符输出funcmain(){test_Printf()}functest_Printf(){name:tomdengfmt.Printf(my name is %s\n,name)}fmt.Sprintf格式换字符串packagemainimportfmtfuncmain(){name:tomdengall_info:fmt.Sprintf(my name is %s,name)fmt.Println(all_info)}Go的占位符占位符作用示例输出%v按值的默认格式输出万能占位符fmt.Printf(%v, 123)123%v结构体输出时显示字段名fmt.Printf(%v, struct{Name string}{张三}){Name:张三}%#v输出值的 Go 语法表示如类型 值fmt.Printf(%#v, 123)123int/struct{Name string}{Name:张三}结构体%T输出值的类型fmt.Printf(%T, 3.14)float64%%输出一个百分号转义fmt.Printf(%.2f%%, 99.9)99.90%%s字符串fmt.Printf(%s, hello)hello%c单个字符fmt.Printf(%c, 97)aASCII 码转字符%d十进制整数fmt.Printf(%d, 010)8010 是八进制转十进制%x十六进制小写 / 大写fmt.Printf(%x %X, 15, 15)f F输出九九乘法表funcmain(){fori:1;i10;i{forj:1;ji;j{fmt.Printf(%d * %d %d\t,i,j,i*j)}fmt.Println()}}Go的数据类型整型有符号整型int8最大127int16int32int64int根据操作系统的位数进行分配无符号整型uint8uint16uint32uint64uint无符号类型在进行运算时要注意溢出问题相减为负无符号整数类型指针uintptr浮点型float32符号位1位 8位指数位 23位小数位float64符号位1位 11位指数位 52位小数位decimal精确的浮点型浮点数是不精确的小数位通过二进制存储funcmain(){varf1float32varf2float32varf3float32f10.111111f20.222222f30.333333iff1f2f3{fmt.Println(相等)}else{fmt.Println(不相等)}//不相等}复数complex64complex128Go里面的复数虚部用的是iPython里面的复数虚部用的是j进制类型0b二进制0o八进制0x十六进制unsafe.Sizeof可以查看元素所占的字符数funcmain(){varcintc10//8个字节 64位 unsafe.Sizeof 查看大小fmt.Println(c,unsafe.Sizeof(c))// 进制类型bin_num:0b1//二进制oct_num:0o1//8进制hex_num:0x111//16进制fmt.Println(bin_num,oct_num,hex_num)// 1 1 273fmt.Printf(%T,bin_num)//int// int 和 int64 不能进行运算虽然他们都是64位}字符字符的编码类型有ASCII和Unicode字符的类型 使用单引号存储的是字节码byte 类似于uint8rune 中文 类型与uint32packagemainimport(fmt)funcmain(){test_char()}functest_char(){varc1bytevarc2runec1afmt.Println(c1)fmt.Printf(%c,%T\n,c1,c1)// a,uint8c2中fmt.Println(c2)fmt.Printf(%c,%T\n,c2,c2)// 中,int32}字符串stringpackagemainimport(fmt)funcmain(){test_string()}functest_string(){vars1strings1邓s2:tomfmt.Println(s1,s2,len(s1),len(s2))//邓 tom 3 3}len()统计的是字节数utf8.RuneCountInString()统计的是字符数转义字符/t 制表符/n 换行符// 直接/按字符原样输出fmt.Println(:fakld/fad)字符串的截取和Python的语言一样s[end:start] 左闭右开字符串的转换Int转stringstring()不会将 100 转换为 “100”需要用到strconv.Itoa()进行转化string转int使用strconv.Atoi会返回两个参数valueerror如果转换失败value为nilerror会返回错误信息// 字符串的转换funcmain(){num1:100fmt.Println(string(num1))//d 不会变成“100” 而是转换成对应的字符str1:strconv.Itoa(num1)//整型转字符串fmt.Printf(str is %s, type is %T\n,str1,str1)//str2 : 100str2:a100v,e:strconv.Atoi(str2)//返回两个值不能转换e会拿到错误信息ife!nil{//nil 是空表示什么都没有fmt.Println(e)}else{fmt.Println(转换成功,v)}}字符串的遍历按字节数遍历fori:1;ilen(str);i{fmt.Printf(%v(%c),type is %T\n,str1[i],str1[i],str1[i])}按字符数遍历fori:rangestr2{//第一个参数是下标第二个参数是具体的值fmt.Println(string(i))}字符串的常用方法strings包Contains/Countstrings.Contains(st1,st2)判断str2是否在str1中strings.Count(st1,st2)判断st2在st1中出现的次数funcmain(){// 字符串的查找替换// 字符串的查找 Contains(s1,s2 string) bool 判断s1包不包含s2(子串)ifstrings.Contains(aaaa,aa){fmt.Println(aa 在字符串中)}// Count(s1,s2) 计算s1中出现s2的次数fmt.Println(strings.Count(aaa,a))}字符串的拼接只能对字符串进行拼接格式化拼接要使用fmt.Sprintf()funcmain(){a:ab:bc:ab fmt.Println(c)}字符串的查找替换不同于Python这里的Index返回的是str2在str1中第一次出现的位置若没有则返回-1(Python会报错)Replace进行替换当第四个参数为-1时表示全部替换若没有找到old则不替换也不报错funcmain(){str1:aabcdstr2:bfmt.Println(strings.Index(str1,str2))fmt.Println(strings.Replace(str1,a,b,2))}字符串的切割Split()返回的是一个数组第二个参数为分隔符funcmain(){str1:abc defaa:strings.Split(str1, )// 返回的是一个‘数组’fmt.Println(strings.Split(str1, ))fmt.Println(aa)}大小写转换ToLower/ToUpper适用于大小写不敏感的情况funcmain(){str1:abABfmt.Println(strings.ToLower(str1))fmt.Println(strings.ToUpper(str1))}Trim/TrimSuffixTrim(st1,st2)将st1左右两边的st2去除TrimSuffix(st1,st2)将st1末尾的st2删除只进行一次删除操作判断开头/结尾HasPrefix(st1,st2)判断st1是不是以st2开头HasSuffix(st1,st2)判断st1是不是以st2结尾布尔类型true false(默认)练习1.从键盘接收一个字符串判断字符串是否为回文functest1(){fmt.Println(请输入一串字符)varstr1stringfmt.Scan(str1)flag:truefori,v1:rangestr1{forj,v2:rangestr1{if(iutf8.RuneCountInString(str1)-1-i)(v1!v2){fmt.Println(v1,v2)fmt.Println(i,j)flagfalse}}}ifflag{fmt.Println(str1,是回文)}else{fmt.Println(str1,不是回文)}}2.字符串压缩 aaa bbb ddd e a3b3d3e1functest2(){fmt.Println(请输入字符串)varstr1stringfmt.Scan(str1)varstr2stringcount:1fori:0;ilen(str1);i{ifcount!1{count--continue}forj:i1;jlen(str1);j{ifstr1[i]str1[j]{count}else{break}}str2fmt.Sprintf(%s%c%d,str2,str1[i],count)}fmt.Println(str2)}运算符算数运算符-*/%--只能得到整数除不尽向下取整关系运算符!逻辑运算符将多个条件组合在一起进行与或非判断短路运算x y 如果x为假会短路 y表达式的计算||!位运算符通过转换为二进制进行运算|^赋值运算-/其他运算符变量名*指针--管道流程控制顺序结构分支结构循环结构分支结构if判断ifbool表达式{执行语句}else{执行语句}ifbool表达式{执行语句}elseifbool表达式{执行语句}else{执行语句}ifstatment;条件{执行语句}else{执行语句}switch caseswitch变量{case变量范围1 执行语句1case变量范围2 执行语句2default执行语句3}循环结构Go里面只有for循环funcmain(){//test_for1()//test_for2()//test_for3()//test_for4()//all_for()//login()test_go_to()}functest_for1(){fori:1;i10;i{fmt.Println(i)}}functest_for2(){i:1fori10{fmt.Println(i)i}}functest_for3(){varchoicestringforchoice!quit{fmt.Println(请输入你的选择)fmt.Scan(choice)}}functest_for4(){str1:abcdefork,v:rangestr1{fmt.Println(k,string(v))}}funcall_for(){for{fmt.Println(哈哈哈哈)}}for循环里面的空间和 函数的空间是不一样的 所以可以重复声明同一个变量 for 循环内部可以向上访问 外部空间的变量for循环创建的变量只能在循环体中使用Gotofunctest_go_to(){i:1ABC:fmt.Println(i)fori10{iifi5{gotoABC}}}

更多文章