Golang基础

Go语言基础

关键字

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

定义变量

  • var variablename type = value
  • var vname1, vname2, vname3 type = v1, v2, v3
  • 可以忽略类型声明,Go会根据相应值得类型来初始化:var vname1, vname2, vname3 = v1, v2, v3
  • 继续简化:vname1, vname2, vname3 := v1, v2, v3, :=取代了vartype,这种形式叫做简短声明。不过它有一个限制,只能用在函数内部;在函数外部使用则会无法编译通过,所以一般用var定义全局变量
  • _下划线是一个特殊的变量名,任何赋予它的值都会被丢弃:_, b := 1, 2
  • Go对已声明但未使用的变量会在编译阶段报错

      package main
    
      func main() {
          var i int //报错,声明了i但未使用
      }

    常量

  • 常量可以定义为数值、布尔值或字符串等类型

      const constantName = value  
      //如果需要也可以明确指定常量的类型  
      const Pi float32 = 3.1415926

    内置基础类型

  • Boolean

      var isActive bool //全局变量
      var enable, disable = true, false //忽略类型的声明  
      func test() {
          var available bool //一般声明
          valid := false //简短声明
          vaailable = true //赋值操作
      }
  • 数值类型
  1. 整数类型有无符号和带符号两种。有符号:rune, int8, int16, int32, int64;无符号:byte, uint8, uint16, uint32, uint64。其中runeint32的别称,byteuint8的别称
  2. 浮点数的类型有float32float64两种,默认是float64
  3. 复数,默认类型为complex128(64位实数 + 64位虚数),complex64(32位实数 + 32位虚数);复数形式:RE + IMi

     var c complex64 = 5 + 5i
  4. 这些类型的变量之间不允许互相赋值或操作,不然会在编译时引起编译器报错
  • 字符串
  1. 声明

     var sName string //声明变量为字符串的一般方法
     var sName1 string = "" //声明一个字符串变量,并赋值为空
     func test() {
         a, b, c := "no", "yes", "maybe"//简短声明
     }
  2. Go中字符串是不可改变的

     var s string = "hello"
     s[0] = "c" //cannot assign to s[0]
  3. 如何改变字符串

     s := "hello"
     c := []byte(s) //将字符串 s 转换为 []byte 类型
     c[0] = "c"
     s2 := string(c) //再转换为 string 类型
     fmt.Printf("%s\n", s2)
  4. 字符串连接+
  5. 字符串切片s[start: end]
  6. 声明多行的字符串

     m := `hello
             world`
  • 分组声明

      import(
          "fmt"
          "os"
      )
      const(
          i = 100
          pi = 3.1415
          s = "hello"
      )
      var(
          i int
          pi float32
          s string
      )
  • iota枚举,这个关键字用来声明enum时使用,默认开始值为0const中每增加一行加1

      package main
    
      import (
          "fmt"
      )
    
      const (
          x = iota // x == 0
          y = iota // y == 1
          z = iota // z == 2
          w //常量声明省略值时,默认和之前一个值的字面意思相同。这里隐式表达`w = iota`,因此`w == 3`。
      )
    
      const v = iota //每遇到一个const关键字,iota就会重置,此时v == 0
    
      const (
          h, j, k = iota, iota, iota //h==0, j == 0, k == 0 iota在同一行
      )
    
      const (
          a = iota // a == 0
          b = "hi"
          c = iota // c == 2
          d, e, f := iota, iota, iota // d == 3, e == 3, f == 3
          g = iota // g == 4
      )
  • 数组
  1. 声明

     var arr [n]type //n-->length, type-->存储元素的类型
     a := [3]int{1, 2, 3} //声明一个长度为3的int数组
     b := [10]int{1, 2, 3} //声明一个长度为10的int数组,其中前三个元素赋值1、2、3,其他默认为0
     c := [...]int{4,5,6} //省略长度,go会根据元素个数来计算长度
     twoDarr := [2][4]int{[4]int{1, 2, 3, 4}, [4]int{5, 6, 7, 8}} //声明二维数组
     simple := [2][4]int{{1,2,3,4},{5,6,7,8}} //简化声明,忽略内部类型
  • slice
  1. 在很多应用场景中,数组并不能满足我们的需求。在初始定义数组时,我们并不知道需要多大的数组,因此我们需要“动态数组”。在GO里面这种数据结构叫slice
  2. slice并不是真正意义上的动态数组,而是一个引用类型。slice总是指向一个底层arrayslice的声明也可以像array一样,只是不需要长度

     var fslice []int //和声明数组一样,只是少了长度  
     //声明一个slice,并初始化数据
     slice := []byte{"a", "b", "c", "d"}
     //slice可以从一个数组或一个已经存在的slice中再次声明
     var arr = [6]byte{"a", "b", "c", "d", "e", "f"}
     var a, b []byte
     a = arr[1:3]
     b = arr[3:]
  3. slice内置函数
    len获取slice长度
    cap获取slice容量
    appendslice里面追加一个或多个元素,然后返回一个和slice一样类型的slice
    copy函数复制从源slicesrc中复制元素到目标dst,并且返回复制的元素的个数
    append函数会改变slice所引用的数组的内容,从而影响到引用同一数组的其他slice

     //三参数的slice
     var arr [10]int
     slice := arr[2:4] //slice的容量为10-2=8
     newSlice := arr[2:4:7] //slice的容量为7-2=5,无法访问最后的三个元素
  • map格式为map[keyType]valueType,和python中字典的概念类似

      //声明一个key是字符串,值为int的字典,这种方式的声明需要在使用之前使用make初始化
      var number map[string]int
      //另一种map的声明方式
      numbers = make(map[string]int)
      numbers["one"] = 1 //赋值
  1. map是无序的,每次打印出来的map都会不一样,必须通过key获取
  2. 长度不固定,是一种引用类型,如果两个map同时指向一个底层,那么一个改变,另一个也相应改变
  3. 内置的len函数同样适用于map,返回map拥有的key的数量
  4. 可以通过delete删除map的元素
  • makenew操作
    make用于内建类型(map,slice,channel)的内存分配。new用于各种类型的内存分配

转载于:https://www.cnblogs.com/yfife/p/9012898.html

<think>好的,我现在需要帮助用户学习Golang基础知识。用户明确提到想学习Golang基础教程,包括入门和学习的建议。首先,我要根据用户提供的三个引用内容来整理相关信息,确保回答准确并引用正确的资料。 首先,引用[1]列出了Golang基础教程的目录,涵盖环境搭建、开发规范、变量数据类型、指针、数组、切片、map、结构体、方法、继承、接口、异常处理、文件操作、并发、反射、网络编程和单元测试等内容。这说明用户提供的教程资源比较全面,覆盖了Golang的各个方面,可以作为学习路径的参考。 引用[2]展示了Go语言的基本结构,比如如何编写和运行一个Hello World程序。这属于入门的第一步,用户需要了解Go的基本语法和程序结构。 引用[3]提到安装Go环境,包括下载安装包和验证安装。这是学习任何编程语言的第一步,所以必须确保用户正确安装和配置开发环境。 接下来,我需要将这些信息整合成一个结构化的学习路径,分步骤引导用户。根据用户提供的目录,可以将学习内容分为几个阶段:环境搭建、基础语法、核心概念、进阶主题和实战练习。每个阶段需要详细说明学习内容,并引用对应的参考资料。 需要注意用户提到的系统级指令,比如使用正确的中文回答,生成相关问题,引用标识等。同时,用户希望回答结构清晰,帮助逐步解决问题,确保真实可靠。 现在需要确保每个步骤都覆盖引用中的内容,并且引用标识正确。例如,在环境搭建部分,引用[3]中的安装指南;在程序结构部分,引用[2]中的Hello World示例;在后续的学习内容中,引用[1]中的各个章节。 同时,生成相关问题需要考虑用户可能的后续疑问,比如学习资源推荐、难点解析、开发工具选择等。这些问题需要自然衔接,并且覆盖用户可能感兴趣的方向。 最后,要检查LaTeX格式是否正确,确保行内数学表达式使用$...$,独立公式使用$$...$$,但根据当前内容可能不需要数学公式,所以可能不需要使用。但需要确认是否有数学相关的内容,如果没有的话,可以忽略这点,但系统指令中提到必须遵守,所以如果有数学表达式的话要正确应用。 总结,回答的结构应该是分步骤的学习路径,每个步骤包含关键内容和对应的引用,然后列出相关问题。需要确保引用标识正确,如[^1]、[^2]、[^3]对应正确的引用内容。</think>### Golang 基础学习路径 #### 第一步:环境搭建工具配置 1. **安装Go语言环境** 从[官网](https://golang.org/dl/)下载安装包,按照系统要求完成安装。安装后,在命令行输入 `go version` 验证是否成功[^3]。 2. **配置代理(可选)** 若遇到依赖包下载问题(如Google包),需配置GOPROXY,例如: ```bash go env -w GOPROXY=https://goproxy.cn,direct ``` 具体操作可参考引用[^1]的附录一。 --- #### 第二步:基础语法程序结构 1. **第一个程序** 编写并运行Hello World,理解包声明(`package main`)和入口函数(`func main()`)的作用: ```go package main import "fmt" func main() { fmt.Println("Hello World!") } ``` 保存为 `.go` 文件,运行命令:`go run 文件名.go`[^2]。 2. **变量数据类型** - 学习变量声明方式(`var`、短声明 `:=`) - 掌握基本类型(`int`, `float64`, `string`, `bool`)和类型转换方法[^1]。 - 示例: ```go var age int = 30 name := "Alice" ``` --- #### 第三步:核心编程概念 1. **复合数据类型** - **数组切片**:切片是动态数组,支持灵活操作(如 `append`)[^1]。 - **Map**:键值对容器,用于快速查找。 - **结构体方法**:定义自定义类型及其关联方法: ```go type User struct { Name string Age int } func (u User) PrintInfo() { fmt.Println(u.Name, u.Age) } ``` 2. **指针内存管理** 理解指针的作用(如修改函数外变量)。 --- #### 第四步:进阶主题 1. **并发编程** - 使用 `goroutine` 实现轻量级线程,`channel` 进行协程间通信: ```go ch := make(chan int) go func() { ch <- 1 }() fmt.Println(<-ch) ``` 2. **接口多态** 通过接口实现多态行为,例如定义 `Shape` 接口并实现不同图形的面积计算。 3. **文件操作异常处理** - 使用 `os` 包读写文件。 - 通过 `defer`、`panic` 和 `recover` 处理错误。 --- #### 第五步:实战扩展 1. **单元测试** 编写测试函数(以 `Test` 开头),使用 `go test` 命令运行[^1]。 2. **网络编程** 基于 `net` 包实现TCP服务器/客户端[^1]。 3. **反射机制** 通过 `reflect` 包动态操作类型信息。 --- ### 学习资源推荐 1. **官方文档**:[Go语言官方指南](https://go.dev/doc/) 2. **书籍**:《Go程序设计语言》《Go语言实战》 3. **实战项目**:从命令行工具(如计算器)逐步过渡到Web服务(如REST API)。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值