变量声明

//通用形式,指定变量名,变量类型,变量值
var name int = 99
fmt.Println(name) //指定变量名,以及变量类型,未指定值的时候默认是类型零值
var age int
//可以后面赋值
age = 88
fmt.Println(age) //短变量声明,指定变量名,以及变量的值,而变量类型会自动由值的类型决定。
gender := "male" //gender变量的类型是string
fmt.Println(gender) //变量列表 要求:左右两边变量名与值的数量相同
//先定义,然后赋值
var x, y, z int //x,y,z都是int类型
x, y, z = 1, 2, 4
fmt.Println(x, y, z) //先定义,同时赋值
var o, p, q = "abc", true, 3.14
fmt.Println(o, p, q) //使用短变量的变量列表形式,需要注意,左边至少有一个新变量声明,否则报错
o, r, s, t := "changed", "xyz", false, 99
fmt.Println(o, r, s, t)

  注意,在函数中(包括自己定义的函数或者主函数中)声明的变量如果没有使用,在编译的时候,会报错。

  在函数外面定义全局变量不能使用短变量形式。

常量

const x = 13
const p int = 13
const pp, ppp = 1, 2
const (
i = 10
ii = 20
)

  在声明常量的时候,必须指定值,否则出错。

  声明在函数中的常量不使用,并不会报错,只有声明的变量或者导入的包未使用才会报错。

  注意下面这个用法:

const (
i = 1
ii
iii = 2
iiii
)
fmt.Println(i, ii, iii, iiii)// 1 1 2 2

  定义多个常量时,如果某个变量没有执行值,那么就会沿用上一个常量的值。

const与iota

  在和const联用时,iota的作用是:iota初始值为0,每出现一个常量,iota就加1

const (
i = iota
ii
iii = 4
iiii = iota
)
fmt.Println(i, ii, iii, iiii) //0 1 4 3

  

数据类型

  基本数据类型:string、bool、intX、floatX

  复合数据类型:array、struct

  引用类型:point、slice、map、func、channel

  接口类型:interface

运算符

  和其他语言一样,注意--、 ++只能后置,即只能i++、i--。

  逻辑运算符||、&&、!,这3个运算符左右两边的表达式必须是bool型,不能是int或者string类型。

类型强制转换

  在两种类型的变量相互赋值或者进行比较时,Go语言不会像其他语言一样进行隐式转换,所以必须进行显式地转换。

  所以下面两种做法是不可行的:

var f1 float32 = 3.14
var f2 float64 = 6.28
//类型不同,不能进行比较,会报错
// fmt.Println(f1 == f2) //类型不同,不能进行运算
f3 := f1 - f2
fmt.Println(f3)

  解决方法:

var f1 float32 = 3.14
var f2 float64 = 6.28 //进行强制转换
f := float32(f2) fmt.Println(f1 == f) //false f3 := f1 - f
fmt.Println(f3) //0

  

复数

c := complex(3, 4)
fmt.Println(real(c), imag(c))//3 4

  

布尔值

  注意bool值的true或者false,并不会自动转换为整型的1或者0。

字符型

  单引号只能用来表示单个字符,不能用来括字符串。

  双引号技能括单个字符,又能括字符串。

a := 'ab'   //wrong
b := 'x' //correct
c := "y" //correct
d := "abc" //correct

  

字符串  

str1 := "你 "
str2 := "好"
//使用 + 进行字符串拼接
str3 := str1 + str2 //你 好
fmt.Println(str3) length := len(str1)
//使用len()求字符串的长度时,求的是字节数,不是字符数
fmt.Println(length) //4 str := "hello world"
//取某一个索引的字符
fmt.Println(str[0]) //104
fmt.Println(string(str[0])) //h //错误用法,不能修改字符串内部的值
//str[0] = "d" //可以改变字符串的值
str = "go to hell"
fmt.Println(str) //go to hell

  

字符串截断

  截断格式str[start:end],左闭右开区间,即end位置的字符不会包含在内。省略start时,默认start为0。省略end时,默认end为字符串长度len(str)。

str := "abcdefg"
fmt.Println(str[2:4]) //cd
fmt.Println(str[2:]) //cdefg
fmt.Println(str[:4]) //abcd

  

字符串遍历

str := "abcdefg"
length := len(str)
for i := 0; i < length; i++ {
fmt.Println(str[i], string(str[i]))
}
for index, value := range str {
fmt.Println(index, string(value))
}

  

原生字符串字面值

  使用``代替双引号。可以保存内容的格式,原样输出

str := `
menu:
1、
2、
`
fmt.Println(str)

  

指针

var num int = 10
var p *int = &num
// 等价于
//p := &num
fmt.Println(num, p, *p) //10 0xc42001a0f0 10

  注意事项:

  指针的默认值是nil,不是NULL,并且go语言中没有NULL常量

  使用&取地址,使用*解引用

  不支持C语言类似的指针运算,比如指针自增等。

  使用“.”来访问目标成员,不支持“->”运算符

  不存在函数指针

结构体指针

package main
import "fmt"
type person struct {
Name string
Age int
}
func main() {
p := &person{"abc", 90}
name := p.Name
//等价于
//name := (*p).Name
fmt.Println(name)
}

数组指针

arr := [3]int{99, 999, 9999}
p := &arr
fmt.Println(arr) //[99 999 9999]
fmt.Println(p) //&[99 999 9999]
fmt.Println(*p) //[99 999 9999]

指针数组

var p [3]*int
x, y, z := 1, 11, 111
p[0], p[1], p[2] = &x, &y, &z
fmt.Println(p[0], p[1], p[2]) //0xc42001a0f0 0xc42001a0f8 0xc42001a100
fmt.Println(*p[0], *p[1], *p[2]) //1 11 111

二级指针

var num int = 10
p := &num //p保存着num的地址
pp := &p //pp保存着p的地址,即地址的地址
fmt.Println(p, *pp) //0xc42001a0f0 0xc42001a0f0
fmt.Println(&p, pp) //0xc42000c028 0xc42000c028
fmt.Println(*p, **pp) //10 10

  

type定义类型

  使用type关键字定义新的类型名,一般出现在包一级,即函数外部,如果新建的类型名字首字母大写,则在包外可以使用,否则只能在包内使用。

  格式:type new_type base_type

  注意type和C语言的typedef不同,typedef只是定义别名而已,而Go语言的type不仅定义类型名称,还包括类型的行为。

package main
import "fmt"
type Score int
func (s Score) Pass() bool {
return s >= 60
}
func main() {
var s1 Score = 69
fmt.Println(s1.Pass()) //true
}

  虽然使用type关键字定义了一个新的类型,就像上面的Score和int,虽然在底层都是int,底层都是同一个类型,但是:不能直接进行比较、计算,必须要先转换后才可比较和计算。

标准输入输出

  Print、Println、Printf

a, b, c := 1, "abc", true
fmt.Println(a, b, c) //1 abc true
fmt.Print(a, b, c, "\n") //1abctrue
fmt.Printf("%d,%s,%t\n", a, b, c) //1,abc,true

  Scan

var (
name string
age int
)
for {
fmt.Println("please intput name,age")
fmt.Scan(&name, &age)
fmt.Println("name:", name, "\t age:", age, "\n")
}

  运行结果如下:

please intput name,age
abc 30
name: abc age: 30 please intput name,age
abc
50
name: abc age: 50 please intput name,age
abc 50 xyz 99
name: abc age: 50 please intput name,age
name: xyz age: 99

  

 Scanln

var (
name string
age int
score int
)
for {
fmt.Println("please intput name,age,score")
fmt.Scanln(&name, &age, &score)
fmt.Println("name:", name, "\t age:", age, "\t score:", score, "\n")
}

  运行结果如下:

please intput name,age,score
abc
name: abc age: 0 score: 0 please intput name,age,score
abc 30
name: abc age: 30 score: 0 please intput name,age,score
abc 30 99
name: abc age: 30 score: 99

  

  Scanf

var (
name string
age int
)
fmt.Println("please intput name,age")
fmt.Scanf("%s %d", &name, &age) //输入时以空格分隔
fmt.Println("name:", name, "\t age:", age, "\n") fmt.Println("please intput name,age")
fmt.Scanf("%s,%d", &name, &age) //输入时,以逗号分隔
fmt.Println("name:", name, "\t age:", age, "\n")

  运行结果

please intput name,age
abc 99
name: abc age: 99 please intput name,age
xyz 88
name: xyz age: 99

  

  注意,Scan并不会在遇到回车换行的时候结束输入。而Scanln和Scanf都是一旦遇到回车换行,就认为本轮输入(一个Scanln或者Scanf)结束,执行下一个Scanln或者Scanf。当然,缓冲的数据,可以自动赋值。

if选择结构

if score := 61; score > 80 {
fmt.Println("优秀")
} else if score > 60 {
fmt.Println("及格")
} else {
fmt.Println("不及格")
}

  注意:花括号不可省,切不可另起一行。如果要声明变量,可以在if后面声明,并用分号分隔,分号后面跟条件。

  最最重要的是:if后面的条件必须是bool类型的值或者结果为bool类型的表达式,不可以是整型或者其他类型。

switch选择结构

var length int = 3
switch length {
case len("abc"): //可以是表达式
fmt.Println(3)
case 4:
fmt.Println(4)
default:
fmt.Println(5)
}
//输出
//3

  Go语言中的switch case结构中,每一个case条件分支末尾不用加break;

  case可以后面的条件可以使变量,也可以是常量,但是有一点:case后面的类型,要和switch后面的类型相同。

  fallthrough关键字

var score int = 12
switch score {
case 6:
fallthrough
case 12:
fmt.Println(12)
fallthrough
case 24:
fmt.Println(24)
default:
fmt.Println(36)
}
//输出
//12
//24

  如果某个case里面有fallthrough,那么,这个case的紧接着的下一个case条件会默认满足,直接执行写一个case中的语句,并不会判断下一个case的条件是否满足。

  case可以这样写

var score int = 12
switch score {
case 6, 12:
fmt.Println(6, "或者", 12)
default:
fmt.Println(36)
}

  

  省略switch后面的表达式,此时相当于if else

var score int = 90
switch {
case score > 80:
fmt.Println("优秀")
fallthrough
case score > 60:
fmt.Println("及格")
default:
fmt.Println("不及格")
}
//输出
//优秀
//及格

  

for循环

  Go语言中没有while循环和do..while循环,只有一个for循环,但是for循环有三种形式,可以替代while循环和do while循环。

for i:=0;i<10;i++{
fmt.Println(i)
}
for {
fmt.Println("这是死循环,相当于while(1)")
}
for i,v := range m{
fmt.Println("同样是死循环")
}

  上面三种用法分别对应其他语言中的for循环,while()循环,do..while循环。

  在循环中可以使用break和continue来控制循环。

Golang 入门~~基础知识的更多相关文章

  1. USB入门基础知识(转)

    源:USB入门基础知识 相关名词: 主机(Host) 设备(Device) 接口(Interface) 管道(Pipe) 管道是主机与设备端点数据传输的连接通道,代表了主机的数据缓冲区与设备端点之间交 ...

  2. Linux入门基础知识

    注:内容系兄弟连Linux教程(百度传课:史上最牛的Linux视频教程)的学习笔记. Linux入门基础知识 1. Unix和Linux发展历史 二者就像父子关系,当然Unix是老爹.1965年,MI ...

  3. React Native 入门基础知识总结

    中秋在家闲得无事,想着做点啥,后来想想,为啥不学学 react native.在学习 React Native 时, 需要对前端(HTML,CSS,JavaScript)知识有所了解.对于JS,可以看 ...

  4. Greenplum入门——基础知识、安装、常用函数

    Greenplum入门——基础知识.安装.常用函数 2017年10月08日 22:03:09 在咖啡里溺水的鱼 阅读数:8709    版权声明:本文为博主原创,允许非商业性质转载但请注明原作者和出处 ...

  5. 1)Linux程序设计入门--基础知识

    )Linux程序设计入门--基础知识 Linux下C语言编程基础知识 前言: 这篇文章介绍在LINUX下进行C语言编程所需要的基础知识.在这篇文章当中,我们将 会学到以下内容: 源程序编译 Makef ...

  6. React入门---基础知识-大纲-1

    -----------------在慕课网学习react入门笔记-------------- ---------博主边学边记录,手把手进行学习及记录---------- --------------- ...

  7. PHP基础入门(二)---入门基础知识必备

    前言 在上一章中,我们初步了解了PHP的网页基础和PHP的入门基础,今天继续给大家分享更多有关PHP的知识. 理论知识看起来可能比较枯燥一些,但是我们的实践(敲代码)毕竟离不开它. 只有理论与实践相结 ...

  8. CodeMix入门基础知识

    CodeMix在线订购年终抄底促销!火爆开抢>> CodeMix入门 CodeMix是一个Eclipse插件,可以直接从Eclipse访问VS Code和为Code OSS构建的附加扩展的 ...

  9. Vue 2.0入门基础知识之全局API

    3.全局API 3-1. Vue.directive 自定义指令 Vue.directive用于自定义全局的指令 实例如下: <body> <div id="app&quo ...

随机推荐

  1. 网络编程_UDP协议_发送端与接收端

    创建UDP传输的发送端 : 1.建立udp的socket服务   2.将要发送的数据封装到数据包中   3.通过udp的socket服务 将数据包发送出去   4.关闭socket服务(因为调用了系统 ...

  2. Windows下面安装并运行composer的步骤

    在composer官网下载得到:https://getcomposer.org/download/ Composer-Setup.exe 安装时注意:安装过程中,会提示你选择php安装目录.一直到ph ...

  3. rac添加新节点的步骤与方法2

    上一篇文章,把节点删除了.这次新增加一个节点 .新增加的节点是host03.如下: #Public IP192.168.16.45 racdb1192.168.16.46 racdb2192.168. ...

  4. 加拿大抢先低调上架技嘉RTX 2060 显卡

    RTX 2060显卡这个传说越来越接近落地成真了. 据外媒爆料,加拿大经销商已经低调上架来自技嘉的RTX 2060显卡,价格为529加元(约合394美元,2705元人民币). 考虑到RTX 2070的 ...

  5. PAT A1147 Heaps (30 分)——完全二叉树,层序遍历,后序遍历

    In computer science, a heap is a specialized tree-based data structure that satisfies the heap prope ...

  6. Ubuntu触摸屏校准

    我是在ubuntu系统中使用触摸屏,我的是两块屏幕一个是触摸屏幕一个是普通的屏幕,触摸屏使用需要校准,所以要直接入一个触摸屏,或者两个屏幕是复制的关系,不能是扩展. 1.安装已下的两个软件,有可能第一 ...

  7. C语言程序设计II—第七周教学

    第七周教学总结(8/4-14/4) 教学内容 本周的教学内容为:8.3 冒泡排序,知识点:指针与数组.重点难点:指针.数组与地址的关系:数组名作为函数参数.要求学生能够使用数组名作为函数参数进行熟练编 ...

  8. Identity(三)

    本文摘自木宛城主的 ASP.NET MVC 随想录——开始使用ASP.NET Identity,初级篇 - 木宛城主 - 博客园 由于ASP.NET Membership.ASP.NET Simple ...

  9. BZOJ4911: [Sdoi2017]切树游戏

    BZOJ 4911 切树游戏 重构了三次.jpg 每次都把这个问题想简单了.jpg 果然我还是太菜了.jpg 这种题的题解可以一眼秒掉了,FWT+动态DP简直是裸的一批... 那么接下来,考虑如何维护 ...

  10. core_cm4_simd.h文件是干嘛的?

    core_cm4_simd.h文件用于simd指令,即单指令多数据流,这个只有ARMv7架构才有,Cortex m3 m4 m7是ARMv7架构,而Cortex m0 m1是没有的. 所以,在新建Co ...