最新要闻
- 损失条款
- 不喜欢别看!网飞黑人《埃及艳后》史诗级翻车 差评多到不忍直视
- 年度大改款!联发科下一代旗舰命名确认:天玑9300_焦点热门
- 骨灰级程序员 20多年经验IT大牛左耳朵耗子陈皓突发心梗去世 享年47岁-世界简讯
- 特斯拉中国召回110万辆:是真心 还是假意?
- 今热点:硬挑苹果!华为赚麻:增加万元折叠新机Mate X3订单 出货量或将翻倍
- 世界热文:白酒板块午盘走弱 贵州茅台股价下滑0.22%
- 日系“药丸”?日产发布2022财年业绩:收益远超预期|热推荐
- 环球头条:卢伟冰揭秘Redmi Book 14:4000元档四大升级 厂商良心所在
- 地铁咋调头 有司机吗?看完本文你比地铁司机还懂
- 亚洲或将面临超级高温“烤”验:多国已破40℃ 厄尔尼诺现象要来了-环球热文
- 联想拯救者Y9000P冰魄白游戏本开卖 24核i9+RTX 4070仅售12499元 当前头条
- 俄媒:一天之内数架俄军机在俄乌边境坠毁 即时
- 世界短讯!萍乡一男子利用职务便利侵占公司财物获刑
- 独悬变扭力梁、气囊也减配 新款丰田卡罗拉上市定档:价格或史低 当前热文
- 对标苹果iPad Air!华为MatePad Air真机首曝:LCD屏、骁龙888|世界新消息
广告
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
Golang基础教程
(资料图片仅供参考)
Golang基础学习
以下使用goland的IDE演示,包含总计的golang基础功能共20个章节一、go语言结构:二、go基础语法:三、变量:四、常量:五、运算符:六、条件语句:七、循环:八、函数:九、变量作用域:十、数组:十一、指针:十二、结构体:十三、切片:十四、范围(Range):十五、集合:十六、递归:十七、数据类型转换:十八、接口:十九、错误处理:二十、并发:一、go语言结构:1.运行HelloWorld!package main import "fmt" func main() {fmt.Println("Hello World!")}查看运行结果:2.语言结构:1. 第一行代码 package main 定义了包名。你必须在源文件中非注释的第一行指明这个文件属于哪个包,如:package main。package main表示一个可独立执行的程序,每个 Go 应用程序都包含一个名为 main 的包。2. 下一行 import "fmt" 告诉 Go 编译器这个程序需要使用 fmt 包(的函数,或其他元素),fmt 包实现了格式化 IO(输入/输出)的函数。3. 下一行 func main() 是程序开始执行的函数。main 函数是每一个可执行程序所必须包含的,一般来说都是在启动后第一个执行的函数(如果有 init() 函数则会先执行该函数)。4. 下一行 /*...*/ 是注释,在程序执行时将被忽略。单行注释是最常见的注释形式,你可以在任何地方使用以 // 开头的单行注释。多行注释也叫块注释,均已以 /* 开头,并以 */ 结尾,且不可以嵌套使用,多行注释一般用于包的文档描述或注释成块的代码片段。5.下一行 fmt.Println(...) 可以将字符串输出到控制台,并在最后自动增加换行字符 \n。使用 fmt.Print("hello, world\n") 可以得到相同的结果。Print 和 Println 这两个函数也支持使用变量,如:fmt.Println(arr)。如果没有特别指定,它们会以默认的打印格式将变量 arr 输出到控制台。6. 当标识符(包括常量、变量、类型、函数名、结构字段等等)以一个大写字母开头,如:Group1,那么使用这种形式的标识符的对象就可以被外部包的代码所使用(客户端程序需要先导入这个包),这被称为导出(像面向对象语言中的 public);标识符如果以小写字母开头,则对包外是不可见的,但是他们在整个包的内部是可见并且可用的(像面向对象语言中的 protected )。二、go基础语法:1.行分隔符:Println函数会在行末尾自动加上换行符
package main import "fmt" func main() {fmt.Println("Hello World!")fmt.Println("Println函数会在行末尾自动加上换行符")}查看运行结果:2.注释:单行注释以//开头,多行注释以 /* 开头,并以 */ 结尾// 单行注释/*我说多行注释1我说多行注释2我说多行注释3*/3.标识符:标识符用来命名变量、类型等程序实体。一个标识符实际上就是一个或是多个字母(A~Z和a~z)数字(0~9)、下划线_组成的序列,但是第一个字符必须是字母或下划线而不能是数字。以下是有效的标识符:maheshkumarabcmove_namea_123myname50_tempja23b9retVal以下是无效的标识符:* 1ab(以数字开头)* case(Go 语言的关键字)* a+b(运算符是不允许的)4.字符串连接:Go 语言的字符串连接可以通过 + 实现:
import "fmt" func main() {fmt.Println("golang"+"python")}查看运行结果:5.关键字:下面列举了 Go 代码中会使用到的 25 个关键字或保留字:breakdefaultfuncinterfaceselectcasedefergomapstructchanelsegotopackageswitchconstfallthroughifrangetypecontinueforimportreturnvar6.格式化字符串://常用的使用%d 表示整型数字,%s 表示字符串
package main import "fmt" func main() {//fmt.Println("Hello World!")//fmt.Println("Println函数会在行末尾自动加上换行符")//fmt.Println("golang" + "python")var today = "星期六"var number = 6fmt.Printf("今天是%s,今天在本周的排号为%d", today, number)}查看运行结果:三、变量1、申明一个变量值,变量类型,并初始化(1)两种方式,方式1:使用var声明
package main func main() {var str string = "hello"var num int = 123println(str, num)}查看运行结果:(2)使用:=声明
package main func main() {//var str string = "hello"//var num int = 123//println(str, num)mystr := "very good"mynum := 345println(mystr, mynum) }查看运行结果:2、申请变量未初始化,则会给默认值数值类型初始值0布尔类型为fasle字符串为""其他类型为nil
func main() {//var str string = "hello"//var num int = 123//println(str, num) //初始值0var num1 intfmt.Println("num1初始值为:", num1)//初始值""var str1 stringfmt.Println("str1初始值为:", str1)//布尔类型为 falsevar flag boolfmt.Println("flag初始值为:", flag)//其他类型为nilvar a *intvar b []intvar c map[string]intvar d chan intvar e func(string) intvar f errorfmt.Println("a,b,c,d,e,f的初始值分别为:", a, b, c, d, e, f)}查看运行结果:3、根据值自行判定变量类型
package main import ("fmt""reflect") func main() { var str2 = "hello"var num2 = 25var flag2 = truefmt.Println("str2的类型为:", reflect.TypeOf(str2))fmt.Println("num2的类型为:", reflect.TypeOf(num2))fmt.Println("flag2的类型为:", reflect.TypeOf(flag2))}查看运行结果:4、多变量声明:使用逗号隔开
package main import "fmt" func main() { var str3, str4, str5 string = "hello", "World", "ok"num3, num4, num5 := 2, 3, 4fmt.Println(str3, str4, str5)fmt.Println(num3, num4, num5) }查看运行结果:5、引用类型变量&可查看引用变量的地址
12345678910111213 | package main import "fmt" func main() { var a1 = 10 var b1 = "ok" fmt.Println( "a1=" , a1) fmt.Println( "b1=" , b1) fmt.Println( "a1=" , &a1) fmt.Println( "b1=" , &b1) } |
package main func main() {const a string = "abc" //显示类型定义const b = "abc" //隐示类型定义const c, d = "o", "k"println(a, b, c, d)}查看运行结果:2. 常量还可以用作枚举:并且常量可以用len(), cap(), unsafe.Sizeof()函数计算表达式的值。常量表达式中,函数必须是内置函数,否则编译不过
package main import "unsafe" func main() {//const a string = "abc" //显示类型定义//const b = "abc" //隐示类型定义//const c, d = "o", "k"//println(a, b, c, d)const (Unknown = 0Female = 1Male = 2) const (a = "abc"b = len(a)c = unsafe.Sizeof(a) //16个字节,返回string结构体的字符与长度各8个字符相加)println(Unknown, Female, Male, a, b, c)}查看运行结果:3.特殊常量iotaiota,特殊常量,可以认为是一个可以被编译器修改的常量。iota 在 const关键字出现时将被重置为 0(const 内部的第一行之前),const 中每新增一行常量声明将使 iota 计数一次(iota 可理解为 const 语句块中的行索引)。
package main func main() { const (a = iotabc)println(a, b, c)}查看运行结果:
package main import "fmt" func main() { //println(a, b, c)const (a = iota //0b //1c //2d = "ha" //独立值,iota += 1e //"ha" iota += 1f = 100 //iota +=1g //100 iota +=1h = iota //7,恢复计数i //8)fmt.Println(a, b, c, d, e, f, g, h, i)}查看运行结果:五、运算符1.算数运算符:
package main import "fmt" func main() {a := 1b := 2fmt.Println("a加b等于:", a+b)fmt.Println("a减b等于:", a-b)fmt.Println("a剩b等于:", a*b)fmt.Println("a除b等于:", a/b)fmt.Println("a除b后取余数等于:", a%b)a++fmt.Println("a++后的结果:", a)b--fmt.Println("b--后的结果:", b)}查看运行结果:2.关系运算符关系运算符主要有 =,!=,>,<,>=,<=共6种运算符
package main import "fmt" func main() { var m int = 21var n int = 10if m == n {fmt.Println("第一行返回:a等于b")} else {fmt.Println("第一行返回:a不等于b")}if m < n {fmt.Println("第二行返回:a小于b")} else {fmt.Println("第二行返回:a不小于b")}if m > n {fmt.Println("第三行返回:a大于b")} else {fmt.Println("第三行返回:a不大于b")}m, n = n, m //交换m,n的值if m <= n {fmt.Println("第四行返回:a小于等于b")}if m >= n {fmt.Println("第四行返回:a不小于b")}}查看运行结果:3.逻辑运算符主要有三种逻辑运算符:&&:逻辑 AND 运算符。 如果两边的操作数都是 True,则条件 True,否则为 False。||:逻辑 OR 运算符。 如果两边的操作数有一个 True,则条件 True,否则为 False。!:逻辑 NOT 运算符。 如果条件为 True,则逻辑 NOT 条件 False,否则为 True。
package main import "fmt" func main() { var a bool = truevar b bool = falseif a && b {fmt.Printf("第一行 - 条件为 true\n")} else if a || b {fmt.Printf("第一行 - 条件为 true\n")}a, b = b, a //修改a,b的值,对调if a && b {fmt.Printf("第二行 - 条件为 true\n")} else {fmt.Printf("第二行 - 条件为 false\n")}if !(a && b) {fmt.Printf("第三行 - 条件为 true\n")} else {fmt.Printf("第三行 - 条件为 false\n")} }查看运行结果:4.位运算符位运算符对整数在内存中的二进制位进行操作。&, |, ^,<<,>>四种位运算方式
package main import "fmt" func main() { var a uint = 60 /* 60 = 0011 1100 */var b uint = 13 /* 13 = 0000 1101 */var c uint = 0 c = a & b /* 12 = 0000 1100 */fmt.Printf("第一行 - c 的值为 %d\n", c) c = a | b /* 61 = 0011 1101 */fmt.Printf("第二行 - c 的值为 %d\n", c) c = a ^ b /* 49 = 0011 0001 */fmt.Printf("第三行 - c 的值为 %d\n", c) c = a << 2 /* 240 = 1111 0000 */fmt.Printf("第四行 - c 的值为 %d\n", c) c = a >> 2 /* 15 = 0000 1111 */fmt.Printf("第五行 - c 的值为 %d\n", c) }查看运行结果:5.赋值运算符赋值符号为=,将一个表达式的值赋给一个左值,结合之前其他的型号的赋值运算符如下:
package main import "fmt" func main() { var a int = 21var c int c = afmt.Printf("第 1 行 - = 运算符实例,c 值为 = %d\n", c) c += afmt.Printf("第 2 行 - += 运算符实例,c 值为 = %d\n", c) c -= afmt.Printf("第 3 行 - -= 运算符实例,c 值为 = %d\n", c) c *= afmt.Printf("第 4 行 - *= 运算符实例,c 值为 = %d\n", c) c /= afmt.Printf("第 5 行 - /= 运算符实例,c 值为 = %d\n", c) c = 200 c <<= 2fmt.Printf("第 6行 - <<= 运算符实例,c 值为 = %d\n", c) c >>= 2fmt.Printf("第 7 行 - >>= 运算符实例,c 值为 = %d\n", c) c &= 2fmt.Printf("第 8 行 - &= 运算符实例,c 值为 = %d\n", c) c ^= 2fmt.Printf("第 9 行 - ^= 运算符实例,c 值为 = %d\n", c) c |= 2fmt.Printf("第 10 行 - |= 运算符实例,c 值为 = %d\n", c)}查看运行结果:六、条件语句1.ifelse语句:
package main import "fmt" func main() {//if else语句age := 18if age < 5 {fmt.Println("你的age为:", age, ",你太小了无法进入")} else if age < 18 {fmt.Println("你的age为:", age, ",你虽然不小了,但是仍然未满18,无法进入")} else {fmt.Println("你的age为:", age, ",你已满18岁,可以进入")}}查看运行结果:2.if嵌套语句计算可以数字a在0-100内,且是否可以被5整除
package main import "fmt" func main() { a := 100//if嵌套if a <= 100 {fmt.Println("a的值符合条件1:在0~100内,为:", a)if a%5 == 0 {fmt.Println("a的值符合条件2:可以被5整除,为:", a)} else {fmt.Println("a的值不符合条件2:不可以被5整除,为:", a) }} else {fmt.Println("a的值不符合条件1:非在0~100内,为:", a) }}查看运行结果:3.switch语句(1)switch+case语句:switch 语句用于基于不同条件执行不同动作,每一个 case 分支都是唯一的,从上至下逐一测试,直到匹配为止。witch 默认情况下 case 最后自带 break 语句,匹配成功后就不会执行其他 case
package main import "fmt" func main() { //3.switch case语句score := 75var grade stringswitch {case score < 60:grade = "C"case score >= 60 && score < 80:grade = "B"case score >= 80:grade = "A"}fmt.Println(grade) }查看运行结果:(2)switch+case+fallthrough使用 fallthrough 会强制执行后面的 case 语句,fallthrough 不会判断下一条 case 的表达式结果是否为 true。
package main import "fmt" func main() { score := 95var grade stringswitch {case score < 60:grade = "C"fallthroughcase false:fmt.Println("使用fallthrough语句跳入到了下一步打印此句,因为您的成绩为:", grade)case score >= 60 && score < 80:grade = "B"fallthroughcase false:fmt.Println("使用fallthrough语句跳入到了下一步打印此句,因为您的成绩为:", grade)case score >= 80:grade = "A"fallthroughcase false:fmt.Println("使用fallthrough语句跳入到了下一步打印此句,因为您的成绩为:", grade)}fmt.Println(grade)}查看运行结果:(3)switch+default:defalut如果放在哪里是会最后执行
package main import "fmt" func main() { score := 200var grade stringswitch {default:grade = "Nothing"fmt.Printf("你的成绩为%d,并不合法,最终grade为%s", score, grade)case score < 60:grade = "C"fallthroughcase false:fmt.Println("使用fallthrough语句跳入到了下一步打印此句,因为您的成绩为:", grade)case score >= 60 && score < 80:grade = "B"fallthroughcase false:fmt.Println("使用fallthrough语句跳入到了下一步打印此句,因为您的成绩为:", grade)case score >= 80 && score <= 100:grade = "A"fallthroughcase false:fmt.Println("使用fallthrough语句跳入到了下一步打印此句,因为您的成绩为:", grade)} }查看运行结果:4.select语句select 是 Go 中的一个控制结构,类似于用于通信的 switch 语句。每个 case 必须是一个通信操作,要么是发送要么是接收。select 随机执行一个可运行的 case。如果没有 case 可运行,它将阻塞,直到有 case 可运行。一个默认的子句应该总是可运行的。
package main import "fmt" func main() { var c1, c2, c3 chan intvar i1, i2 intselect {case i1 = <-c1:fmt.Printf("received ", i1, " from c1\n")case c2 <- i2:fmt.Printf("sent ", i2, " to c2\n")case i3, ok := (<-c3): // same as: i3, ok := <-c3if ok {fmt.Printf("received ", i3, " from c3\n")} else {fmt.Printf("c3 is closed\n")}default:fmt.Printf("no communication\n")} }查看运行结果:七、循环1.for循环(1)forcondition {}
package main import "fmt" func main() {//1.for condition语句sum := 0for i := 1; i <= 10; i++ {sum += i}fmt.Println(sum) //累加1~10}查看运行结果:(2)forinit {}
package main import "fmt" func main() { Strings := []string{"google", "golang"}for m, n := range Strings {fmt.Println(m, n)}}查看运行结果:2.循环嵌套
package main import "fmt" func main() { //2.循环嵌套:找到1-30内的素数var i, j intfor i = 2; i < 30; i++ {for j = 2; j <= i/j; j++ {if i%j == 0 {break}}if j > (i / j) {fmt.Println(i, "是一个素数")}}}查看运行结果:3.break语句Go 语言中 break 语句用于以下两方面:(1) 用于循环语句中跳出循环,并开始执行循环之后的语句。
//3.1 break跳出循环var a int = 10for a < 20 {fmt.Println("a的值:", a)a++if a == 15 {break}}}查看运行结果:(2) break 在 switch(开关语句)中在执行一条 case 后跳出语句的作用。(此break会隐藏)(3)在多重循环中,可以用标号 label 标出想 break 的循环。
package main import "fmt" func main() { //3.2 break label标出想break的循环// 不使用标记fmt.Println("---- break ----")for i := 1; i <= 3; i++ {fmt.Printf("i: %d\n", i)for i2 := 11; i2 <= 13; i2++ {fmt.Printf("i2: %d\n", i2)break}} // 使用标记fmt.Println("---- break label ----")re:for i := 1; i <= 3; i++ {fmt.Printf("i: %d\n", i)for i2 := 11; i2 <= 13; i2++ {fmt.Printf("i2: %d\n", i2)break re}} }查看运行结果:4.continue 语句Go 语言的 continue 语句 有点像 break 语句。但是 continue 不是跳出循环,而是跳过当前循环执行下一次循环语句。(1)for 循环中,执行 continue 语句会触发 for 增量语句的执行。
package main import "fmt" func main() { //4.1 continue语句,不是跳出循环,而是跳过当前循环执行下一次循环语句a := 10for a < 20 {a++if a == 15 {continue}fmt.Println("a的值为:", a)} }查看运行结果:(2)在多重循环中,可以用标号 label 标出想 continue 的循环。
package main import "fmt" func main() { //4.2 使用continue+label标出想 continue 的循环// 不使用标记fmt.Println("---- continue ---- ")for i := 1; i <= 3; i++ {fmt.Printf("i: %d\n", i)for i2 := 11; i2 <= 13; i2++ {fmt.Printf("i2: %d\n", i2)continue}} // 使用标记fmt.Println("---- continue label ----")re:for i := 1; i <= 3; i++ {fmt.Printf("i: %d\n", i)for i2 := 11; i2 <= 13; i2++ {fmt.Printf("i2: %d\n", i2)continue re}} }查看运行结果:5.goto 语句Go 语言的 goto 语句可以无条件地转移到过程中指定的行。goto 语句通常与条件语句配合使用。可用来实现条件转移, 构成循环,跳出循环体等功能。
package main import "fmt" func main() { //5.goto语句可以无条件地转移到过程中指定的行/* 定义局部变量 */var a int = 10 /* 循环 */LOOP:for a < 20 {if a == 15 {/* 跳过迭代 */a = a + 1goto LOOP}fmt.Printf("a的值为 : %d\n", a)a++}}查看运行结果:八、函数1.函数定义与调用Go 语言最少有个 main() 函数。你可以通过函数来划分不同功能,逻辑上每个函数执行的是指定的任务。函数定义解析:* func:函数由 func 开始声明* function_name:函数名称,参数列表和返回值类型构成了函数签名。* parameter list:参数列表,参数就像一个占位符,当函数被调用时,你可以将值传递给参数,这个值被称为实际参数。参数列表指定的是参数类型、顺序、及参数个数。参数是可选的,也就是说函数也可以不包含参数。* return_types:返回类型,函数返回一列值。return_types 是该列值的数据类型。有些功能不需要返回值,这种情况下 return_types 不是必须的。* 函数体:函数定义的代码集合。
package main import "fmt" func main() {var a int = 98var b int = 99var c int = max(a, b)fmt.Println("a,b两个数的最大值为:", c)} func max(num1, num2 int) int {/* 声明局部变量 */var result int if num1 > num2 {result = num1} else {result = num2}return result}查看运行结果:2.函数返回多个值
package main import "fmt" func main() { x := "hello"y := "world"fmt.Println("交换前的x与y分别为:", x, y)x, y = swap(x, y)fmt.Println("交换后的x与y分别为:", x, y)} func swap(x, y string) (string, string) {x, y = y, xreturn x, y}查看运行结果:3.值传递与引用传递(1)值传递:值传递是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。
package main import ("fmt") func main() { x := "hello"y := "world"fmt.Println("交换前的x与y分别为:", x, y)swap(x, y)fmt.Println("交换后的x与y分别为:", x, y)} //值传递func swap(x, y string) string {var temp stringtemp = xx = yy = tempreturn temp}查看运行结果:(2)引用传递:引用传递是指在调用函数时将实际参数的地址传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。
package main import ("fmt") func main() {//var a int = 98//var b int = 99//var c int = max(a, b)//fmt.Println("a,b两个数的最大值为:", c) x := "hello"y := "world"fmt.Println("交换前的x与y分别为:", x, y)swap(&x, &y)fmt.Println("交换后的x与y分别为:", x, y)} //func max(num1, num2 int) int {// /* 声明局部变量 */// var result int//// if num1 > num2 {// result = num1// } else {// result = num2// }// return result//} ////值传递//func swap(x, y string) string {// var temp string// temp = x// x = y// y = temp// return temp//} //引用传递func swap(x, y *string) string {var temp stringtemp = *x*x = *y*y = tempreturn temp}查看运行结果:4.函数作为另外一个函数的实参(进阶ToDo)5.闭包(进阶ToDo)6.方法(进阶ToDo)九、变量作用域1.局部变量:* 函数内定义的变量称为局部变量,它们的作用域只在函数体内,参数和返回值变量也是局部变量。
package main import "fmt" func main() {/* 声明局部变量 */var a, b, c int /* 初始化参数 */a = 10b = 20c = a + b fmt.Printf("结果: a = %d, b = %d and c = %d\n", a, b, c)}查看运行结果:2.全局变量* 函数外定义的变量称为全局变量,全局变量可以在整个包甚至外部包(被导出后)使用
package main import "fmt" /* 声明全局变量 */var g int func main() { /* 声明局部变量 */var a, b int /* 初始化参数 */a = 10b = 20g = a + b fmt.Printf("结果: a = %d, b = %d and g = %d\n", a, b, g)}查看运行结果:3.形式参数形式参数会作为函数的局部变量来使用。实例如下:
package main import "fmt" ///* 声明全局变量 *///var g int /* 声明全局变量 */var a int = 20 func main() { /* main 函数中声明局部变量 */var a int = 10var b int = 20var c int = 0 fmt.Printf("main()函数中 a = %d\n", a)c = sum(a, b)fmt.Printf("main()函数中 c = %d\n", c)} /* 函数定义-两数相加 */func sum(a, b int) int {fmt.Printf("sum() 函数中 a = %d\n", a)fmt.Printf("sum() 函数中 b = %d\n", b) return a + b}查看运行结果:4.初始化局部和全局变量不同类型的局部和全局变量的默认值为:int为0float32为0pointer为nil十、数组1.声明数组例如以下定义了数组 balance 长度为 10 类型为 float32:
var balance [10] float322.初始化数组
package main import "fmt" func main() {//1.初始化数组balance1 := [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0}fmt.Println(balance1)//如果数组长度不确定,可以使用 ... 代替数组的长度,编译器会根据元素个数自行推断数组的长度:balance2 := [...]float32{1000.0, 2.0, 3.4, 7.0, 50.0}fmt.Println(balance2)}查看运行结果:3.访问数组元素
package main import "fmt" func main() { //3.访问列表元素,通过for循环方式遍历var n [10]int /* n 是一个长度为 10 的数组 */var i, j int /* 为数组 n 初始化元素 */for i = 0; i < 10; i++ {n[i] = i + 100 /* 设置元素为 i + 100 */} /* 输出每个数组元素的值 */for j = 0; j < 10; j++ {fmt.Printf("Element[%d] = %d\n", j, n[j])}}查看运行结果:4.多维数组(进阶ToDo)5.向函数传递数组(进阶ToDo)十一、指针1.指针的使用一个指针变量指向了一个值的内存地址。var ip *int/* 指向整型*/var fp *float32/* 指向浮点型 */
package main import "fmt" func main() {var a int = 20 /* 声明实际变量 */var ip *int /* 声明指针变量 */ ip = &a /* 指针变量的存储地址 */ fmt.Printf("a 变量的地址是: %x\n", &a) /* 指针变量的存储地址 */fmt.Printf("ip 变量储存的指针地址: %x\n", ip) /* 使用指针访问值 */fmt.Printf("*ip 变量的值: %d\n", *ip)}查看运行结果:2.空指针当一个指针被定义后没有分配到任何变量时,它的值为 nil。nil 指针也称为空指针。nil在概念上和其它语言的null、None、nil、NULL一样,都指代零值或空值。一个指针变量通常缩写为 ptr。
package main import "fmt" func main() { //空指针var ptr *intfmt.Printf("ptr 的值为 : %x\n", ptr)}查看运行结果:3.指针数组(进阶ToDo)4.指向指针的指针(进阶ToDo)5.指针作为函数参数(进阶ToDo)十二、结构体1.定义结构体Go 语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型。结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。结构体定义需要使用 type 和 struct 语句。struct 语句定义一个新的数据类型,结构体中有一个或多个成员。type 语句设定了结构体的名称。
package main import "fmt" //定义结构体type Books struct {title stringauthor stringsubject stringbookId int} func main() {// 创建一个新的结构体fmt.Println(Books{"Go 语言", "mr.white", "Go语言教程", 100001}) // 也可以使用 key => value 格式fmt.Println(Books{title: "Go 语言", author: "mr.white", subject: "Go语言教程", bookId: 100002}) // 忽略的字段为 0 或 空fmt.Println(Books{title: "Go 语言", author: "mr.white"})}查看运行结果:2.访问结构体成员如果要访问结构体成员,需要使用点号 . 操作符。
package main import "fmt" //定义结构体type Books struct {title stringauthor stringsubject stringbookId int} func main() { /* book 1 描述 */Book1.title = "Go 语言"Book1.author = "mr.white"Book1.subject = "Go 语言教程"Book1.bookId = 100001 /* book 2 描述 */Book2.title = "Python 教程"Book2.author = "mr.white"Book2.subject = "Python 语言教程"Book2.bookId = 100002 /* 打印 Book1 信息 */fmt.Printf("Book 1 title : %s\n", Book1.title)fmt.Printf("Book 1 author : %s\n", Book1.author)fmt.Printf("Book 1 subject : %s\n", Book1.subject)fmt.Printf("Book 1 book_id : %d\n", Book1.bookId) /* 打印 Book2 信息 */fmt.Printf("Book 2 title : %s\n", Book2.title)fmt.Printf("Book 2 author : %s\n", Book2.author)fmt.Printf("Book 2 subject : %s\n", Book2.subject)fmt.Printf("Book 2 book_id : %d\n", Book2.bookId)}查看运行结果:3.结构体作为函数参数(进阶ToDo)4.结构体指针(进阶ToDo)十三、切片1.定义/切片初始化Go 数组的长度不可改变,在特定场景中这样的集合就不太适用,Go 中提供了一种灵活,功能强悍的内置类型切片("动态数组"),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。
package main import "fmt" func main() {//1.直接初始化切片,[] 表示是切片类型,{1,2,3} 初始化值依次是 1,2,3,其 cap=len=3。s := []int{1, 2, 3}fmt.Println("切片s:", s)//初始化切片 s1,是数组 s 的引用。s1 := s[:]fmt.Println("切片s1:", s1)//初始化切片 s2,是从下标 startIndex 到 endIndex-1 下的元素创建为一个新的切片。s2 := s[1:3]fmt.Println("切片s2:", s2)//使用make初始化切片s3 := make([]int, 3)fmt.Println("切片s3:", s3)}查看运行结果:2.len() 和 cap() 函数len() 方法获取切片的长度cap()方法 可以测量切片最长可以达到多少
package main import "fmt" func printSlice(x []int) {fmt.Printf("len=%d cap=%d slice=%v\n", len(x), cap(x), x)} func main() { //2调用printSlice方法获取切片的长度与容量var numbers = make([]int, 3, 5)printSlice(numbers)}查看运行结果:3.空(nil)切片
package main import "fmt" func printSlice(x []int) {fmt.Printf("len=%d cap=%d slice=%v\n", len(x), cap(x), x)} func main() { //3.空切片var numbers []intprintSlice(numbers)if numbers == nil {fmt.Println("切片是空的呢")}}查看运行结果:4.切片截取可以通过设置下限及上限来设置截取切片 [lower-bound:upper-bound],实例如下:
package main import "fmt" func printSlice(x []int) {fmt.Printf("len=%d cap=%d slice=%v\n", len(x), cap(x), x)} func main() { //切片截取举例/* 创建切片 */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:]) numbers1 := make([]int, 0, 5)printSlice(numbers1) /* 打印子切片从索引 0(包含) 到索引 2(不包含) */number2 := numbers[:2]printSlice(number2) /* 打印子切片从索引 2(包含) 到索引 5(不包含) */number3 := numbers[2:5]printSlice(number3)}查看运行结果:5.append() 和 copy() 函数如果想增加切片的容量,我们必须创建一个新的更大的切片并把原分片的内容都拷贝过来。下面的代码描述了从拷贝切片的 copy 方法和向切片追加新元素的 append 方法。
package main import "fmt" func printSlice(x []int) {fmt.Printf("len=%d cap=%d slice=%v\n", len(x), cap(x), x)} func main() { //5.append() 和 copy() 函数var numbers []intprintSlice(numbers) /* 允许追加空切片 */numbers = append(numbers, 0)printSlice(numbers) /* 向切片添加一个元素 */numbers = append(numbers, 1)printSlice(numbers) /* 同时添加多个元素 */numbers = append(numbers, 2,3,4)printSlice(numbers) /* 创建切片 numbers1 是之前切片的两倍容量*/numbers1 := make([]int, len(numbers), (cap(numbers))*2) /* 拷贝 numbers 的内容到 numbers1 */copy(numbers1,numbers)printSlice(numbers1)}查看运行结果:十四、范围(Range)1.range的作用range 关键字用于 for 循环中迭代数组(array)、切片(slice)、通道(channel)或集合(map)的元素。在数组和切片中它返回元素的索引和索引对应的值,在集合中返回 key-value 对。for 循环的 range 格式可以对 slice、map、数组、字符串等进行迭代循环2.举例说明
package main import "fmt" func main() {map1 := make(map[int]float32)map1[1] = 1.0map1[2] = 2.0map1[3] = 3.0map1[4] = 4.0 // 读取 key 和 valuefor key, value := range map1 {fmt.Printf("key is: %d - value is: %f\n", key, value)} // 读取 keyfor key := range map1 {fmt.Printf("key is: %d\n", key)} // 读取 valuefor _, value := range map1 {fmt.Printf("value is: %f\n", value)}}查看运行结果:十五、集合1.定义 Map/* 声明变量,默认 map 是 nil */var map_variable map[key_data_type]value_data_type/* 使用 make 函数 */map_variable := make(map[key_data_type]value_data_type)实例如下:
package main import "fmt" func main() {var countryCapitalMap map[string]string /*创建集合 */countryCapitalMap = make(map[string]string) /* map插入key - value对,各个国家对应的首都 */countryCapitalMap["France"] = "巴黎"countryCapitalMap["Italy"] = "罗马"countryCapitalMap["Japan"] = "东京"countryCapitalMap["India "] = "新德里" /*使用键输出地图值 */for country := range countryCapitalMap {fmt.Println(country, "首都是", countryCapitalMap[country])} /*查看元素在集合中是否存在 */capital, ok := countryCapitalMap["American"] /*如果确定是真实的,则存在,否则不存在 *//*fmt.Println(capital) *//*fmt.Println(ok) */if ok {fmt.Println("American 的首都是", capital)} else {fmt.Println("American 的首都不存在")}}查看运行结果:2.delete() 函数delete() 函数用于删除集合的元素, 参数为 map 和其对应的 key。实例如下:
package main import "fmt" func main() {//2.delete() 函数/* 创建map */countryCapitalMap := map[string]string{"France": "Paris", "Italy": "Rome", "Japan": "Tokyo", "India": "New delhi"} fmt.Println("原始地图") /* 打印地图 */for country := range countryCapitalMap {fmt.Println(country, "首都是", countryCapitalMap[country])} /*删除元素*/delete(countryCapitalMap, "France")fmt.Println("法国条目被删除") fmt.Println("删除元素后地图") /*打印地图*/for country := range countryCapitalMap {fmt.Println(country, "首都是", countryCapitalMap[country])}}查看运行结果:十六、递归Go 语言支持递归。但我们在使用递归时,开发者需要设置退出条件,否则递归将陷入无限循环中。递归函数对于解决数学上的问题是非常有用的,就像计算阶乘,生成斐波那契数列等1.阶乘
package main import "fmt" func Factorial(n uint64) (result uint64) {if n > 0 {result = n * Factorial(n-1)return result}return 1} func main() {//1.阶乘var i int = 15fmt.Printf("%d 的阶乘是 %d\n", i, Factorial(uint64(i)))}查看运行结果:2.斐波那契数列
package main import "fmt" func fibonacci(n int) int {if n < 2 {return n}return fibonacci(n-2) + fibonacci(n-1)} func main() { //2.斐波那契数列var i intfor i = 0; i < 10; i++ {fmt.Printf("%d\t", fibonacci(i))}}查看运行结果:十七、数据类型转换1.转换规则类型转换用于将一种数据类型的变量转换为另外一种类型的变量。Go 语言类型转换基本格式如下:type_name(expression)2.实例
package main import "fmt" func main() {var sum int = 17var count int = 5var mean float32 mean = float32(sum)/float32(count)fmt.Printf("mean 的值为: %f\n",mean)}查看运行结果:十八、接口1.接口含义Go 语言提供了另外一种数据类型即接口,它把所有的具有共性的方法定义在一起,任何其他类型只要实现了这些方法就是实现了这个接口。2.实例
package main import "fmt" type Phone interface {/* 定义结构体 */call()} type NokiaPhone struct {/* 定义结构体 */} func (nokiaPhone NokiaPhone) call() {/* 实现接口方法 */fmt.Println("I am Nokia, I can call you!")} type IPhone struct {/* 定义结构体 */} func (iPhone IPhone) call() {/* 实现接口方法 */fmt.Println("I am iPhone, I can call you!")} func main() {var phone Phone phone = new(NokiaPhone)phone.call() phone = new(IPhone)phone.call()}查看运行结果:十九、错误处理1.error简介Go 语言通过内置的错误接口提供了非常简单的错误处理机制。
type error interface {Error() string}我们可以在编码中通过实现 error 接口类型来生成错误信息。函数通常在最后的返回值中返回错误信息。使用errors.New 可返回一个错误信息:
func Sqrt(f float64) (float64, error) {if f < 0 {return 0, errors.New("math: square root of negative number")}}在下面的例子中,我们在调用Sqrt的时候传递的一个负数,然后就得到了non-nil的error对象,将此对象与nil比较,结果为true,所以fmt.Println(fmt包在处理error时会调用Error方法)被调用,以输出错误,请看下面调用的示例代码:
result, err:= Sqrt(-1) if err != nil {fmt.Println(err)}2.实例
package main import "fmt" // 定义一个 DivideError 结构type DivideError struct {dividee intdivider int} // 实现 `error` 接口func (de *DivideError) Error() string {strFormat := `Cannot proceed, the divider is zero.dividee: %ddivider: 0`return fmt.Sprintf(strFormat, de.dividee)} // 定义 `int` 类型除法运算的函数func Divide(varDividee int, varDivider int) (result int, errorMsg string) {if varDivider == 0 {dData := DivideError{dividee: varDividee,divider: varDivider,}errorMsg = dData.Error()return} else {return varDividee / varDivider, ""} } func main() {// 正常情况if result, errorMsg := Divide(100, 10); errorMsg == "" {fmt.Println("100/10 = ", result)}// 当除数为零的时候会返回错误信息if _, errorMsg := Divide(100, 0); errorMsg != "" {fmt.Println("errorMsg is: ", errorMsg)}}查看运行结果:二十、并发1.并发介绍Go 语言支持并发,我们只需要通过 go 关键字来开启 goroutine 即可。goroutine 是轻量级线程,goroutine 的调度是由 Golang 运行时进行管理的。语句:go f(x, y, z)如:开启一个新的 goroutine:f(x, y, z)2.实例
package main import ("fmt""time") func say(s string) {for i := 0; i < 5; i++ {time.Sleep(100 * time.Millisecond)fmt.Println(s)}} func main() {go say("world")say("hello")}查看运行结果:
关键词:
-
Mongodb 以及 node.js中使用mongoose操作数据库
Mongodb以及node js中使用mongoose操作数据库1、lowdb一个简陋的数据库第三方库,使用JSON文件来保存数据,
来源: Golang基础教程
Mongodb 以及 node.js中使用mongoose操作数据库
每日看点!MYSQL数据库之事务隔离级别详解
损失条款
不喜欢别看!网飞黑人《埃及艳后》史诗级翻车 差评多到不忍直视
年度大改款!联发科下一代旗舰命名确认:天玑9300_焦点热门
骨灰级程序员 20多年经验IT大牛左耳朵耗子陈皓突发心梗去世 享年47岁-世界简讯
特斯拉中国召回110万辆:是真心 还是假意?
今热点:硬挑苹果!华为赚麻:增加万元折叠新机Mate X3订单 出货量或将翻倍
世界热文:白酒板块午盘走弱 贵州茅台股价下滑0.22%
接单日记(四)验证码图片生成|全球今头条
日系“药丸”?日产发布2022财年业绩:收益远超预期|热推荐
环球头条:卢伟冰揭秘Redmi Book 14:4000元档四大升级 厂商良心所在
地铁咋调头 有司机吗?看完本文你比地铁司机还懂
亚洲或将面临超级高温“烤”验:多国已破40℃ 厄尔尼诺现象要来了-环球热文
联想拯救者Y9000P冰魄白游戏本开卖 24核i9+RTX 4070仅售12499元 当前头条
俄媒:一天之内数架俄军机在俄乌边境坠毁 即时
Stimulsoft Report/Group Report报表类型简单实现|每日头条
系统错误:找不到mvcp120d.dll,无法继续执行代码
天天快播:ntp时钟服务器(ntp授时服务器)技术参数一览表
焦点短讯!宝兰德应用服务器软件与华为云GaussDB完成兼容互认证
顶象助力如祺出行打造高品质服务
全球快看:北向互换通正式上线
世界短讯!萍乡一男子利用职务便利侵占公司财物获刑
独悬变扭力梁、气囊也减配 新款丰田卡罗拉上市定档:价格或史低 当前热文
对标苹果iPad Air!华为MatePad Air真机首曝:LCD屏、骁龙888|世界新消息
全球今亮点!6月9日上映!《变形金刚7:超能勇士崛起》中文海报/角色介绍发布
110万的仰望U8领衔!多款硬派SUV申报:奇瑞这款最值得期待
超强辨识度!比亚迪腾势N7夜晚亮灯实拍:“世界级SUV”感受下 焦点热议
全球快资讯丨2023宁波技工学校新设置专业有哪些
每日热文:Grafana系列-统一展示-10-Explore Jaeger
环球微速讯:江南华南北部多降雨过程 华北黄淮等地将有高温过程
德意志银行顺利完成“互换通”下首笔交易
定档5月22日 Redmi Book 14官宣:重新定义4000元档轻薄本|天天热闻
特斯拉幕后舵手曝光 他是马斯克接班人?
热热热!北方将刷新今年来气温新高:首轮高温局地超37℃_精选
焦点信息:网飞黑人《埃及艳后》IMDb仅1.1分 近3万人给出1分
1TB只要2599元 真我11 Pro系列首销战报来了:销量破8万台 速讯
世界速看:河南太康清集镇:扎实做好防返贫动态监测帮扶工作
20230515学习笔记——js中的同步任务与异步任务,宏任务与微任务
世界快报:序列检测器(两种设计方法和四种检测模式|verilog代码|Testbench|仿真结果)
天天热资讯!Linux文件查找命令之locate与find
从3s到25ms!看看京东的接口优化技巧,确实很优雅!! 当前速递
碳酸锂市价止跌急涨 需求兑现仍需时日 全球速递
全球焦点!伯利时代首冠切尔西女足主帅:男队表现不佳,冠军献给球迷
售价10万以内 “电动吉姆尼”宝骏悦也内饰官图:小车也有双联屏
天天快消息!肉丸、鸡架超满足:东北抚顺麻辣拌6.6元/盒清仓大促
AI孙燕姿大火!央视提醒:AI歌手翻唱或涉多项侵权行为
环球新动态:断轴!韩系豪华车捷尼赛思GV60上市两个月就召回
罕见!北方今年首轮高温来袭:山东要热成灿东了 局地39度 天天快播
java~"与运算"实现保留一个数的低8位 速看
一键斩断伸向孩子的“黑手” 36名未成年人被救助-精选
提速至140km/h!浙江最快高速公路来了:杭州到宁波仅1小时
就像买菜!男子花10万块买了8套房 最便宜一套1000元:网友感慨 天天滚动
遥遥领先苹果!余承东:华为WATCH4系列首发血糖评估 环球速看料
全国最大高铁“驾校”揭秘:16台模拟驾驶实训舱 如同开真高铁
全球热门:假把式!小区监控探头是粘上的,限期整改!
两类存款利率加点上限调整今起执行 部分中小银行迅速行动
你手机装了几款APP?人均安装31个APP 年龄越小装的越多
摊主再回应买彩票中2574万 21人合买有钱一起赚:买一股能分百万 都分到钱
没人看了?美国付费有线电视用户跌至30年最低
如何使用多米诺骨牌作为派对主题_什么生日礼物送学生朋友最合适男生 世界简讯
读SQL进阶教程笔记16_SQL优化让SQL飞起来
一万的票隔壁唱了九千八 粉丝吐槽听不清:盖过周杰伦声音 环球要闻
热点在线丨险遭退市 老牌日化企业广州浪奇突然宣布不再卖洗衣粉
多地出手严控老年代步车 全面封杀“老头乐”:网友吵翻 你支持谁?
当前关注:电饭煲内胆是什么材质 电饭煲内胆材质说明【详解】
全球热议:问题:Duplicate报错RMAN-03009, ORA-17628, ORA-19505
解决vmware虚拟机中的linux系统新增硬盘后无法启动
【C++】在使用PImpl技术时,template/typename的不常见用法 环球速看
南京芯视界发布新一代3D dToF芯片 性能远超索尼!
HTC又要出新手机了!但我建议 还是别出来丢人了
印度发现1.5米白化眼镜蛇:一般活不过24小时 但它不一样
天天微动态丨所有熊猫都是天生近视!有的生下来就800度?
瑞士德语文学专辑_关于瑞士德语文学专辑介绍
全球最新:JDG零封BLG 水晶哥:ELK暴毙次数太多了啊!回来吧我的小枣!
LitCTF crypto wp
世界速讯:监听容器中的文件系统事件
第139篇:微信小程序的登录流程|天天讯息
环球速看:EF命令行工具 migrate.exe 进行Code First更新数据库,6.3+使用ef6.exe
4月皮卡销量排名出炉 长城江淮大增 新能源有待突破|世界时快讯
20230514学习笔记——将代码提交到码云中 天天要闻
当前速递!【LeetCode字符串#extra】KMP巩固练习:旋转字符串、字符串轮转
世界之最大全100条_世界之最大全
大模型三大能力超越ChatGPT 千亿AI巨头科大讯飞否认做手机
大爷买二等座票带孙女坐一等座被赶 12306回应:不允许乱坐 全球热点
观点:一起来学rust|简单的mingrep
关于Kubernetes-v1.23.6-网络组件-calico的安装部署...|焦点快看
【焦点热闻】好莱坞编剧大罢工:GPT技术引发激烈争议
经典28定律?苹果在中国手机市场份额2成 赚走8成利润|每日简讯
电池只能充电500次?别太荒谬!收下这份真正的充电秘籍
【全球新要闻】摊主买彩票中2千多万激动砸摊位:称21人合买 明天就分钱
CentOS7搭建keepalived+DRBD+NFS高可用共享存储
每日精选:惠普打印机禁用非原装墨盒:官方称是为用户安全考虑
当前焦点!地狱笑话?大学母亲节配图是《进击的巨人》
泥鳅汤做法_泥鳅汤的烹饪方法 环球实时
已在轨生活160多天 航天员费俊龙从太空发回对母亲的节日祝福
热播电视剧将本科写成大专 高校不干了 官方道歉|天天聚看点
【热闻】首发紫光展锐T750!海信悄然推出F70 Lite手机
迭部县气象台发布大风蓝色预警信号【2023-05-14】