Go基础入门 | 周末学习

324 阅读7分钟

go基础

本文已参与周末学习计划,点击链接查看详情:juejin.cn/post/696572…

go环境安装(windows)

安装地址:golang.google.cn/dl/

傻瓜式安装,安装完应该会自动配置环境变量

安装完检查下环境变量是否配置成功,若没有配置成功则手动配置,基本跟java环境配置相同

go version  // 在cmd窗口下输入该命令会显示当前go版本
hello world

go编辑器 goland 或者vscode

package main    // 定义包 main为包的主程序

import "fmt"    // 导入go标准库fmt

func main() {
   fmt.Println("Hello, World!")
}


go run <filename>.go  // 运行程序命令  使用goland可配置启动配置 点击启动即可

go的语言结构

  • 包声明 package
  • 引入包 import
  • 函数 func main()
  • 变量
  • 语句 & 表达式
  • 注释

go的关键字

breakdefaultfuncinterfaceselect
casedefergomapstruct
chanelsegotopackageswitch
constfallthroughifrangetype
continueforimportreturnvar

go 数据类型

  • 布尔(true or false)
    var b bool = true
    
  • 数字类型 (整形 int 浮点型 float32 float64)
    • 整形
    序号类型和描述
    1uint8 无符号 8 位整型 (0 到 255)
    2uint16 无符号 16 位整型 (0 到 65535)
    3uint32 无符号 32 位整型 (0 到 4294967295)
    4uint64 无符号 64 位整型 (0 到 18446744073709551615)
    5int8 有符号 8 位整型 (-128 到 127)
    6int16 有符号 16 位整型 (-32768 到 32767)
    7int32 有符号 32 位整型 (-2147483648 到 2147483647)
    8int64 有符号 64 位整型 (-9223372036854775808 到 9223372036854775807)
    • 浮点型
    序号类型和描述
    1float32 IEEE-754 32位浮点型数
    2float64 IEEE-754 64位浮点型数
    3complex64 32 位实数和虚数
    4complex128 64 位实数和虚数
    • 其他数字类型
    序号类型和描述
    1byte 类似 uint8
    2rune 类似 int32
    3uint 32 或 64 位
    4int 与 uint 一样大小
    5uintptr 无符号整型,用于存放一个指针
  • 字符串类型

  • 派生类型

    • 指针类型(pointer)
    • 数组类型
    • 结构体(struct)
    • Channel
    • 函数
    • 切换
    • 接口 (interface)
    • Map

go语言变量

变量名定义规则 由字母、数字、下划线组成 ,首字母不能为数字

在go中定义一个变量必须使用,否则会编译报错

在导入包中或者接受函数返回值,若不想使用可以使用 _ 接收 表示被抛弃

// 自己定义类型
// 声明变量一般使用var    若定义声明没有初始化  则变量默认为零值
var a int
// 一次声明多个变量
var a, b int

var a string = '123'
var a, b int = 1, 2




// 根据值自定判断类型
var a = 1
var b = true


// 使用var的简写  :=
// 使用:= 若已经声明过了会产生编译报错  不能重复声明
// 类型由编译器推断
// 只能写在函数中
var a = 1
a := 1 // 会报错


func main() {
  a := 1
}

// 
a := 1
// 相等于
var a int
a = 1


// 这种写法声明多个变量   一般用于声明全局变量
var(
	a int
	b string
)

零值

int  0
bool false
string ""


下面的类型零值都为nil
*int
[]int
map[string] int
chan int
func(string) int
error  // error是接口

值类型和引用类型

  • 值类型 (int float bool string) 存储在栈中 (和js很像)

  • 引用类型

    引用类型存储的是一个内存地址(指针),通过内存地址访问数据

    同一个引用类型的指针可以是在连续的内存中, 也可以分散在内存中

    r2 = r1 引用类型之间的赋值,只是引用地址被赋值

go常量

const a int = 1
const b string = "123"

// 常量可以用作枚举
const (
	Man = 0
	woMan = 1
)
iota 特殊常量 可以被编译器修改的常量
// iota 在新的一行被使用时 值会自动+1
const (
	a = iota  // 0
	b = iota  // 1
	c = iota  // 2
)

// 简写 b c 会自动+1
const (
	a = iota
	b
	c
)

实例

package main

import "fmt"

func main() {
    const (
            a = iota   //0
            b          //1
            c          //2
            d = "ha"   //独立值,iota += 1
            e          //"ha"   iota += 1
            f = 100    //iota +=1
            g          //100  iota +=1
            h = iota   //7,恢复计数
            i          //8
    )
    fmt.Println(a,b,c,d,e,f,g,h,i)
}

运算符

  • 算术运算符
  • 关系运算符
  • 逻辑运算符
  • 位运算符
  • 赋值运算符
  • 其他运算符
  1. 算术运算符
运算符描述
+相加
-相减
*相乘
/相除
%求余
++自增
--自减

2.关系运算符

运算符描述
==检查两个值是否相等,如果相等返回 True 否则返回 False。
!=检查两个值是否不相等,如果不相等返回 True 否则返回 False。
检查左边值是否大于右边值,如果是返回 True 否则返回 False。
<检查左边值是否小于右边值,如果是返回 True 否则返回 False。
>=检查左边值是否大于等于右边值,如果是返回 True 否则返回 False。
<=检查左边值是否小于等于右边值,如果是返回 True 否则返回 False。

3.逻辑运算符

运算符描述
&&逻辑 AND 运算符。 如果两边的操作数都是 True,则条件 True,否则为 False。
||逻辑 OR 运算符。 如果两边的操作数有一个 True,则条件 True,否则为 False。
!逻辑 NOT 运算符。 如果条件为 True,则逻辑 NOT 条件 False,否则为 True。
  1. 位运算 (不会,看不懂)

  2. 赋值运算符

    运算符描述
    =简单的赋值运算符,将一个表达式的值赋给一个左值
    +=相加后再赋值
    -=相减后再赋值
    *=相乘后再赋值
    /=相除后再赋值
    %=求余后再赋值
    <<=左移后赋值
    >>=右移后赋值
    &=按位与后赋值
    ^=按位异或后赋值
    |=按位或后赋值

6.其他运算符

运算符描述实例
&返回变量存储地址&a; 将给出变量的实际地址。
*指针变量。*a; 是一个指针变量
运算符优先级
优先级运算符
5* / % << >> & &^
4+ - | ^
3== != < <= > >=
2&&
1||

go 条件语句

  • if

    var a int  = 10
    if a < 20 {
    	
    }
    
  • if else

    var a int  = 10
    if a < 8 {
    	
    } else {
    	
    }
    
  • switch

    switch 不要要加break 匹配到后自动停止

    如果匹配到后需要执行后面的 可以使用fallthrough

    switch 可以在一个case中匹配多个值

    var a int = 50
    switch a {
      case 90: 
      case 80:
      case 50,60,70:
      default: 
    }
    

    Type switch

    var x interface {}
    switch i := x.(type) {
    	case int: 
    	case nil:
    	case float64:
    	default
    }
    

    fallthrough

    使用 fallthrough 会强制执行后面的 case 语句,fallthrough 不会判断下一条 case 的表达式结果是否为 true。

    func main() {
    
        switch {
        case false:
                fmt.Println("1、case 条件语句为 false")
                fallthrough
        case true:
                fmt.Println("2、case 条件语句为 true")
                fallthrough
        case false:
                fmt.Println("3、case 条件语句为 false")
                fallthrough
        case true:
                fmt.Println("4、case 条件语句为 true")
        case false:
                fmt.Println("5、case 条件语句为 false")
                fallthrough
        default:
                fmt.Println("6、默认 case")
        }
    }
    
  • select

    select 是 Go 中的一个控制结构,类似于用于通信的 switch 语句。每个 case 必须是一个通信操作,要么是发送要么是接收。

    select 随机执行一个可运行的 case。如果没有 case 可运行,它将阻塞,直到有 case 可运行。一个默认的子句应该总是可运行的。

    var c1, c2 chan int
    var i1, i2 int
    
    select {
      case i1 = <-c1:
      	fmt.Printf(i1)
      case c2 <- i2:
      	fmt.Printf(c2)
      default: 
      	fmt.Printf('')
    }
    

go 循环

  • 普通for
func main() {
	sum := 0
	for(i := 0; i<= 10; i++) {
		sum += i
	}
}

// 省略写法
func main() {
	sum := 1
	for ; sum <= 10 {
		sum += sum
	}
}

func main() {
	sum := 1
	for sum <= 10 {
		sum += sum
	}
}

// 无限循环 类似java的for(;;)
func main() {
	sum := 1
	for {
		sum += sum
	}
}
  • for range 可以对字符串 数组 切片等输出

    func main() {
    	strings := []string{"vue", "react"}
    	for i,v := range strings {
    		fmt.Printf(i, v)
    		// i 是索引 v是值
    	}
    }
    

    go循环控制语句

  • break 中断for循环或switch

  • continue 跳出本次循环 进行下一轮循环

  • goto 将控制转移到被标记的语句

go 函数

函数定义形式

func function_name( [parameter list] ) [return_types] {
   函数体
}

func max(num1, num2 int) (int, int) {
	return num1, num2
}
函数传参
  • 值传递 调用函数将参数复制一份到函数中
  • 引用传递 将参数的地址传递到函数中, 改变 参数影响实际参数
// 值传递
func max(num1, num2 int) (int, int) {
	return num1, num2
}
func main() {
	max(1, 2)
}

// 引用传递
func max(x *int, y *int) {
	var a int
	a = *x
	*x = *y
	*y = a
}
func main() {
	var a int = 100
	var b int = 200
	max(a,b)
}

go方法

Go 语言中同时有函数和方法。一个方法就是一个包含了接受者的函数,接受者可以是命名类型或者结构体类型的一个值或者是一个指针。所有给定类型的方法属于该类型的方法集。

定义方法结构

func (variable_name variable_data_type) function_name() [return_type]{
   /* 函数体*/
}
package main

import (
   "fmt"  
)

/* 定义结构体 */
type Circle struct {
  radius float64
}

func main() {
  var c1 Circle
  c1.radius = 10.00
  fmt.Println("圆的面积 = ", c1.getArea())
}

//该 method 属于 Circle 类型对象中的方法
func (c Circle) getArea() float64 {
  //c.radius 即为 Circle 类型对象中的属性
  return 3.14 * c.radius * c.radius
}

数组

声明数组 数组长度固定

var arrayList [10] int    // 声明长度为10的数组

// 初始化
arrList := [10]int{1,2,3,4}   // 初始化一个长度为10的数组

// 不确定长度
arrList := [...]int{}    // 使用...代替长度 编译器自动推断

// 指定索引初始化
arrList := [5]int{1:100, 3:100}  // 将索引为1 和 3的元素初始化

/*
	{} 中的元素个数不能超过指定的长度
*/

// 访问数组元素通过下标访问
arrList[0]