golang第二天

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

内容简介:打卡时间: 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第二天》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

Beginning Apache Struts

Beginning Apache Struts

Arnold Doray / Apress / 2006-02-20 / USD 44.99

Beginning Apache Struts will provide you a working knowledge of Apache Struts 1.2. This book is ideal for you Java programmers who have some JSP familiarity, but little or no prior experience with Ser......一起来看看 《Beginning Apache Struts》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具