Go part 2

Posted kaichenkai

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go part 2相关的知识,希望对你有一定的参考价值。

关键字、标识符

标识符:

是用户或系统定义的有意义单词组合,或单词与数字组合(具体意义有定义者决定)  

标识符以字母下划线开头,大小写敏感,比如:boy,  Boy,  _boy,  _(特殊标识符,用来忽略结果)

标识符命名规范:在习惯上,Go语言程序员推荐使用驼峰式命名,当名字有几个单词组成的时优先使用大小写分隔,而不是优先用下划线分隔。因此,在标准库有QuoteRuneToASCII和parseRequestLine这样的函数命名,但是一般不会用quote_rune_to_ASCII和parse_request_line这样的命名。而像ASCII和html这样的缩略词则避免使用大小写混合的写法,它们可能被称为htmlEscape、HTMLEscape或escapeHTML,但不会是escapeHtml。

 

关键字:

是 Go 语言提供的有特殊含义的符号,也叫做“保留字”

系统保留关键字:

break default func interface select
case defer go map struct
chan else goto package switch
const fallthough if range type
continue for import return var

 

基本数据类型与操作符

数字类型:int,  int8,  int16,  int32,  int64,  uint8,  uint16, uint32,  uint64

bool 类型:ture,  false

浮点类型:float32,  float64

字符类型:byte

字符串类型:string(使用 "" 或 ``)

 

类型转换

格式:type(variable)

var a  int = 8
var b int32 = int32(a)

 

操作符

数字操作符:+,  -,  *,  /,  %

逻辑运算符:>,  >=,  <,  <=,  ==,  !=

 

字符串操作

拼接:

var str1 string = "hello"
var str2 string = "world"
var str string = str1 + str2

// var str string = fmt.Sprintf("%s%s", str1, str2)
 
获取长度:var length int = len(str)
 
切片:var substr string = str[:5]  (与python类似)

 

常量与变量

常量

常量使用 const 修饰,表示是只读的,不能修改

const 只能修饰 boolean,number(int相关,浮点数,complex)和 string 类型

语法:const identifier [type] = value(type 可省略)

优雅写法:

const(
    name string = "skier"
    age  int = 10
    salary int = 5000 / 2
    // gender boolean = getGender()  // const不能从函数中获取
)

 

变量

声明一个变量:var identifier [type]

// 声明变量并赋值
var a int = 100
// 简写(自动推导类型)
a := 100

优雅写法:

var (
    name string = "johny"
    age int = 10
)

默认值:

  • int        0
  • bool     false
  • string   ""

 

作用域:从定义变量的代码行开始,一直到直接所属的大括号结束为止(全局变量除外)

  • 在函数部声明的变量叫做局部变量,生命周期仅限于函数内部
  • 在函数部声明的变量叫做全局变量,生命周期作用于整个包,如果首字母大写的话,则可以被其它包导入

 

值类型与引用类型

值类型:变量直接储存值,内存通常在中分配,包括 int,  float,  bool,  string 以及数组和 struct(结构体)

引用类型:变量存储的是地址,这个地址存储最终的值,通常在内存上分配,通过 GC 回收,包括 指针,select,map,chan 等

 

函数

函数声明:func 函数名(参数列表)  (返回值列表)  {函数体}

注释:单行 //  多行 /*注释内容*/   快捷键 Ctrl + /

 

go 基本程序结构

// 任何一个代码源文件隶属于一个包
package main

//import 关键字,同一个包内的函数可以直接调用,不同包中的函数通过 包名.函数名 的方式调用
import (
    "fmt"
    "/go_dev/test"
)

// 初始化函数
func init(){
    fmt.Println("执行初始化操作")
}

// main 程序入口
func main(){
    fmt.Println("hello, world~")
}

init 函数

每个源文件都可以包含一个 init 函数,会自动被编译器执行

 

包访问控制规则

  1.  包内函数名首字母大写表示此函数/变量是可导出的
  2. 小写表示此函数/变量是私有的,在包外部不能访问

 

程序执行顺序(栈)  *

  1. 导入其它包,初始化 被导入包 内的全局变量,执行 被导入包 内所有源文件的 init 函数
  2. 初始化 main 包内全局变量
  3. 调用 main 包 init 函数
  4. 执行 main 函数

 

练习1:写一个函数,对于一个整数n,求出所有两两相加等于n的组合,比如 n=5

package main

import (
	"fmt"
)

func calc(n int){
	for i:=0; i<=n; i++ {
		num := n - i
		fmt.Printf("%d+%d=%d\n", i, num, n)
	}

}

func main(){
	calc(5)
}

结果:
0+5=5
1+4=5
2+3=5
3+2=5
4+1=5
5+0=5

 

练习2:一个程序包含 add 和 main 两个包,add 包中有两个变量 Name 和 age,在 main 中访问 Name 和 age 变量,打印输出

首先在 go_dev 下新建一个目录 example(go_dev 目录在环境变量 GOPATH 下 src 目录,go编译器根据系统路径会找到 go_dev 目录下的包)

add包下写 add.go

package add

var Name string = "skier"
var age int = 19	

main包下写 main.go

package main

import ( "go_dev/example/add"
     // a "go_dev/example/add" // 包别名的应用 "fmt" ) func main(){ fmt.Println(add.Name) fmt.Println(add.age) // 不能访问 }

 

作业

1.判断101~200之间有多少个素数,并输出打印

2.打印出101~999中所有的水仙花数,所谓水仙花数是指一个三位数,其各位数字的立方和等于该数本身,例如153是一个水仙花数,1*1*1 + 5*5*5 + 3*3*3 = 153

3.对于一个数n,求n的阶乘之和,即:1! + 2! + ... + n!

 

以上是关于Go part 2的主要内容,如果未能解决你的问题,请参考以下文章

Go part 2

你知道的Go切片扩容机制可能是错的

用 Go 构建一个区块链 -- Part 4: 交易

[Go] 通过 17 个简短代码片段,切底弄懂 channel 基础

解决go: go.mod file not found in current directory or any parent directory; see ‘go help modules‘(代码片段

用 Go 构建一个区块链 -- Part 5: 地址