第一个go程序和基本语法

一. 第一个go程序

//package 声明开头表示代码所属包
package main //导入格式化包,引了必须用
import "fmt" //左括号{不能单起一行
func main(){
fmt.Println("Go Lang, 开始浪吧~")
} // "//"表示单行注释
// "*/ */"表示多行注释

二. 基础语法

1. 命名

  • go语言中的函数名、变量名、常量名、类型名、语句标号和包名等所有的命名,都遵循一个简单的命名规则

  • 一个名字必须以一个字母或下划线开头,后面可以跟任意数量的字母、数字或下划线

  • go区分大小写,hello和Hello不一样

  • go语言中有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
  • 还有30多个预定义的名字,用于内建的常量、类型和函数

    内建常量:
    true false iota nil 内建类型:
    int int8 int16 int32 int64
    uint uint8 uint16 uint32 uint64 uintptr
    float32 float64 complex128 complex64
    bool byte rune string error 内建函数:
    make len cap new append copy close delete
    complex real imag
    panic recover

2. 变量

2.1 声明变量:

//package 声明开头表示代码所属包
package main import "fmt" func main() {
//第一种:
var v1 int
var v2 int //第二种:
var v3, v4 int //第三种
var(
v5 int
v6 int
) //零值
fmt.Println(v1, v2, v3, v4, v5, v6) }

2.2 变量初始化

//package 声明开头表示代码所属包
package main import (
"fmt"
"reflect"
) func main() {
//方式一:
var v1 int = 10 //方式二:go编译器自动推到出变量类型
var v2 = 20 //方式三:声明加赋值, 必须在函数里面用
v3 := 30 fmt.Println(v1, v2, v3) //利用反射查看变量类型
fmt.Println("v3的类型是", reflect.TypeOf(v3))
} //10 20 30
//v3的类型是 int

2.3 变量赋值

//package 声明开头表示代码所属包
package main import "fmt" func main() {
//1. 直接赋值
var v1 int
v1 = 123 //2. 声明并赋值
i := 10
j :=20 //3. 多重赋值
var v2, v3, v4 int
v2, v3, v4 = 1, 2, 3 fmt.Println(v1, v2, v3, v4, i, j)
}

匿名变量:

//package 声明开头表示代码所属包
package main import "fmt" //(int, sting): 返回值类型
func test()(int, string){
return 666,"浪不浪"
} func main() {
// "_"是特殊变量, 占位
_, s1 := test()
fmt.Println(s1) a1, s1 := test()
fmt.Println(a1,s1)
} //浪不浪
//666 浪不浪

.

//package 声明开头表示代码所属包
package main import "fmt" var abc = 456 func main() {
//定义
var a int
var s string
fmt.Println(a,s) fmt.Printf("%d %q\n", a,s) //定义多个
var c,b int = 3,4
fmt.Println(c,b) //不指定类型定义, 可以写一行
j,k,q :=3,true,"xx"
fmt.Println(j,k,q)
} //0
//0 ""
//3 4
//3 true xx

3 常量与枚举

//package 声明开头表示代码所属包
package main import "fmt" //常量 const
const filename = "luhan.txt" ////常量必须是可确定的数字, 字符串, 布尔值
//var a = "haha"
//const file2 = a //定义函数, 函数内写常量
func consts() {
//多个常量
const (
XX = "haha1"
OO = "haha2"
filename = "haha3"
)
fmt.Println(XX, OO, filename)
} //1. 定义枚举类型
func enums() {
const (
python = 0
java = 1
golang = 2
)
fmt.Println(python, java, golang)
} //2. 自增的枚举类型
func enums1() {
const (
//iota关键字是自增
pyhton = iota
java
golang
)
fmt.Println(pyhton, java, golang)
} //3. iota还可以参与计算
func enums2() {
const (
//位运算, n*2(10*1), 2^0 = 1
b = 1 << (10 * iota)
kb
mb
gb
tb
pb
)
fmt.Println(b, kb, mb, gb, tb, pb )
} func main() {
consts()
enums1()
enums2()
} //haha1 haha2 haha3
//0 1 2
//1 1024 1048576 1073741824 1099511627776 1125899906842624

4. 数据类型

  • u开头是无符号类型

  • 8,16,32这些,最大最用是增加可移植性和维护性

  • short int long

    类型名称	有无符号	bit数
    int8 Yes 8
    int16 Yes 16
    int32 Yes 32
    int64 Yes 64
    uint8 No 8
    uint16 No 16
    uint32 No 32
    uint64 No 64
    int Yes 等于cpu位数
    uint No 等于cpu位数
    rune Yes 与 int32 等价
    byte No 与 uint8 等价
    uintptr No -

.

//package 声明开头表示代码所属包
package main import (
"fmt"
"reflect"
) func main() {
//1.整型
var v1 int32
v1 = 123
v2 := 64
fmt.Println(v1,v2)
//默认是int
fmt.Println(reflect.TypeOf(v2)) //2.浮点型
var f1 float32
f1 = 12
fmt.Println(f1)
f2 := 12.0
fmt.Println(reflect.TypeOf(f2)) //3.布尔型
var b1 bool
b1 = true
fmt.Println(b1)
b2 := (1==2)
//打印类型
fmt.Println(reflect.TypeOf(b2)) //4.字符型
var ch byte
ch = 'a'
fmt.Println(ch)
fmt.Printf("ch = %c",ch) //5.字符串
var str string
str = "luhan"
s := str[0]
fmt.Println(s)
//反括号圈起来的字符串,原样输出
str2 := `hello
luhan \n \r xx
`
fmt.Println("str2=",str2)
} //123 64
//int
//12
//float64
//true
//bool
//97
//ch = a108
//str2= hello
//luhan \n \r xx

5. fmt包的使用

输出:

//package 声明开头表示代码所属包
package main import "fmt" func main() {
//整型
a := 15
//%b:二进制
fmt.Printf("a = %b\n",a)
//只输出一个%
fmt.Printf("%%\n") //字符
ch := 'a'
fmt.Printf("ch = %c,%d\n",ch,97) //浮点
f := 3.14
//%g紧凑方式输出
fmt.Printf("f = %f,%g\n",f,f) //布尔型
fmt.Printf("%t,%t\n",true,false) //字符串
str := "hello.go"
fmt.Printf("str = %s\n",str)
} //a = 1111
//%
//ch = a,97
//f = 3.140000,3.14
//true,false
//str = hello.go

输入:

//package 声明开头表示代码所属包
package main import "fmt" func main() {
//用户输入内容, 程序接收
var v int //Print是不回车
fmt.Print("请输入一个整型:") //直接输入
//如果不是int,输出零值
fmt.Scan(&v)
fmt.Println(v)
} //请输入一个整型:5
//5

6. 类型别名

//package 声明开头表示代码所属包
package main import (
"fmt"
"reflect"
) func main() {
//type关键字定义别名
type myint int
var i myint = 100
fmt.Println(i)
fmt.Println(reflect.TypeOf(i))
} //100
//main.myint

7. 类型转换

go类型转换不允许隐式转换

//package 声明开头表示代码所属包
package main import "fmt" func main() {
var ch byte = 'a'
var i int = int(ch)
fmt.Println(ch)
fmt.Println(i)
} //97
//97

8. 运算符

  • 算术运算符

      +	相加	A + B 输出结果 30
    - 相减 A - B 输出结果 -10
    * 相乘 A * B 输出结果 200
    / 相除 B / A 输出结果 2
    % 求余 B % A 输出结果 0
    ++ 自增 A++ 输出结果 11
    -- 自减 A-- 输出结果 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
  • 位运算符

      &	按位与运算符"&"是双目运算符。 其功能是参与运算的两数各对应的二进位相与。	(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
    >> 右移运算符">>"是双目运算符。右移n位就是除以2的n次方。 其功能是把">>"左边的运算数的各二进位全部右移若干位,">>"右边的数指定移动的位数。 A >> 2 结果为
  • 赋值运算符

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

第一个go程序和基本语法的更多相关文章

  1. 编写第一个MapReduce程序—— 统计气温

    摘要:hadoop安装完成后,像学习其他语言一样,要开始写一个“hello world!” ,看了一些学习资料,模仿写了个程序.对于一个C#程序员来说,写个java程序,并调用hadoop的包,并跑在 ...

  2. 第一个PyQt程序

    这个程序虽然小,具备pyqt程序的皱型,可以作为一个模板使用了 #!/usr/bin/python3 # -*- coding: utf-8 -*- import sys from PyQt5.QtW ...

  3. 【C语言】03-第一个C程序代码分析

    前面我们已经创建了一个C程序,接下来分析一下里面的代码. 项目结构如下: 一.代码分析 打开项目中的main.c文件(C程序的源文件拓展名为.c),可以发现它是第一个C程序中的唯一一个源文件,代码如下 ...

  4. 学了C语言,如何利用CURL写一个下载程序?—用nmake编译CURL并安装

    在这一系列的前一篇文章学了C语言,如何为下载狂人写一个磁盘剩余容量监控程序?中,我们为下载狂人写了一个程序来监视磁盘的剩余容量,防止下载的东西撑爆了硬盘.可是,这两天,他又抱怨他的下载程序不好用,让我 ...

  5. 【C语言】01-第一个c程序代码分析

    创建了一个C程序,接下来分析一下里面的代码. 项目结构如下: 一.代码分析 打开项目中的main.c文件(C程序的源文件拓展名为.c),可以发现它是第一个C程序中的唯一一个源文件,代码如下: 1 #i ...

  6. [Ruby on Rails系列]3、初试Rails:使用Rails开发第一个Web程序

    本系列前两部分已经介绍了如何配置Ruby on Rails开发环境,现在终于进入正题啦! Part1.开发前的准备 本次的主要任务是开发第一个Rails程序.需要特别指出的是,本次我选用了一个(Paa ...

  7. 【2014】【辛星】【php】【秋季】【2】第一个php程序

    <span style="font-family:KaiTi_GB2312;font-size:18px;">*******************设置server** ...

  8. 做为一个Java程序员,你需要哪些傍身的技能?

    最近总有些断断续续的思考,想想从我入行以来,我到底学会了什么,做成过什么,以后要做什么,如何提升自己······· 工作3年了,常听人说3年,5年,10年是程序员的坎,每过一个都会有新的想法,新的改变 ...

  9. C#.NET学习笔记2---C#.第一个C#程序

    C#.NET学习笔记2---C#.第一个C#程序 技术qq交流群:JavaDream:251572072  教程下载,在线交流:创梦IT社区:www.credream.com 6.第一个C#程序:   ...

随机推荐

  1. http自己定义超时检測方法、主动抛出异常

    上次为了解决无网路由器超时的问题,将问题重心转移到了HttpClient. HttpUrLConnection上面,什么各种设置ReadTimeout. connectionTimeOut,还有所谓的 ...

  2. CSS3 网格布局(grid layout)基础知识 - 隐式网格自己主动布局(grid-auto-rows/grid-auto-columns/grid-auto-flow)

    网格模板(grid-template)属性及其普通写法(longhands)定义了一个固定数量的轨道.构成显式网格. 当网格项目定位在这些界限之外.网格容器通过添加隐式网格线生成隐式网格轨道. 这些隐 ...

  3. 《解读window核心编程》 之 注冊表

    1 注冊表的作用及组织形式 Windows系统使用注冊表来存储系统和应用程序配置数据.非常多系统和应用程序重要的配置的信息都存储在注冊表中. 注冊表是一种以树型结构组织的数据库.树的每个节点称 作键( ...

  4. c# 删除程序占用的文件,强力删除文件,彻底删除文件,解除文件占用

    c# 删除程序占用的文件.清理删除文件.彻底删除文件,解除文件占用 文件打开时,以共享读写模式打开 FileStream inputStream = new FileStream(name, File ...

  5. luogu3469 [POI2008]BLO_Blockade

    题目大意 给一个无向连通图,求对于每一个点,去掉该点后图中连通结点有序对的减少量. 思路 当时想这道题时,我想到:枚举每一个点,在删去它后连通的几个部分中Dfs得到各个部分的点的个数从而得到解,但是我 ...

  6. WinForm中的ListBox组件编程

    ListBox组件是一个程序设计中经常使用到的组件,在Visual C#和Visual Basic .Net程序中使用这个组件,必须要在程序中导入.Net FrameWork SDK中名称空间Syst ...

  7. P1993 小K的农场 差分约束系统

    这个题是一道差分约束系统的裸题,什么是差分约束系统呢?就是给了一些大小条件,然后让你找一个满足的图.这时就要用差分约束了. 怎么做呢?其实很简单,就是直接建图就好,但是要把所有条件变为小于等于号,假如 ...

  8. bzoj1179 [Apio2009]Atm——缩环最长路

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1179 tarjan 缩环,然后求到有酒吧的点的最长路即可: 但一开始想缩环后用拓扑序求答案, ...

  9. 79.员工薪水报表 Extjs 页面

    1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8" ...

  10. Java 解析Json数据

    Json格式字符串{success:0,errorMsg:"错误消息",data:{total:"总记录数",rows:[{id:"任务ID" ...