Go学习笔记-基础知识

Go 学习笔记-基础知识

Go(又称Golang) 是Google 开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言

Go 特性

静态类型并具有丰富的内置类型

函数多返回值

错误处理机制

语言层并发

面向对象: 使用类型、组合、接口来实现面向对象

自动垃圾回收机制

交差编译

1. 在mac 上安装

 tar -C /usr/local -xzf go$VERSION.$OS-$ARCH.tar.gz
 设置GOROOT  GOPATH  GOPROXY  
 #GOROOT
 export PATH=$PATH:/usr/local/go/bin
 #GOPATH
 export GOPATH=$HOME/GoWork
 export PATH=$PATH:$GOPATH/bin

 #GOROOT 是go安装目录路径
 #GOPATH 工作路径,
      bin 是可执行文件存放路径
      pkg 编译包时,生成文件存放路径
      src 源码路径  
 #GOPROXY 设置
 go env -w GOPROXY=https://goproxy.cn,direct 
 

2. GO Module设置

go env -w GO111MODULE=on
godoc -http=:8000   官方文档查看

3. Go hello word

package main  //定义包main   

import (
	"fmt"   //导入标准包fmt 
)
// 程序入口,manin 函数
func main() {
  /* 
   注释 
   这里调用fmt包下的Println 函数打印内容到控制台
  */
	fmt.Println("Hello  world") // 打印hello world 到控制台
}

4. 基本组成元素

标识符

#go 语言提供一些预先定义的标识符用来表示内置的常量、函数、类型

#在自定义标识符时避免使用

标识符:程序中定义的名字  变量名,常量名字,函数名字,自定义类型,接口,包名等进行命名,以建立名称和使用之间的关系
Go语言标识符的命名规则:

1. 只能由非空字母(Unicode)、数字、下划线(_)组成
2. 只能以字母或下划线开
3. 不能go语言关键字
4. 避免使用go语言预定义标识符
5. 标识符区分大小写
   规范:
    1.必须满足: 组成只能由非空的Unicode 编码字符串、数字、下划线组成
    2.必须满足: 必须以Unicode 编码的字符串或下划线开头(不能以数字开头)
    3.必须满足: 不能与go 的关键字冲突(package,func,var .....25 )
    建议:
     1. ASCILL 编码
     2. 变量使用驼峰式,多个英文字母首字母大写
        多个英文字母my_name   myName(驼峰)
     3. 与go内置的标识符不要冲突(string ...)

说明: 标识符区分大小写
	   my = ""
	   My = ""

内置常量: true false nil iota

内置类型:

boolbyteruneintint8int16int32int64uintuint8uint16uint32uint64uintptrfloat32float64complex64complex128stringerror

内置函数:

make、len、cap、new、append、copy、close、delete、complex、real、imag、panic、recove

空白表示符: _

5. 基本组成元素

关键字

#关键字用于特定的语法结构

#Go语言定义25个关键字

*声明:import

*实体声明和定义:

char、const、func、interface、map、struct、type、var

*流程控制:

break、case、continue、default、defer、else、fallthrough、for、go、goto、if、range、return、select、switch

*字面量:

字面量是值的表示方法,常用与对变量/常量进行初始化
主要分为: 
*标识基础数据类型值的字面量,例如: 0,1.1,true,3+4i,'a',"我爱中国"
*构造自定义的复合数据类型的类型字面量,例如: type Interval  int 
*用于表示复合数据类型值的复合字面量,用来构造array、slice、map、struct、的值,例如:{1,2,3}

操作符:

算术运算符
关系运算符
逻辑运算符
位运算符
赋值运算符
其他运算符

分隔符

小括号()   中括号[]   大括号()    分号;,  逗号,

6. 变量

变量的含义: 程序允许过程中的数据都是保存在内存中,我们想要在代码中操作某个数据时就需要去内存找到这个变量,但是如果我们直接在代码中通过内存地址去操作变量的话,代码的可读性会非常差还容易出错,所以我们就利用变量将这个数据的内存地址保存起来,以后直接通过这个变量就能找到内存上对应的数据了。

变量的类型: 变量的功能是存储数据。不同变量保存的数据类型会不一样。常见变量的数据类型有: 整型、浮点型、布尔型等。Go语言中每一个变量都有自己的类型,并且变量必须经过声明才开始使用。

变量声明: Go 语言中的变量需要声明后才能使用,同一作用域内不支持重复声明。并且Go语言的变量声明后必须使用,否则会报。

单个变量的声明与赋值

全局变量是在函数外

局部变量是在函数内,局部变量必须引用

变量的声明格式:  var  <变量名称>   <变量类型>    函数外的变量声明必须都是以var 开头进行声明
变量的赋值格式:  var  <变量名称>   <表达式>
声明的同时赋值:  var  <变量名称>   [变量类型] =<表达式>

#单个变量的声明与赋值

package main

import "fmt"

func variableZeroValue() {
	var a int
	var b string

	//变量赋值
	a = 10
	fmt.Printf("%d %q", a, b)

}
func main() {
	variableZeroValue()
	fmt.Println("hello, world")
}

6.1 变量的定义

在Go中,如果一个名字以大写字母开头,那么它就是已导出的,例如:

pi和pizza 并未以大写字母开头,所以它们是未导出的

如果将Pi 修改为pi 就是未导出的

package main

import "fmt"

func  main() {
	//局部变量给数据起一个名字
	var  msg string = "hello world"

	fmt.Println(msg)
	//其他代码
	
	fmt.Println(msg)
	//其他代码
	
	fmt.Println(msg)
	//其他代码
	fmt.Println(msg)
	//其他代码

}
# 多重赋值
package  main

import "fmt"

func main(){

   a, b := 10,20
   // 交换2个变量的值
   var tmp int
   tmp = a
   a = b
   b = tmp
   fmt.Printf("a=%d,b=%d\n",a,b)

   i ,j := 10,20
   i ,j = j,i
   fmt.Printf("i=%d,j=%d",i,j)

}

6.2 变量作用域

package main

import "fmt"

//包级别

var packageVar string = "package Var "

func main() {
	// 函数级别的
	var funcVar string = "func Var"

	{
		// 块级别的
		var blockVar string = "block Var "

		{
			//限定变量的使用范围
			//子块级别
			var innerBlockVar string = "inner block var"
			fmt.Println(packageVar, funcVar, innerBlockVar,blockVar)

		}
		fmt.Println(packageVar,funcVar,blockVar)

	}
         fmt.Println(packageVar,funcVar)
}

# 一个大括号就是一个作用域

6.3 变量的定义方式

package main

import (
   "fmt"
)

func main(){

   var name string = "xingxing"  //定义类型并且初始化了值
   var zeroString   string  // 定义变量类型,但不初始化值
   var typeString  = "xing" // 定义变量省略类型,不能省略初始化值
   //通过对应的值类型推到变量的类型

   // 短声明(必须在函数内包含函数内子块使用,不能再包级别使用)
   shortString := "xingxing" //通过对应的值类型推到变量的类型
   

   fmt.Println(name,zeroString,typeString,shortString)
}


package main

import (
	"fmt"
)

func  main(){
// 函数内(块)定义的变量必须使用
/*	var  name string = "xingxing"
	var  msg  = "hello world "
	var desc   string
*/
	var (
		name string = "xingxing"
	    msg  = "hello world "
	    desc string
	)
	x,y := "x","y"
	fmt.Println(name,msg,desc,x,y)

}

6.4 更新变量的值

package main

import (
   "fmt"
)

func main(){
   var name string = "xingxing"
   fmt.Println(name)
   name = "xing" // 更新变量的值
   fmt.Println(name)
}

7 常量声明

常量是一个简单值的标识符,在程序运行时,不会被修改的量。

常量中的数据类型只有布尔型、数字型(整数型、浮点型和复数)和字符串型

使用const 进行常量声明

package main

import "fmt"

const (
    name string = "xingxing"
    msg   = "msg"
)

func  main(){
   fmt.Println(name)
   fmt.Println(msg)
}

7.1 枚举

iota 标识符在一个小括号内,初始化为0,每调用一次+1

package main

import "fmt"


func main() {
   const (
      Mon  = iota  //在常量组中使用iota,初始化0,每次调用+1
      Tuesd
      Web
      Thur
      Fir
      Sat
      Sun
   )
     fmt.Println(Mon,Tuesd,Web,Thur,Fir,Sat,Sun)

}

8.数据类型

布尔类型: 用来表示真假,只有两个值,真  true  假 false 
数字类型
浮点类型
字符串
数组
切片
映射
自定义类型

8.1 布尔类型

*布尔类型用于真假,类型名为bool,只有两个值true 和false,占用一个字节宽度,零值为false

package main
import "fmt"
func main(){
	isGirl := true
	fmt.Println("%T,%#v", isGirl,isGirl)
	//操作
	//逻辑运算
	a,b,c,d := true,true,false,false
	//与: 左操作数与右操作数都为true,结果为true  &&
	fmt.Println("a,b:",a&&b) // true && true : true
	fmt.Println("a,c:",a&&c) // true && false : false
	fmt.Println("c,b:",c&&b)// flase && true : false
	fmt.Println("c,d:",c&&d) // false && false : false
	//或: 左操作数与右操作数只要有一个为true,结果为true ||
	fmt.Println("a,b:",a&&b) // true || true : true
	fmt.Println("a,c:",a&&c) // true || false : true
	fmt.Println("c,b:",c&&b)// flase || true : true
	fmt.Println("c,d:",c&&d) // false || false : false
	//非: 取反 true=> false, false=> true  !
	fmt.Println("c,b:",c&&b)// !true : false
	fmt.Println("c,d:",c&&d) // !false: true

}

8.2 整数类型

package main

import "fmt"

func main(){
    var age8 int8  = 31
    var age int  = 31
    fmt.Println("%T, %#v,%d\n",age8,age8,age8)
    fmt.Printf("%T,%#v,%d\n",age,age,age)
}

package main

import "fmt"

func main(){
	 var age8 int8  = 31
	 var age int  = 31
	 fmt.Println("%T, %#v,%d\n",age8,age8,age8)
	 fmt.Printf("%T,%#v,%d\n",age,age,age)

	 a,b := 2,4
	 fmt.Println(a + b )
	 fmt.Println(a - b )
	 fmt.Println(a * b )
	 fmt.Println(a/b)
	 fmt.Println(a%b)
   a++
   b--

	 fmt.Println(a,b)

	 //关系运算 > < >= <= !=  ==

	 fmt.Println(a>b)
	 fmt.Println(a<b)
	 fmt.Println(a>=b)
	 fmt.Println(a<=b)
	 fmt.Println(a==b)
	 fmt.Println(a !=b )

   fmt.Println(a,b) 

8.3 浮点数类型

浮点数用于表示带小数的数字,go 提供float32和float64两种浮点类型

 package main
 
 import (
    "fmt"
 )
 
 func main(){
    name := ""
    fmt.Print("请输入你的名字:")
    fmt.Scan(&name)
    fmt.Println("你输入的名字是:",name)
 
 
    age := 0
    fmt.Println("你输入的年龄是:",age)
 
    msg := ""
    fmt.Print("请输入你的msg:")
 
    fmt.Scan(&msg)
    fmt.Println("你输入的msg是:",msg)
 
 }

8.4 格式化输出

#使用fmt.Printf 进行格式化参数输出,占位符

%b  二进制
%c  以字符的方式打印
%d  以整数方式打印,十进制
%T  打印变量所属的类型

8.5 枚举类型

常使用iota 生成器用于初始化一系列相同规则的常量,批量声明常量的第一个常量使用iota进行赋值,此时iota被重置为0,其他常量省略类型和赋值,在每初始化一个常量则加1

package main

import "fmt"
func main() {

   const (
      c1 int = iota
      c2
      c3
      c4
   )
   fmt.Println(c1,c2,c3,c4)
}

8.6 指针类型

#指针声明需要指定存储地址中对应数据的类型,并使用*作为类型前缀,指针变量声明后会被初始化为nil,表示空指针

package main

import "fmt"

func main() {

    A := 2
    B := A
    fmt.Println(A,B)

    C := &A

    fmt.Println(C)
    fmt.Println(*C)

     *C = 5
     fmt.Println(A)

}

8.7 字符串类型

Go内置了字符串类型,使用string 表示

9.注释

#go 支持两种注释方式,行注释和块注释

行注释: 以// 开头

块注释: 以/* */

10 打印

可以通过打印来调试代码

package main

import "fmt"

func main() {
    var a = 1
    fmt.Println(a)

    a = a + 3
    fmt.Println(a)

}

10.1 输出

package main

import "fmt"

func main(){

   fmt.Println("1. 我叫星星") // 打印并换行
   fmt.Println("2.我叫星星")
   fmt.Print("3. 我叫星星")    //打印
   fmt.Print("4.我叫星星")

   name := "星星"
   fmt.Printf("5.我叫%s", name)   //打印并占位
   fmt.Printf("6.我叫%s",name)
}

#printf 格式化输出

10.2 输入

package main

import "fmt"

func main(){
   var name string
   fmt.Print("请输入你的名字:")
   fmt.Scan(&name) // 接收控制台输入内容赋值给变量name
   // &name => 取name 指针(地址)
   fmt.Println("你输入的内容是:", name)

}
comments powered by Disqus