第一个程序

//单行注释
/*
多行注释
*/
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. SPOJ_DSUBSEQ Distinct Subsequences

    统计一个只由大写字母构成的字符串的,子串数目,这里指的是子串不是子序列,可以不连续,请注意 然后我按照计数DP的思想,dp[i][j]表示长度为i的子串,最后一个字母为j 然后为了去重,每一次dp的时 ...

  2. 学术Essay写作如何体现逻辑的应用

    作为一篇学术essay,逻辑要求是必不可少的.那么,学术essay如何写作才能体现逻辑呢?这就需要从语言逻辑和科学逻辑出发. 语言逻辑指的是三C原则:(1)complete(完整),(2)concis ...

  3. Spark 广播变量 和 累加器

    1. 广播变量 理解图 使用示例 # word.txt hello scala hello python hello java hello go hello julia hello C++ hello ...

  4. CGridCtrl显示图片

  5. VS2012中MFC 操作mshflexgrid插入图片

    CPictureHolder pic,picSection; pic.CreateFromBitmap(IDB_BITMAP); LPDISPATCH pPic = pic.GetPictureDis ...

  6. centos 通过命令查找已安装的部署包名称

    场景: 服务器上已经安装了sz命令,但是我们想知道他是哪个包安装的. 步骤一: [root@localhost home]# whereis sz sz: /usr/bin/sz /usr/share ...

  7. SASS - 操作符

    SASS – 简介 SASS – 环境搭建 SASS – 使用Sass程序 SASS – 语法 SASS – 变量 SASS- 局部文件(Partial) SASS – 混合(Mixin) SASS ...

  8. spring boot集成mybatis(2) - 使用pagehelper实现分页

    Spring Boot 集成教程 Spring Boot 介绍 Spring Boot 开发环境搭建(Eclipse) Spring Boot Hello World (restful接口)例子 sp ...

  9. Android进阶——Android消息机制之Looper、Handler、MessageQueen

    Android消息机制可以说是我们Android工程师面试题中的必考题,弄懂它的原理是我们避不开的任务,所以长痛不如短痛,花点时间干掉他,废话不多说,开车啦 在安卓开发中,常常会遇到获取数据后更新UI ...

  10. DQL多表查询

    DQL多表查询 一.多表查询实现多个表之间查询数据 1.交叉连接笛卡尔积:A表中的每一行匹配B表中的每一行基本结构:select [数据库名1.]表名1,属性名1,......, [数据库名.]表名. ...