Go部分基础知识简单总结 |青训营笔记

97 阅读4分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第1天

基础知识

在Go语言里,命名为main的包具有特殊的含义。Go语言的编译程序会试图把这种名字的包编译为二进制可执行文件。

所有用Go语言编译的可执行程序都必须有一个名叫main的包。一个可执行程序有且仅有一个main包。

语法

注释, 同Java

1.变量

变量,小驼峰命名

定义变量的语法

 // 关键字 变量名 类型
 var 变量名 type

批定义变量

 var (
         name string
         sex string
     )

变量默认值:

整数,浮点数,0,0.0

字符串,""

布尔型,false

切片,函数,指针变量默认为 nil

短变量声明赋值,推导声明

 name := "aa"
  • 定义的同时初始化
  • 不能提供数据类型
  • 只能在函数内部

和C一样,有地址,可以格式化输出打印地址%p

值交换

 b, a = a, b

匿名变量

匿名变量的特点是一个下画线””,“"本身就是一个特的标识符,被称为空白标识符。它可以像其他标识符那样用变量的声明或赋值(任何类型都可以赋值给它),但任何赋给这个标识符的值都将被抛弃,因此这些值不能在后续的代中使用,也不可以使用这个标识符作为变量对其它变量进行赋值或运算。使用匿名变量时,只需要在变量声明的地方使下画线替换即可。

在编码过程中,可能会遇到没有名称的变量、类型或方法。虽然这不是必须的,但有时候这样做可以极大地增强代码的灵活性,这些变量被统称为匿名变量。

匿名变量不占用内存空间,不会分配内存。匿名变量与匿名变量之间也不会因为多次声明而无法使用。

 func name() (int, int) {
     return 0, 1
 }
 ​
 func main() {
     a, _ := name()
 }

局部变量,和Java一样

全局变量

必须使用var定义

局部变量可以覆盖全局变量

2.常量

const关键字

常量不能用 := 语法声明。

 显式定义
 const 名 type = 值
 ​
 隐式定义
 const 名 = 值
 ​
 多重赋值:
 const a, b, c = 1, false, "str"
 ​
 如果在多重赋值的最后加上类型,即为表示这些变量都为该类型
 const d, e, f int = 1,2.0,5
 ​
 和变量一样,也是可以批量进行声明的。
 const (
     site = "https://qiucode.cn"
     siteName = "秋码记录"
 )
 ​
 如果是批量声明的常量,除了第一个外其它的常量右边的初始化表达式都可以省略,如果省略初始化表达式则表示使用前面常量的初始化表达式,对应的常量类型也是一样的。
 ​
 const (
     a = 1
     b
     c = 2
     d
 )

iota

iota在const:关键字出现时将被重置为0(const内部的第一行之前),const中每新增一行常量声明将使iota计数一次(iota可理解为const语句块中的行索引)。

技术范围为该常量,在批量声明中会计数,其他的都不会计数

 在批量定义中
 const (
     a = iota//0
     b//1
     c//2
     d = "aa" 在d和e中依旧会计数,在f重新启用后使用启用时的值
     e//"aa"
     f = iota//5
     g//6
 )
 ​
 //都是0
 func main() {
 ​
     const a = iota
     const b = iota
     const c = iota
 }
 ​
 //这一组也都是0
 const d, e, f int = iota, iota, iota

字符串

string

拼接和转义与Java相同

对于\b,起初,我在c primer plus中看到,\b解释为退格,代表backspace,退格键,但经过我的测试,其实这个退格键和键盘上的backspace不一样,并不会删除文本,而是移动光标的位置作用。

同时,只能在本行回退光标位置,不会回到上一行

有类似char的类型,为rune

可以复制字符,或者unicode码值

用于与unicode码交互,直接打印的话,值为int32类型

可以使用格式化输出来打印

不可变

 str := "hello"
 fmt.Println(len(str))
 fmt.Printf("%c", str[0])

数据类型转换

只有显式类型转换

vTypeB = TypeB(vTypeA)

小精度转大没问题,大转小精度丢失

不能转bool和 int

浮点不可以转化为string,int可以

运算符

同Java

不能直接输出a++或a--

算数

关系

逻辑

赋值

键盘输入输出

包名

流程控制

func main() {
    1
	if a == 1 && b == 2{

	} else if a != 1 {

	} else {

	} 
    2
    switch默认case自带break
    var score int
	switch score {
	case 90:
		fmt.Println("A")
	case 50, 60, 70:
        fmt.Println("B")
	default:
		fmt.Println("D")
	}
    3
    var score int = 90
	switch score {
	case 90:
		fmt.Println("A")
		fallthrough//强制执行后面的语句
	case 50, 60, 70:
		fmt.Println("b")
		break
	case 80:
		fmt.Println("c")
	default:
		fmt.Println("d")
	}
    /*结果为
  	A
  	b
  	*/
  
    sum := 0
    //初始值;循环条件;变量变化,可以全都不写,即为无限循环
	for i := 1; i <= 10; i++ {
		sum += i
	}
	fmt.Println(sum)
    break
    continue
} 

函数

//方法名,参数列表,返回值类型,可以返回多个
func add(a int, b int) int {
   return a + b
}
func name() (int, int) {
   return 0, 1
}

//可变参数,只能作为最后一个形参出现,且只能有一个
func adds(nums ...int) int {
	sum := 0
	for i := 0; i < len(nums); i++ {
		sum += nums[i]
	}
	return sum
}

值传递和引用传递

值传递:基本数据类型, array, struct