golang第二天

栏目: Go · 发布时间: 5年前

内容简介:打卡时间: 23:27

测试代码

  • hello.go
package main

import "fmt"

/**
 *该程序目的
 * 学习 go 的复杂数据结构: 数组,指针,结构体,切片,集合
 */
func main() {

    /**
     * 方式: var arrayName [len] type
     * 例: var nums [10] int
     * 声明一个数组和遍历它
     */
    var nums [10]int //声明一个数组
    fmt.Println(len(nums))
    fmt.Println(cap(nums))

    for idx := 0; idx < len(nums); idx++ {
        fmt.Println(nums[idx])
    }

    /**
     * 声明和初始化一起
     */
    var names = []string{"jack", "andy", "lisa"}
    fmt.Println(names)

    /**
     * 指针:保存内存地址的变量
     * &运算符,获取变量的内存地址
     * *运算符,获取内存地址存放的数据
     * 空指针: nil判断
     * %x十六进制格式输出 小写
     * %X十六进制格式输出 大写
     */
    var age int = 20
    fmt.Println("age变量的内存地址:", &age)
    fmt.Printf("age变量的内存地址:%x\n", &age)
    fmt.Printf("age变量的内存地址:%X\n", &age)

    var ageP *int = &age
    fmt.Println(ageP)
    fmt.Println(*ageP)

    var intp *int
    if intp == nil {
        fmt.Println("是空指针")
    } else {
        fmt.Println("非空指针")
    }

    /**
     * 结构体对象的创建
     * 对象的判空?
     * 结构体指针: '.'操作符访问结构体对象的属性
     */
    var jack = Person{"jack", 10}
    var andy = Person{"andy", 20}
    fmt.Println(jack)
    fmt.Println(andy)
    fmt.Println(jack.name)

    var ppoint *Person = &jack
    fmt.Println(ppoint.name)
    ppoint.age = 30
    fmt.Println(jack.age)

    var paul = Person{"paul", 30}
    changePersonName(paul, "newPaul")
    fmt.Println("name:", paul.name) //修改失败, paul
    chagePersonName2(&paul, "PaulJun")
    fmt.Println("name:", paul.name) //修改成功,PaulJun

    /**
     * 切片,类似可以扩容的数组
     * make([]type, length, capacity) , length<=capacity, 否则报错
     * len(), cap()
     * 切片操作:[:],类似python
     * append扩容, copy拷贝元素
     */
    var nums2 []int = make([]int, 10, 20)                                   //长度为10, 容量为20
    fmt.Printf("len=%d, cap=%d, nums2=%v\n", len(nums2), cap(nums2), nums2) //len=10, cap=20, nums2=[0 0 0 0 0 0 0 0 0 0]

    var nums3 = []int{1, 2, 3, 4, 5, 6, 7}
    fmt.Println(len(nums3), cap(nums3), nums3) //7 7 [1 2 3 4 5 6 7]

    var endIndex = len(nums3) - 1
    fmt.Println("endIndex=", endIndex) //6
    fmt.Println(nums3[:endIndex])      //索引为0-5的元素 [1 2 3 4 5 6]
    fmt.Println(nums3[1:4])            //索引1-3的元素,不包含索引为4 [2 3 4]
    fmt.Println(nums3[0:])             //[1 2 3 4 5 6 7]

    var nilNums []int
    if nilNums == nil {
        fmt.Println("空切片")
    }

    var newNums3 = append(nums3, 10) //append生成一个新的切片
    fmt.Println(newNums3)

    var doubleNums3 = make([]int, len(nums3)*2, cap(nums3)*2)
    copy(doubleNums3, nums3)
    fmt.Println(doubleNums3, cap(doubleNums3))

    /**
     * range关键字
     * 用于 for 循环中迭代数组(array)、切片(slice)、通道(channel)、集合(map)或字符串(string)的元素
     */
    var nums4 = []int{10, 20, 30, 40}
    for idx, val := range nums4 {
        fmt.Println(idx, "->", val)
    }

    var info = "hello,go"
    for idx, chr := range info { //第二个是字符Unicode的值
        fmt.Println(idx, "->", chr)
    }

    /**
     * map: key-val
     * 声明: var map[key_type]val_type
     */

    var scores = make(map[string]float32)
    scores["jack"] = 98.5
    scores["andy"] = 78.5

    for k:= range scores {
        fmt.Println(k)
    }

    for k,v := range scores {
        fmt.Println(k, "-", v)
    }

    delete(scores, "jack")  //删除key: jack的键值对
    fmt.Println(scores)

    fmt.Println(factorial(15))

    /**
     *go类型转换
     * type(val)
     */
    var val = 50
    fmt.Printf("%d\n",val)
    fmt.Printf("%f\n", float32(val))            //val转成float32的类型变量

    /**
     * 接口interface
     * new(T) 函数分配内存, 返回一个指向类型为 T,值为 0 的地址的指针
     * make(T) 函数初始化  返回一个类型为 T 的初始值
     */

    var animal Animal
    animal = new(Cat)
    fmt.Println(animal.typeName())
    animal = new(Dog)
    fmt.Println(animal.typeName())

}

/**
 * 结构体声明,类似C语言
 * type struct关键字
 */
type Person struct {
    //声明Person结构体,包含name和age两个属性
    name string
    age  int
}

/**
 * 结构体作为参数是值传递
 */
func changePersonName(person Person, newName string) {
    person.name = newName
}

/**
 *  改变结构体的属性值,函数中须通过指针
 */
func chagePersonName2(personp *Person, newName string) {
    personp.name = newName
}

/**
 * 递归demo
 */
func factorial(num uint64) uint64  {
    if num>1 {
        return num* factorial(num-1)
    }
    return 1
}

/**
 * 声明接口
 */
type Animal interface {
    typeName() string
}

type Cat struct {
    name string
}

/**
 * 实现该方法
 */
func (cat Cat) typeName() string {
    return "Cat"
}

type Dog struct {
    name string
}

func (dog Dog) typeName() string {
    return "Dog"
}
  • 总结
  • 数据,指针,切片,集合,结构体,接口的基本使用

打卡时间: 23:27


以上所述就是小编给大家介绍的《golang第二天》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

从零开始学微信公众号运营推广

从零开始学微信公众号运营推广

叶龙 / 清华大学出版社 / 2017-6-1 / 39.80

本书是丛书的第2本,具体内容如下。 第1章 运营者入门——选择、注册和认证 第2章 变现和赚钱——如何从0到100万 第3章 决定打开率——标题的取名和优化 第4章 决定美观度——图片的选取和优化 第5章 决定停留率——正文的编辑和优化 第6章 决定欣赏率——版式的编辑和优化 第7章 数据的分析——用户内容的精准营销 书中从微信运营入门开始,以商业变......一起来看看 《从零开始学微信公众号运营推广》 这本书的介绍吧!

MD5 加密
MD5 加密

MD5 加密工具

SHA 加密
SHA 加密

SHA 加密工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试