zoukankan      html  css  js  c++  java
  • goweb-go语言基础

    go语言基础

    虽然这本书是讲goweb,但还是吧go语言基础过了一遍,由于我之前已经对go语言基础做了一遍系统的学习,这里就当简单回顾一下,不再写过多笔记了,之前的写的博客都有基础知识,O(∩_∩)O哈哈~

    Go是天生支持UTF-8的,任何字符都可以直接输出,你甚至可以用UTF-8中的任何字符作为标识符。

    Go使用package(和Python的模块类似)来组织代码。main.main()函数(这个函数位于主包)是每一个独立的可运行程序的入口点。Go使用UTF-8字符串和标识符(因为UTF-8的发明者也就是Go的发明者之一),所以它天生支持多语言

    Comma-ok断言

    Go语言里面有一个语法,可以直接判断是否是该类型的变量: value, ok = element.(T),这里value就是变量的值,ok是一个bool类型,element是interface变量,T是断言的类型。

    如果element里面确实存储了T类型的数值,那么ok返回true,否则返回false。

    package main
    
    	import (
    		"fmt"
    		"strconv"
    	)
    
    	type Element interface{}
    	type List [] Element
    
    	type Person struct {
    		name string
    		age int
    	}
    
    	//定义了String方法,实现了fmt.Stringer
    	func (p Person) String() string {
    		return "(name: " + p.name + " - age: "+strconv.Itoa(p.age)+ " years)"
    	}
    
    	func main() {
    		list := make(List, 3)
    		list[0] = 1 // an int
    		list[1] = "Hello" // a string
    		list[2] = Person{"Dennis", 70}
    
    		for index, element := range list {
    			if value, ok := element.(int); ok {
    				fmt.Printf("list[%d] is an int and its value is %d
    ", index, value)
    			} else if value, ok := element.(string); ok {
    				fmt.Printf("list[%d] is a string and its value is %s
    ", index, value)
    			} else if value, ok := element.(Person); ok {
    				fmt.Printf("list[%d] is a Person and its value is %s
    ", index, value)
    			} else {
    				fmt.Printf("list[%d] is of a different type
    ", index)
    			}
    		}
    	}
    

    反射

    Go语言实现了反射,所谓反射就是能检查程序在运行时的状态。我们一般用到的包是reflect包。如何运用reflect包,官方的这篇文章详细的讲解了reflect包的实现原理,laws of reflection

    使用reflect一般分成三步,下面简要的讲解一下:要去反射是一个类型的值(这些值都实现了空interface),首先需要把它转化成reflect对象(reflect.Type或者reflect.Value,根据不同的情况调用不同的函数)。这两种获取方式如下:

    t := reflect.TypeOf(i)    //得到类型的元数据,通过t我们能获取类型定义里面的所有元素
    v := reflect.ValueOf(i)   //得到实际的值,通过v我们获取存储在里面的值,还可以去改变值
    

    转化为reflect对象之后我们就可以进行一些操作了,也就是将reflect对象转化成相应的值,例如

    tag := t.Elem().Field(0).Tag  //获取定义在struct里面的标签
    name := v.Elem().Field(0).String()  //获取存储在第一个字段里面的值
    

    获取反射值能返回相应的类型和数值

    var x float64 = 3.4
    v := reflect.ValueOf(x)
    fmt.Println("type:", v.Type())
    fmt.Println("kind is float64:", v.Kind() == reflect.Float64)
    fmt.Println("value:", v.Float())
    

    最后,反射的话,那么反射的字段必须是可修改的,我们前面学习过传值和传引用,这个里面也是一样的道理。反射的字段必须是可读写的意思是,如果下面这样写,那么会发生错误

    var x float64 = 3.4
    v := reflect.ValueOf(x)
    v.SetFloat(7.1)
    

    如果要修改相应的值,必须这样写

    var x float64 = 3.4
    p := reflect.ValueOf(&x)
    v := p.Elem()
    v.SetFloat(7.1)
    

    上面只是对反射的简单介绍,更深入的理解还需要自己在编程中不断的实践。

    var和const参考2.2Go语言基础里面的变量和常量申明
    package和import已经有过短暂的接触
    func 用于定义函数和方法
    return 用于从函数返回
    defer 用于类似析构函数
    go 用于并发
    select 用于选择不同类型的通讯
    interface 用于定义接口,参考2.6小节
    struct 用于定义抽象数据类型,参考2.5小节
    break、case、continue、for、fallthrough、else、if、switch、goto、default这些参考2.3流程介绍里面
    chan用于channel通讯
    type用于声明自定义类型
    map用于声明map类型数据
    range用于读取slice、map、channel数据
    上面这二十五个关键字记住了,那么Go你也已经差不多学会了。

    总体来说这章写的挺不错的,注释最后涉及到线程和协程时有点懵逼,对这方面接触还是少的原因。

    地址

  • 相关阅读:
    new操作符
    delete和delete[] 的区别
    oracle查看编码以及修改编码
    C++的类型转换符:static_cast、dynamic_cast、reinterpret_cast和const_cast
    error:/usr/bin/ld:skipping incompatible ./libxxxx.so when searching for lxxxx
    shell环境变量以及set,env,export的区别
    malloc/free和new/delete的区别
    form表单提交回调函数
    jQuery ajax 跨域请求
    开博咯
  • 原文地址:https://www.cnblogs.com/ygjzs/p/12189550.html
Copyright © 2011-2022 走看看