go语言一天入门(上)

 第一个go程序

package mainimport "fmt"func main() {/* 这是我的第一个简单的程序 */fmt.Println("Hello, World!")
}
  • 第一行代码 package main 定义了包名。你必须在源文件中非注释的第一行指明这个文件属于哪个包,如:package main。package main表示一个可独立执行的程序,每个 Go 应用程序都包含一个名为 main 的包。
  • 下一行 import "fmt" 告诉 Go 编译器这个程序需要使用 fmt 包(的函数,或其他元素),fmt 包实现了格式化 IO(输入/输出)的函数。
  • 下一行 func main() 是程序开始执行的函数。main 函数是每一个可执行程序所必须包含的,一般来说都是在启动后第一个执行的函数(如果有 init() 函数则会先执行该函数)。
  • 下一行 /*...*/ 是注释,在程序执行时将被忽略。单行注释是最常见的注释形式,你可以在任何地方使用以 // 开头的单行注释。多行注释也叫块注释,均已以 /* 开头,并以 */ 结尾,多行注释一般用于包的文档描述或注释成块的代码片段。
  • 下一行 fmt.Println(...) 可以将字符串输出到控制台,并在最后自动增加换行字符 \n。
  • 当标识符(包括常量、变量、类型、函数名、结构字段等等)以一个大写字母开头,如:Group1,那么使用这种形式的标识符的对象就可以被外部包的代码所使用(客户端程序需要先导入这个包),这被称为导出(像面向对象语言中的 public);标识符如果以小写字母开头,则对包外是不可见的,但是他们在整个包的内部是可见并且可用的(像面向对象语言中的 protected )。

数据类型

Go语言的基本类型有:

  • bool
  • string
  • int、int8、int16、int32、int64
  • uint、uint8、uint16、uint32、uint64、uintptr
  • byte // uint8 的别名
  • rune // int32 的别名 代表一个 Unicode 码
  • float32、float64
  • complex64、complex128

变量

Go语言是静态类型语言,因此变量(variable)是有明确类型的,编译器也会检查变量类型的正确性。

1)声明变量的一般形式是使用 var 关键字:var name type

Go和许多编程语言不同,它在声明变量时将变量的类型放名称后。这样做的好处就是可以避免像C语言中那样含糊不清的声明形式,例如:int* a, b; 。其中只有 a 是指针而 b 不是。如果你想要这两个变量都是指针,则需要将它们分开书写。而在 Go 中,则可以和轻松地将它们都声明为指针类型:var a, b *int

多变量声明

var (a intb stringc []float32d func() boole struct {x int}
)

 

2)除 var 关键字外,还可使用更加简短的变量定义和初始化语法。

名字 := 表达式

需要注意的是,简短模式(short variable declaration)有以下限制:

  • 定义变量,同时显式初始化。
  • 不能提供数据类型。
  • 只能用在函数内部。


和 var 形式声明语句一样,简短变量声明语句也可以用来声明和初始化一组变量:

i, j := 0, 1

3)根据值自行判定变量类型。

package main
import "fmt"
func main() {var d = truefmt.Println(d)
}

算术运算符

package mainimport "fmt"func main() {var a int = 21var b int = 10var c intc = a + bfmt.Printf("第一行 - c 的值为 %d\n", c )c = a - bfmt.Printf("第二行 - c 的值为 %d\n", c )c = a * bfmt.Printf("第三行 - c 的值为 %d\n", c )c = a / bfmt.Printf("第四行 - c 的值为 %d\n", c )c = a % bfmt.Printf("第五行 - c 的值为 %d\n", c )a++fmt.Printf("第六行 - a 的值为 %d\n", a )a=21   // 为了方便测试,a 这里重新赋值为 21a--fmt.Printf("第七行 - a 的值为 %d\n", a )
}
第一行 - c 的值为 31
第二行 - c 的值为 11
第三行 - c 的值为 210
第四行 - c 的值为 2
第五行 - c 的值为 1
第六行 - a 的值为 22
第七行 - a 的值为 20

位运算符

位运算符对整数在内存中的二进制位进行操作。

下表列出了位运算符 &, |, 和 ^ 的计算:

 

pqp & qp | qp ^ q
00000
01011
11110
10011

 

假定 A = 60; B = 13; 其二进制数转换为:

A = 0011 1100B = 0000 1101-----------------A&B = 0000 1100A|B = 0011 1101A^B = 0011 0001

 

运算符描述实例
&参与运算的两数各对应的二进位相与。(A & B) 结果为 12, 二进制为 0000 1100
|参与运算的两数各对应的二进位相或(A | B) 结果为 61, 二进制为 0011 1101
^参与运算的两数各对应的二进位相异或,当两对应的位相异时,结果为1。(A ^ B) 结果为 49, 二进制为 0011 0001
<<左移n位就是乘以2的n次方。 其功能把"<<"左边的运算数的各二进位全部左移若干位,由"<<"右边的数指定移动的位数,高位丢弃,低位补0。A << 2 结果为 240 ,二进制为 1111 0000

 赋值运算符

下表列出了所有Go语言的赋值运算符。

运算符描述实例
=简单的赋值运算符,将一个表达式的值赋给一个左值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; 是一个指针变量

以下实例演示了其他运算符的用法:

实例

package mainimport "fmt"func main() {var a int = 4var b int32var c float32var ptr *int/* 运算符实例 */fmt.Printf("第 1 行 - a 变量类型为 = %T\n", a );fmt.Printf("第 2 行 - b 变量类型为 = %T\n", b );fmt.Printf("第 3 行 - c 变量类型为 = %T\n", c );/*  & 和 * 运算符实例 */ptr = &a     /* 'ptr' 包含了 'a' 变量的地址 */fmt.Printf("a 的值为  %d\n", a);fmt.Printf("*ptr 为 %d\n", *ptr);
}

以上实例运行结果:

第 1 行 - a 变量类型为 = int
第 2 行 - b 变量类型为 = int32
第 3 行 - c 变量类型为 = float32
a 的值为  4
*ptr 为 4

运算符优先级

由上至下代表优先级由高到低:

优先级运算符
5* / % << >> & &^
4+ - | ^
3== != < <= > >=
2&&
1||

循环

普通for循环

package mainimport "fmt"func main() {sum := 0for i := 0; i <= 10; i++ {sum += i}fmt.Println(sum)
}

 foreach

这种格式的循环可以对字符串、数组、切片等进行迭代输出元素。

package main
import "fmt"func main() {strings := []string{"google", "runoob"}for i, s := range strings {fmt.Println(i, s)}numbers := [6]int{1, 2, 3, 5} for i,x:= range numbers {fmt.Printf("第 %d 位 x 的值 = %d\n", i,x)}  
}

 

函数

func function_name( [parameter list] ) [return_types] {函数体
}
  • func:函数由 func 开始声明
  • function_name:函数名称,函数名和参数列表一起构成了函数签名。
  • parameter list:参数列表,参数就像一个占位符,当函数被调用时,你可以将值传递给参数,这个值被称为实际参数。参数列表指定的是参数类型、顺序、及参数个数。参数是可选的,也就是说函数也可以不包含参数。
  • return_types:返回类型,函数返回一列值。return_types 是该列值的数据类型。有些功能不需要返回值,这种情况下 return_types 不是必须的。
  • 函数体:函数定义的代码集合。
/* 函数返回两个数的最大值 */
func max(num1, num2 int) int {/* 声明局部变量 */var result intif (num1 > num2) {result = num1} else {result = num2}return result 
}

返回多个值

package mainimport "fmt"func swap(x, y string) (string, string) {return y, x
}func main() {a, b := swap("Google", "Runoob")fmt.Println(a, b)
}

引用传参

package mainimport "fmt"func main() {/* 定义局部变量 */var a int = 100var b int= 200fmt.Printf("交换前,a 的值 : %d\n", a )fmt.Printf("交换前,b 的值 : %d\n", b )/* 调用 swap() 函数* &a 指向 a 指针,a 变量的地址* &b 指向 b 指针,b 变量的地址*/swap(&a, &b)fmt.Printf("交换后,a 的值 : %d\n", a )fmt.Printf("交换后,b 的值 : %d\n", b )
}func swap(x *int, y *int) {var temp inttemp = *x    /* 保存 x 地址上的值 */*x = *y      /* 将 y 值赋给 x */*y = temp    /* 将 temp 值赋给 y */
}

数组

声明:

语法格式如下:

var variable_name [SIZE] variable_type

以上为一维数组的定义方式。例如以下定义了数组 balance 长度为 10 类型为 float32:

var balance [10] float32

初始化:

var balance = [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0}

初始化数组中 {} 中的元素个数不能大于 [] 中的数字。

如果忽略 [] 中的数字不设置数组大小,Go 语言会根据元素的个数来设置数组的大小:

 var balance = [...]float32{1000.0, 2.0, 3.4, 7.0, 50.0}

该实例与上面的实例是一样的,虽然没有设置数组的大小。

 balance[4] = 50.0

初始化二维数组:

a = [3][4]int{  {0, 1, 2, 3} ,   /*  第一行索引为 0 */{4, 5, 6, 7} ,   /*  第二行索引为 1 */{8, 9, 10, 11},   /* 第三行索引为 2 */
}

注意:以上代码中倒数第二行的 } 必须要有逗号,因为最后一行的 } 不能单独一行,也可以写成这样:

a = [3][4]int{  {0, 1, 2, 3} ,   /*  第一行索引为 0 */{4, 5, 6, 7} ,   /*  第二行索引为 1 */{8, 9, 10, 11}}   /* 第三行索引为 2 */

指针

和c一样

package mainimport "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 )
}
a 变量的地址是: 20818a220
ip 变量储存的指针地址: 20818a220
*ip 变量的值: 20

空指针判断:

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

多重指针: 

package mainimport "fmt"func main() {var a intvar ptr *intvar pptr **inta = 3000/* 指针 ptr 地址 */ptr = &a/* 指向指针 ptr 地址 */pptr = &ptr/* 获取 pptr 的值 */fmt.Printf("变量 a = %d\n", a )fmt.Printf("指针变量 *ptr = %d\n", *ptr )fmt.Printf("指向指针的指针变量 **pptr = %d\n", **pptr)
}
变量 a = 3000
指针变量 *ptr = 3000
指向指针的指针变量 **pptr = 3000

 

 

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

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

相关文章

Jquery 全选,反选

<script src"../js/jquery-1.6.2.min.js" type"text/javascript"></script><script language"javascript" type"text/javascript">$(function(){$("#selectAll").click(function(){//全选$("#playLi…

go语言一天入门(下)

结构体 和c一样 package mainimport "fmt"type Books struct {title stringauthor stringsubject stringbook_id int }func main() {// 创建一个新的结构体fmt.Println(Books{"Go 语言", "www.runoob.com", "Go 语言教程", 6495407}…

图的遍历算法【数据结构F】

图的遍历算法有哪两种&#xff1f; 深度优先调度算法---------将图结构看成是树形结构&#xff0c;树形结构的子图直接是没有交叉的&#xff0c;但是对于图结构的树形结构之间是有交叉的&#xff0c;类比于树形结构的二叉树&#xff0c;左指数和右指数都会相应的经历三次&#…

go语言快速刷《程序员面试金典》(1)

实现一个算法&#xff0c;确定一个字符串 s 的所有字符是否全都不同。 一个数组统计是否有 func isUnique(astr string) bool {var arr[26] int;for _,ch:range astr{num:ch-aif(arr[num]1){return false}arr[num]}return true } 给定两个字符串 s1 和 s2&#xff0c;请编写一…

最小生成树【数据结构】

前提 【1】网的最小生成树&#xff0c;涉及到生成树了那么就会有最小的权值在里面了 【2】对于一个图来说生成树是由多个的&#xff0c;并不是唯一的 【3】&#xff1a;广度优先算法的遍历是可以得到生成树的&#xff0c;深度优先算法也是可以得到生成树的 任意的一个联通网&am…

go语言快速刷《程序员面试金典》(2)

字符串轮转。给定两个字符串s1和s2&#xff0c;请编写代码检查s2是否为s1旋转而成&#xff08;比如&#xff0c;waterbottle是erbottlewat旋转后的字符串&#xff09;。 示例1 输入&#xff1a;s1 "waterbottle", s2 "erbottlewat" 输出&#xff1a;T…

广义表的基本概念【数据结构】

实名广义表与匿名广义表的区别&#xff1a;对于匿名的广义表的表示方法我们认为一对括号就是一个广义表&#xff0c;里面的数据可以是广义表也可以是 原子&#xff0c;对于有名字的广义表&#xff0c;也就是大写的字母我们可以直接认为大写的就是广义表的表示方法小练习----广义…

go语言快速刷《程序员面试金典》(3)

编写程序以 x 为基准分割链表&#xff0c;使得所有小于 x 的节点排在大于或等于 x 的节点之前。如果链表中包含 x&#xff0c;x 只需出现在小于 x 的元素之后(如下所示)。分割元素 x 只需处于“右半部分”即可&#xff0c;其不需要被置于左右两部分之间。 示例: 输入: head …

树和二叉树【数据结构】

基本概念 ADT的定义 基本操作 对比树形结构和线性结构 基本术语以及注意事项-不能错误简单的我以为 二叉树是度数小于等于2的树&#xff0c;而不是度为2的树&#xff0c;一定要记住这个概念 小知识&#xff1a;二进制转换成为十进制的方法名称叫做位权求和法&#xff0c;用到…

leetcode557. 反转字符串中的单词 III python,处理字符串的神!

给定一个字符串&#xff0c;你需要反转字符串中每个单词的字符顺序&#xff0c;同时仍保留空格和单词的初始顺序。 示例 1: 输入: "Lets take LeetCode contest" 输出: "steL ekat edoCteeL tsetnoc" 注意&#xff1a;在字符串中&#xff0c;每个单词由…

数据库2.1.1mysql的特点

在mysql5.1当中&#xff0c;mysqlab公司引入了新的插件式存储引擎体系结构&#xff0c;也许将存储引擎加载到正在运行的mysql服务器当中&#xff0c;使用mysql插件是存储引擎体系结构允许数据库用户为特定的应用需求选择专门的存储引擎&#xff0c;完全不需要管理任何特殊的应用…

leetcode369. 给单链表加一

用一个 非空 单链表来表示一个非负整数&#xff0c;然后将这个整数加一。 你可以假设这个整数除了 0 本身&#xff0c;没有任何前导的 0。 这个整数的各个数位按照 高位在链表头部、低位在链表尾部 的顺序排列。 示例: 输入: [1,2,3] 输出: [1,2,4] 思路&#xff1a; hel…

MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇

一 MyISAM 1.1 MyISAM简介 MyISAM是MySQL的默认数据库引擎&#xff08;5.5版之前&#xff09;&#xff0c;由早期的 ISAM &#xff08;Indexed Sequential Access Method&#xff1a;有索引的顺序访问方法&#xff09;所改良。虽然性能极佳&#xff0c;而且提供了大量的特性&a…

leetcode193. 有效电话号码 正则了解一下

给定一个包含电话号码列表&#xff08;一行一个电话号码&#xff09;的文本文件 file.txt&#xff0c;写一个 bash 脚本输出所有有效的电话号码。 你可以假设一个有效的电话号码必须满足以下两种格式&#xff1a; (xxx) xxx-xxxx 或 xxx-xxx-xxxx。&#xff08;x 表示一个数字…

leetcode258. 各位相加

给定一个非负整数 num&#xff0c;反复将各个位上的数字相加&#xff0c;直到结果为一位数。 示例: 输入: 38 输出: 2 解释: 各位相加的过程为&#xff1a;3 8 11, 1 1 2。 由于 2 是一位数&#xff0c;所以返回 2。 进阶: 你可以不使用循环或者递归&#xff0c;且在 O(…

leetcode412. Fizz Buzz

写一个程序&#xff0c;输出从 1 到 n 数字的字符串表示。 1. 如果 n 是3的倍数&#xff0c;输出“Fizz”&#xff1b; 2. 如果 n 是5的倍数&#xff0c;输出“Buzz”&#xff1b; 3.如果 n 同时是3和5的倍数&#xff0c;输出 “FizzBuzz”。 示例&#xff1a; n 15, 返…

leetcode359. 日志速率限制器

请你设计一个日志系统&#xff0c;可以流式接收日志以及它的时间戳。 该日志会被打印出来&#xff0c;需要满足一个条件&#xff1a;当且仅当日志内容 在过去的 10 秒钟内没有被打印过。 给你一条日志的内容和它的时间戳&#xff08;粒度为秒级&#xff09;&#xff0c;如果这…

怎样提高WebService性能大数据量网络传输处理(转)

1. 直接返回DataSet对象 特点&#xff1a;通常组件化的处理机制&#xff0c;不加任何修饰及 处理&#xff1b; 优点&#xff1a;代码精减、易于处理&#xff0c;小数据量处理较快&#xff1b; 缺点&#xff1a;大数据量的传递处理慢&#xff0c;消耗网络资源&#xff1b; 建议&…

【中国互联网江湖30年历史】再无风清扬,再有少年郎

0 马云退了。 在萧山奥体中心&#xff0c;无数阿里人的祝福中&#xff0c;流着眼泪&#xff0c;结束了自己在阿里的最后一天。 从此互联网江湖再无风清扬&#xff0c;反而多了一个叫做马云的乡村教师。 他临别一挥手&#xff0c;似乎带走了中国互联网的一个时代。 20年浮沉&…

互联网30年,泡沫如梦

人人都说互联网改变世界&#xff0c;这话没错。 但我认为互联网改变的方式&#xff0c;是泡沫。 资金&#xff0c;资源&#xff0c;人才因为一堆概念聚在一起&#xff0c;形成一个又一个的泡沫&#xff0c;然后泡沫破裂&#xff0c;大部分人失败&#xff0c;少数能够留下来的&a…