Go语言基础快速上手

1、Go语言关键字

2、Go数据类型

3、特殊的操作

3.1、iota关键字

Go中没有明确意思上的enum(枚举)定义,不过可以借用iota标识符实现一组自增常亮值来实现枚举类型。

sql 复制代码
const (
  a = iota // 0
  b        // 1
  c = 100  // 100
  d        // 100 (与上一行常量值表达式一致)
  e = iota // 4 (恢复iota自增,计数包括c、d)
  f        // 5
)

3.2、数组初始化

sql 复制代码
arr3 := [4]int{5, 3:10} // 可指定索引位置初始化
  fmt.Println(arr3) // [5 0 0 10]
  
arr4 := [...]int{1,2,3} // 编译器按照初始化值数量确定数组长度
  fmt.Println(arr4) // [1 2 3]

3.3、字符串默认不是nil,而是""

3.4、切片

切片(slice)本身不是动态数组或动态指针。只是它内部采用数组存储数据,当数组长度达到数组容量时,会进行动态扩容

大白话就是切片功能和Java中的List集合类似,动态添加数据。不像数组(array)长度是固定的,需要事先知道数据长度。

sql 复制代码
// 方式一
    a := make([]int,5) // 初始化长度为5的slice,默认值为零
    for i := 0; i <5; i++ {
       a = append(a, i)
    }
    a = append(a, 6)
    fmt.Println(a) // [0 0 0 0 0 0 1 2 3 4 6] 


    // 方式二    
    var a []int
    for i := 0; i < 5; i++ {
       a = append(a, i)
    }
    fmt.Println(a) // [0 1 2 3 4]

3.5、map字典

sql 复制代码
// 定义 变量strMap
   var strMap map[int]string
   // 进行初始化
   strMap = make(map[int]string)
   
   // 给map 赋值
   for i := 0; i < 5; i++ {
      strMap[i]  = "迈莫coding"
   }
   
   // 打印出map值
   for k, v := range strMap{
      fmt.Println(k, ":", v)
   }
  
  // 打印出map 长度
  fmt.Println(len(strMap))   

3.6、结构体

sql 复制代码
type user struct {
   name string
   age  int
}

// 结构体user Read方法
func (u *user) Read() string {
   return fmt.Sprintf("%s 已经 %d 岁了", u.name, u.age)
}

func main() {
   // 初始化
   u := &user{
      name: "迈莫coding",
      age:  1,
   }
   fmt.Println(u.name, "已经", u.age, "岁了")
   // 调用结构体user的 Read方法
   fmt.Println(u.Read()) // 迈莫coding 已经 1 岁

4、接口

接口是一组方法的集合

4.1、接口实现

  1. 接口的方法与实现结构的类型方法格式一致
  2. 接口中所有方法均被实现
sql 复制代码
// 定义接口 包含公共方法
type user interface{
  talking()
}

// 定义一个struct类
type memo struct{
}

// 实现接口user中方法talking,非侵入式
func (m *memo) talking() {
  fmt.Println("迈莫coding欢迎您...")
}

func main() {
  mm := memo{}
  mm.talking

4.2、空接口

空接口没有任何办法,任何类型都无需实现空接口,空接口类型可以保存任何值,也可以从空接口中取出原值,在需要使用的地方使用。本身为nil

go 复制代码
type A interface{

}

{
    var a A
    fmt.Printf("%T", a) // nil
    
    a = 3
    a= "hello"
    
    fmt.Printf("%T", a) // String
}

很多函数和方法都借助了空接口,比如打印函数

func Println

Func Println(a ...interface{}) (n int, err error)

4.3、断言

如果我们反向想要知道这个接口变量里面实际存储的是哪个类型的对象,可以使用断言->对类型进行转换来判断类型

go 复制代码
package main
import(
    "fmt"
)
type Animal interface {
    Eat()
    Talk()
}
type Dog struct {

}
func (d *Dog) Eat(){
    fmt.Println("dog eating.....")
}
func (d *Dog) Talk(){
    fmt.Println("dog talking....")
}

type Cat struct {

}
func (c*Cat) Eat(){
    fmt.Println("cat eating.....")
}
func (c *Cat) Talk(){
    fmt.PrintIn("cat talking....")
}
func justify(a Animal){
//进行强制转换,如果转换失败则提示错误
    dog,ok := a.(*Dog)
    if !ok{
        fmt.Println("convert to dog failed")
        return
    }
    dog.Eat()
}

func main() {
// 分别实例化一个Dog和Cat,并通过justify来进行判断
    d := &Dog
    var a Animal
    a=d
    a.Eat()
    justify(a)
    
    c := &Cat{}
    a = c
    justify(a)
}
相关推荐
萧鼎38 分钟前
Python并发编程库:Asyncio的异步编程实战
开发语言·数据库·python·异步
学地理的小胖砸39 分钟前
【一些关于Python的信息和帮助】
开发语言·python
疯一样的码农39 分钟前
Python 继承、多态、封装、抽象
开发语言·python
^velpro^40 分钟前
数据库连接池的创建
java·开发语言·数据库
秋の花1 小时前
【JAVA基础】Java集合基础
java·开发语言·windows
小松学前端1 小时前
第六章 7.0 LinkList
java·开发语言·网络
可峰科技1 小时前
斗破QT编程入门系列之二:认识Qt:编写一个HelloWorld程序(四星斗师)
开发语言·qt
customer081 小时前
【开源免费】基于SpringBoot+Vue.JS周边产品销售网站(JAVA毕业设计)
java·vue.js·spring boot·后端·spring cloud·java-ee·开源
全栈开发圈1 小时前
新书速览|Java网络爬虫精解与实践
java·开发语言·爬虫
面试鸭1 小时前
离谱!买个人信息买到网安公司头上???
java·开发语言·职场和发展