青训营笔记

52 阅读7分钟

Go语言基础

go语言的优点

  1. 高性能、高并发
  2. 语法简单、学习曲线平缓
  3. 丰富的标准库完善的工具链
  4. 静态链接
  5. 快速编译
  6. 跨平台
  7. 垃圾回收

字节跳动为什么全面拥抱 Go 语言

  1. 最初使用的 Python,由于性能问题换成了 Go
  2. C++ 不太适合在线 Web 业务
  3. 早期团队非 Java 背景
  4. 性能比较好
  5. 部署简单、学习成本低
  6. 内部 RPC 和 HTTP 框架的推广

包和函数

 package main  //声明本代码所属的包
 import(
 "fmt" //导入fmt(是format的缩写)包,使其可用
 )
 func main(){  // func 关键字用于声明函数声明一个名为main 的函数,fmt 包提供了用于格式化输入和输出的函数。
     fmt.Printin("hello world” ) //在屏幕上打印出“Hello,playground”
 }   //这是 Go 语言唯一允许的大括号放置风格    
 ​

package 关键字声明了代码所属的包,在本例中这个包的名字就是 main。所有用 Go编写的代码都会被组织成各式各样的包,并且每个包都对应一个单独的构想。

main 这一标识符具有特殊意义。当我们运行一个 Go程序的时候,它总是从 main 包的 main 函数开始运行。如果 main 不存在,那么 Go编译器将报告一个错误,因为它无法得知程序应该从何处开始执行。

每次用到被导入包中的某个函数时,我们都需要在函数的名字前面加上包的名字以及一个点号作为前缀。Go 的这一特性可以让用户在阅读代码的时候立即弄清楚各个函数分别来自哪个包。

计算

Go 跟其他编程语言一样,提供了+、-、*、/(取商)、%(取模:取余数)。

 //我的减重程序
 package main
 import "fmt"
 //main 是所有程序的起始函数
 func main(){
 fmt.Print("My weight on the surface of Mars is ")
 fmt.Print(149.0*0.3783)
 fmt.Print(" lbs,and I would be ")
 fmt.Print(41*365/687) 
 fmt.Print("years old.")
 //或者为:fmt,Println("My weight on the surface of Mars is", 149.0*0.3783, "lbs, and I would be",41*365.2425/687,"years old."),

打印出“My weight on the surface of Mars is 56.3667 lbs, and I wouldbe21.79758733624454 years old.”

变量

程序员有时候会把这种没有说明具体含义的字面数字称为魔数

var 变量名类型=表达式

var name string="zhangsan'

在函数内部,可以使用更简略的:方式声明并初始化变量。(短变量)只能用于声明局部变量,不能用于全局变量的声明。

变量必须先声明再赋值

Go 语言变量名由字母、数字、下划线组成,其中首个字符不能为数字。Go 语言中关键字和保留字都不能用作变量名。

 var 变量名称 type
 var name string   //go语言也可以推断变量类型,即可以写成var name="word"
 var age int
 var isOk bool
 // 到达火星需要多长时间?
 package main
 import "fmt"
 func main(){
 const lightSpeed=299792//km/s  //两个新的关键字const和var,它们分别用于声明常量和变量。
 var distance=56000000 // km    //变量必须先声明再赋值 distance=56000000会报错
 fmt.Println(distance/lightSpeed,"seconds")  //打印出186 secends
 distance =401000000
 fmt.Println(distance/lightSpeed,"seconds")  //打印出1337 secends
 }

注意 lightSpeed 常量是不能被修改的,尝试为其赋予新值将导致 Go 编译器报告错误:“无法对 lightSpeed 进行赋值”

注意 变量必须先声明后使用。如果尚未使用 var 关键字对变量进行声明,那么尝试向它赋值将导致 Go 报告错误,例如在前面的代码中执行 speed = 16 就会这样。这一限制有助于发现类似于“想要向 distance 赋值却键入了 distence”这样的问题。

一次声明多个变量

 var distance= 56000000
 var speed=100800
 var (
    distance=56000000
    speed =100800
 )
 ​
 var distance,speed=56000000100800

变量的初始化

Go语言在声明变量的时候,会自动对变量对应的内存区域进行初始化操作。每个变量会被初始化成其类型的默认值,例如: 整型和浮点型变量的默认值为0。 字符串变量的默认值为空字符串。 布尔型变量默认为 false。 切片、函数、指针变量的默认为 nil。

短变量声明

 m1, m2,m3 :=10,20,30

匿名变量

在使用多重赋俏时,如果想要忽略某个值,可以使用匿名变量(anonymous variable)。 匿名变量用一个下划线 表示,例如:

 func getlnfo()(int, string){
 return 10,"张三”
 func main(){
 _,username := getlnfo() //忽略第一个数
 first,_:=getlnfo() //忽略第二个数
 fmt.Println(username)
 fmt.Println(first)
 }

//这个函数 getInfo 返回两个值:10(一个整数)和 "张三"(一个字符串)。函数的返回类型是 (int, string),表示它返回一个整数和一个字符串。

函数的定义没有接收任何参数,直接返回这两个值。

匿名变量不占用命名空间,不会分配内存,所以匿名变量之间不存在重复声明注意事项: 1、函数外的每个语句都必须以关键字开始(var、const、func 等) 2、:不能使用在函数外。 3、 多用于占位,表示忽略值。

常量

 const(
 pi= 3.1415e=2.7182
 )
 const (
 pi= 3.1415
 e=2.7182
 )
 const(
 n1=100
 n2
 n3
 )

常量、变量的命名规则

1、变量名称必须由数字、字母、下划线组成 2、标识符开头不能是数字 3、标识符不能是保留字和关键字。 4、变量的名字是区分大小写的如: age 和 Age 是不同的变量。在实际的运用中,也建议,不要用一个单词大小写区分两个变量。

5、标识符(变量名称)一定要见名思意 :变量名称建议用名词,方法名称建议用动词

6、变量命名一般采用驼峰式,当遇到特有名词(缩写或简称,如 DNS)的时候,特有名词根据是否私有全部大写或小写。

代码风格

1、代码每一行结束后不用写分号(;) 2、运算符左右建议各加一个空格 3、Go 语言程序员推荐使用驼峰式命名:当名字有几个单词组成的时优先使用大小写分隔 4、强制的代码风格:左括号必须紧接着语句不换行,这个特性刚开始会使开发者不习惯,但随着对Go 语言的不断熟悉,就会发现风格统一让大家在阅读代码时把注意力集中到了解决问题上,而不是代码风格上 5、go fmt 主要用于格式化文档,让所有人的代码风格保持一致

随机数字

 //随机数字
 package main
 import (
 "fmt "
 "math/rand"  //rand 包的导入路径为 math/rand
 )
 func main(){
 var num=rand.Intn(10)+1   //Intn生成0~9的伪随机数(它们并非真正随机,只是看上去或多或少像是随机的而已。)   注意 如果我们在写代码的时候忘记对伪随机数执行加一操作,那么程序将返回一个0~9的数字而不是我们想要的1~10 的数字。这是典型的“差一错误”(off-by-one error)的例子,这种错误是典型的计算机编程错误之一。
 fmt.Println(num)
 num =rand.Intn(10)+1
 fmt.Println(num)

通过 Printf函数和格式化变量v,用户可以将值放置到被显示文本的任意位置上。

 fmt.Printf("%-15v $%4v\n""SpaceX"94)
 fmt.Printf("%-15v $%4v\n","Virgin Galactic"100)
 //SpaceX          $ 94
 //Virgin Galactic $ 100

对 Go 来说,true 是唯一的真值,而false 则是唯一的假值。