第一个程序

//单行注释
/*
多行注释
*/
package main // 表示当前go文件属于main包
import "fmt" // 导入包
//编译型语言需要有一个入口文件,main包下的main函数
func main(){ //定义了一个main函数包
fmt.Println("Hello,world!") // 打印hello world
//a..编辑器自动填充提供的参数名a,表示可以传多个参数
}
// 编译型语言:先编译成编译文件,在执行go.exe文件

运行Go文件:

变量

变量是什么

  变量指定了某存储单元(Memory Location)的名称,该存储单元会存储特定类型的值。在 Go 中,有多种语法用于声明变量。

声明单个变量

var name type 是声明单个变量的语法。

定义变量var

第一种:

package main //表示是main包的
import "fmt"
func main(){
// 定义变量
//方式一:全名称 go语言中,定义了变量必须使用,否者报错
// 固定的格式:var关键字 变量名 变量的类型 = 值
var age int=20 // 完整的变量名声明的方式
fmt.Println(age)
}

必须指定数据类型,不然报错

第二种:

  简略的声明方式

package main //表示是main包的
import "fmt"
func main(){
// 定义变量
//方式一:全名称 go语言中,定义了变量必须使用,否者报错
// 固定的格式:var关键字 变量名 变量的类型 = 值
//var age int=20 // 完整的变量名声明的方式
//fmt.Println(age)
//
//
////类型推导
//var age=10
//fmt.Println(age) //简略的说明
age :=20
fmt.Println(age)
}

第三种:

Go 能够通过一条语句声明多个变量。

声明多个变量的语法是 var name1, name2 type = initialvalue1, initialvalue2

package main

import "fmt"

func main() {
var width, height int = 100, 50 // 声明多个变量 fmt.Println("width is", width, "height is", heigh)
}

你可能已经想到,如果 width 和 height 省略了初始化,它们的初始值将赋值为 0。

package main

import "fmt"

func main() {
var width, height int
fmt.Println("width is", width, "height is", height)
width = 100
height = 50
fmt.Println("new width is", width, "new height is ", height)
}

上面的程序将会打印:

width is 0 height is 0
new width is 100 new height is 50

在有些情况下,我们可能会想要在一个语句中声明不同类型的变量。其语法如下:

var (
name1 = initialvalue1,
name2 = initialvalue2
)

使用上述语法,下面的程序声明不同类型的变量。

package main

import "fmt"

func main() {
var (
name = "naveen"
age = 29
height int
)
fmt.Println("my name is", name, ", age is", age, "and height is", height)
}

这里我们声明了 string 类型的 name、int 类型的 age 和 height(我们将会在下一教程中讨论 golang 所支持的变量类型)。运行上面的程序会产生输出 my name is naveen , age is 29 and height is 0

其他注意事项:

    //变量不能重复定义
//var a int=10
//var a =10
////a:=10
//fmt.Println(a) //强类型语言,类型是固定的
//var a =10
//a=100
//b:="lqz"
//a=b
//fmt.Println(a)
//fmt.Println(b) //定义不赋初值 :int 类型默认值是0 string 类型默认值是空字符串
//var a int
//a=10
//var b string //b="lqz"
//fmt.Println(b) //同时定义多个变量
//var a =10
//var b=100
//var a,b int
//var a,b int=10,20
//var a,b=10,20
//var a,b=10,"lqz"
//a,b:=10,20
//a,b:=10,"lqz"
//fmt.Println(a)
//fmt.Println(b)   // 多种类型
var (
name = "naveen"
age = 29
height int
)
fmt.Println(name)
fmt.Println(age)
fmt.Println(height) }

变量的类型

类型

下面是 Go 支持的基本类型:

  • bool
  • 数字类型
    • int8, int16, int32, int64, int
    • uint8, uint16, uint32, uint64, uint
    • float32, float64
    • complex64, complex128
    • byte
    • rune
  • string

bool

bool 类型表示一个布尔值,值为 true 或者 false。

package main

import "fmt"

func main() {
a := true
b := false
fmt.Println("a:", a, "b:", b)
c := a && b
fmt.Println("c:", c)
d := a || b
fmt.Println("d:", d)
}

在上面的程序中,a 赋值为 true,b 赋值为 false。

c 赋值为 a && b。仅当 a 和 b 都为 true 时,操作符 && 才返回 true。因此,在这里 c 为 false。

当 a 或者 b 为 true 时,操作符 || 返回 true。在这里,由于 a 为 true,因此 d 也为 true。我们将得到程序的输出如下。

a: true b: false
c: false
d: true

有符号整型

int8:表示 8 位有符号整型
大小:8 位
范围:-128~127

int16:表示 16 位有符号整型
大小:16 位
范围:-32768~32767

int32:表示 32 位有符号整型
大小:32 位
范围:-2147483648~2147483647

int64:表示 64 位有符号整型
大小:64 位
范围:-9223372036854775808~9223372036854775807

int:根据不同的底层平台(Underlying Platform),表示 32 或 64 位整型。除非对整型的大小有特定的需求,否则你通常应该使用 int 表示整型。
大小:在 32 位系统下是 32 位,而在 64 位系统下是 64 位。
范围:在 32 位系统下是 -2147483648~2147483647,而在 64 位系统是 -9223372036854775808~9223372036854775807。

无符号整型

uint8:表示 8 位无符号整型
大小:8 位
范围:0~255

uint16:表示 16 位无符号整型
大小:16 位
范围:0~65535

uint32:表示 32 位无符号整型
大小:32 位
范围:0~4294967295

uint64:表示 64 位无符号整型
大小:64 位
范围:0~18446744073709551615

uint:根据不同的底层平台,表示 32 或 64 位无符号整型。
大小:在 32 位系统下是 32 位,而在 64 位系统下是 64 位。
范围:在 32 位系统下是 0~4294967295,而在 64 位系统是 0~18446744073709551615。

浮点型

float32:32 位浮点数
float64:64 位浮点数

下面一个简单程序演示了整型和浮点型的运用。

package main

import (
"fmt"
) func main() {
a, b := 5.67, 8.97
fmt.Printf("type of a %T b %T\n", a, b)
sum := a + b
diff := a - b
fmt.Println("sum", sum, "diff", diff) no1, no2 := 56, 89
fmt.Println("sum", no1+no2, "diff", no1-no2)
}

a 和 b 的类型根据赋值推断得出。在这里,a 和 b 的类型为 float64(float64 是浮点数的默认类型)。我们把 a 和 b 的和赋值给变量 sum,把 b 和 a 的差赋值给 diff,接下来打印 sum 和 diff。no1 和 no2 也进行了相同的计算。上述程序将会输出:

type of a float64 b float64
sum 14.64 diff -3.3000000000000007
sum 145 diff -33

简单的总结:

    //数字类型
/*
int类型:表示整数,int8 int16 int32 int64
计算机最小计量单位:bit位 int8 是 8个比特位=1个字节,表示的范围是:正负2的7次方减1
在32位机器上int 就是int32 ,在64位机器上int就是int64
uint类型:表示正整数 uint8 uint16...
float类型:表示小数只有float32和float64
complex64类型:复数
byte: uint8的别名
rune:int32的别名
*/
 

复数类型

complex64:实部和虚部都是 float32 类型的的复数。
complex128:实部和虚部都是 float64 类型的的复数。

内建函数 complex用于创建一个包含实部和虚部的复数。complex 函数的定义如下:

 
func complex(r, i FloatType) ComplexType

其他数字类型

byte 是 uint8 的别名。
rune 是 int32 的别名。 在学习字符串的时候,我们会详细讨论 byte 和 rune。

string 类型

  在 Golang 中,字符串是字节的集合。如果你现在还不理解这个定义,也没有关系。我们可以暂且认为一个字符串就是由很多字符组成的。我们后面会在一个教程中深入学习字符串。 下面编写一个使用字符串的程序。

package main

import (
"fmt"
) func main() {
first := "Naveen"
last := "Ramanathan"
name := first +" "+ last
fmt.Println("My name is",name)
}

上面程序中,first 赋值为字符串 "Naveen",last 赋值为字符串 "Ramanathan"。+ 操作符可以用于拼接字符串。我们拼接了 first、空格和 last,并将其赋值给 name。上述程序将打印输出 My name is Naveen Ramanathan

还有许多应用于字符串上面的操作,我们将会在一个单独的教程里看见它们。

类型转换

Go 有着非常严格的强类型特征。Go 没有自动类型提升或类型转换。我们通过一个例子说明这意味着什么。

package main

import (
"fmt"
) func main() {
i := 55 //int
j := 67.8 //float64
sum := i + j //不允许 int + float64
fmt.Println(sum)
}

上面的代码在 C 语言中是完全合法的,然而在 Go 中,却是行不通的。i 的类型是 int ,而 j 的类型是 float64 ,我们正试图把两个不同类型的数相加,Go 不允许这样的操作。如果运行程序,你会得到 main.go:10: invalid operation: i + j (mismatched types int and float64)

要修复这个错误,i 和 j 应该是相同的类型。在这里,我们把 j 转换为 int 类型。把 v 转换为 T 类型的语法是 T(v)。

package main

import (
"fmt"
) func main() {
i := 55 //int
j := 67.8 //float64
sum := i + int(j) //j is converted to int
fmt.Println(sum)
}

现在,当你运行上面的程序时,会看见输出 122

赋值的情况也是如此。把一个变量赋值给另一个不同类型的变量,需要显式的类型转换。下面程序说明了这一点。

package main

import (
"fmt"
) func main() {
i := 10
var j float64 = float64(i) // 若没有显式转换,该语句会报错
fmt.Println("j", j)
}

在第 9 行,i 转换为 float64 类型,接下来赋值给 j。如果不进行类型转换,当你试图把 i 赋值给 j 时,编译器会抛出错误。

常量

定义

在 Go 语言中,术语"常量"用于表示固定的值。比如 5 、-89、 I love Go67.89 等等。

package main

func main() {
const a = 55 // 允许
a = 89 // 不允许重新赋值
}

常量的值会在编译的时候确定。因为函数调用发生在运行时,所以不能将函数的返回值赋值给常量。

package main

import (
"fmt"
"math"
) func main() {
fmt.Println("Hello, playground")
var a = math.Sqrt(4) // 允许
const b = math.Sqrt(4) // 不允许
}

字符串常量

  双引号中的任何值都是 Go 中的字符串常量。例如像 Hello World 或 Sam 等字符串在 Go 中都是常量。

什么类型的字符串属于常量?答案是他们是无类型的。

像 Hello World 这样的字符串常量没有任何类型。

const hello = "Hello World"

意味着定义一个常量的关键参数时“const”

//常量:恒定不变的量
package main import "fmt" func main() {
   //const trueConst = true 布尔型常量
//var a int=10 //定义了一个常量a
//const a int=10
const a =10
//a=100
fmt.Println(a)
const b ="192.168.1.1" }

函数

  函数:(function)

函数是什么?

函数是一块执行特定任务的代码。一个函数是在输入源基础上,通过执行一系列的算法,生成预期的输出。

函数的声明

在 Go 语言中,函数声明通用语法如下:

func functionname(parametername type) returntype {
// 函数体(具体实现的功能)
}

函数的声明以关键词 func 开始,后面紧跟自定义的函数名 functionname (函数名)。函数的参数列表定义在 ( 和 ) 之间,返回值的类型则定义在之后的 returntype (返回值类型)处。声明一个参数的语法采用 参数名 参数类型 的方式,任意多个参数采用类似,

(parameter1 type, parameter2 type) 即(参数1 参数1的类型,参数2 参数2的类型)的形式指定。之后包含在 { 和 } 之间的代码,就是函数体。

函数中的参数列表和返回值并非是必须的,所以下面这个函数的声明也是有效的

func functionname() {
// 译注: 表示这个函数不需要输入参数,且没有返回值
}

示例函数

//函数
package main //func main() {
//test()
//test(1,2)
//var a int=test(1,2)
//var a =test(1,2)
//var a string
//a =test(1,2)
//fmt.Println(a)
//var a int
//var b string
//a,b:=test(1,2)
fmt.Println("a","b")
}

多返回值

//函数定义,语法
//func关键字 函数名(参数1 类型,参数2 类型) (返回值类型){}
//无参数,无返回值
//func test() {
// fmt.Println("xxx")
//
//}
//有两个int类型的参数
//func test(a int,b int) {
//func test(a ,b int) {
//func test(a ,b int,c string) {
// fmt.Println(a+b)
//} //有一个数字类型返回值,一定要指定返回值类型
//func test(a,b int) int {
// return a+b
//}
//func test(a,b int) string {
// return "lqz"
//} //返回多个值
//func test(a,b int) (int,string) {
// return a+b,"成功"
//}

命名返回值

  从函数中可以返回一个命名值。一旦命名了返回值,可以认为这些值在函数第一行就被声明为变量了。

return 可以不写返回值,因为已经被定义过了。

//命名返回值
//func test(a,b int) (c int, d string) {
// c=10
// d="成功"
// return
//}

空白符

  **_** 在 Go 中被用作空白符,可以用作表示任何类型的任何值。

    //不要第二个返回值
//a,_:=test(1,2)
//fmt.Println(a)
//fmt.Printf(_)

理解:不给2赋值,打印输出2。

例子:

不定长参数,闭包函数

package main
func main() //在go中没有位置参数和关键字参数,都是位置参数,也没有默认参数
//func test(a,b int) int {
// return a+b
//} //不定长参数
//func test(a ...interface{}) {
// fmt.Println(a)
//
//} //闭包函数
//定义在函数内部,对外部作用域有引用
//go语言中,函数是一等公民,可以把函数赋值给一个变量,函数就是一等公民 //func test(a int) (int,int) {
// fmt.Println("xxx")
// return 1,2
//
//}
//
//func main() {
// var a func(a int)(int,int)
// //var a =test
// a=test
// a(1)
//}

不定长源码:

简单的例子:

package main

import "fmt"

func main() {
//test(1,"Rose")
index(1,2,2,65,784,646,12,21222)
}
//func test(a...interface{}){
// fmt.Println(a)
//}
func index(a...int) {
fmt.Println(a)
} >>>:[1 2 2 65 784 646 12 21222]

闭包函数

package main

import "fmt"

//闭包函数
//定义在函数内部,对外部作用域有引用
//go语言中,函数是一等公民,可以把函数赋值给一个变量,函数就是一等公民
func test(a int) (int,int) {
fmt.Println("xxx")
return 1,2
}
func main() {
var a func(a int)(int,int)
//var a =test
a=test
a(1)
}

  

 
 

Go-语言基础-变量-类型-函数的更多相关文章

  1. 黑马程序员——C语言基础 变量类型 结构体

    Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结) (一)变量类型 1)局部变量 1> 定义:在函数内部定义的变量,称为 ...

  2. 第二十三节:Java语言基础-详细讲解函数与数组

    函数 函数在Java中称为方法,在其他语言中可能称为函数,函数,方法就是定义在类中具有特定功能的程序.函数,在Java中可称为方法. 函数的格式: 修饰符 返回值类型 函数名(参数类型 参数1, 参数 ...

  3. typescript学习笔记(一)---基础变量类型

    作为一个前端开发者,学习新技术跟紧大趋势是必不可少的.随着2019年TS的大火,我打算利用一个月的时间学习这门语言.接下来的几篇文章是我学习TS的学习笔记,其中也会掺杂一些学习心得.话不多说,先从基础 ...

  4. C语言中变量和函数的作用域和链接属性

    C语言中变量和函数的作用域和链接属性 作用域 代码块作用域: 代码块指的是使用"{}"包围起来的部分. 在代码块中定义的变量,代码块之外是不能访问的. 代码块嵌套之后的变量作用域, ...

  5. [11 Go语言基础-可变参数函数]

    [11 Go语言基础-可变参数函数] 可变参数函数 什么是可变参数函数 可变参数函数是一种参数个数可变的函数. 语法 如果函数最后一个参数被记作 ...T ,这时函数可以接受任意个 T 类型参数作为最 ...

  6. iOS开发环境C语言基础 变量 、 数据类型和变量赋值 、 其他 、 运算符

    1 变量使用常用错误汇总 1.1 问题 在我们使用变量的过程中,会遇到一些问题,在此将这些问题进行汇总,在今后使用的过程中,不出错.即使出现错误也可以很快地找到问题所在. 1.2 方案 变量在使用的过 ...

  7. C语言---指针变量作为函数参数

    在C语言中,函数的参数不仅可以是整数.小数.字符等具体的数据,还可以是指向它们的指针.用指针变量作函数参数可以将函数外部的地址传递到函数内部,使得在函数内部可以操作函数外部的数据,并且这些数据不会随着 ...

  8. GO_05:GO语言基础map与函数

    1. map 1. 类似其它语言中的哈希表活着字典,以 key-value 形式存储数据 2. key 必须是支持 == 或 != 比较运算的类型,不可以是函数.map 或 slice 3. map ...

  9. GO语言基础map与函数

    1. map 1. 类似其它语言中的哈希表活着字典,以 key-value 形式存储数据 2. key 必须是支持 == 或 != 比较运算的类型,不可以是函数.map 或 slice 3. map ...

随机推荐

  1. Flink笔记(二) DataStream Operator(数据流操作)

    DataStream Source 基于文件 readTextFile(path) 读取 text 文件的数据 readFile(fileInputFormat, path) 通过自定义的读取方式, ...

  2. Docker Python 例子

    版权所有,未经许可,禁止转载 章节 Docker 介绍 Docker 和虚拟机的区别 Docker 安装 Docker Hub Docker 镜像(image) Docker 容器(container ...

  3. ORM——Mybatis

    引言 ORM 是 blablabla…… Mybatis知识点

  4. ProxyPass与ProxyPassReverse及ProxyPassMatch的概述

    转载自:https://blog.csdn.net/xiaokui_wingfly/article/details/51481653 apache中的mod_proxy模块主要作用就是进行url的转发 ...

  5. Java基础之内省

    Java基础之内省 什么是内省   首先,我们要知道什么是内省.按我自己的理解就是在反射的原理上进行封装,来更方便的操作JavaBean JavaBean就是特殊格式的类,其规范为: JavaBean ...

  6. 每天一点点之javascript(ES6) - Map对象

    1.语法 键/值对的集合. mapObj = new Map() 注:集合中的键和值可以是任何类型.如果使用现有密钥向集合添加值,则新值会替换旧值. 2.属性下表列出了 Map 对象的属性和描述. 构 ...

  7. windows driver 定时器的使用

    #include < Ntifs.h> #pragma warning(disable:4995) #pragma comment(lib, "Ntoskrnl.lib" ...

  8. tableau创建定量值地图

    一.官方案例:定量值地图的创建 数据形式:  过程: 分别双击经纬度(默认的纬度会自动添加到行功能区,经度到列功能区) 将Id放入标记卡详细信息 将Magnitude^10(震级^10)放入大小,(该 ...

  9. my97datepicker实现日期改变立刻触发函数

    <input type="text" class="Wdate" onclick="WdatePicker({onpicking:functio ...

  10. Vulkan SDK之 CommandBuff

    Basic Command Buffer Operation 调用指定的api, 驱动将命令放入指定的buff当中. 在其他图形API(dx,or opengl) ,glsetlinewidth驱动会 ...