精华内容
下载资源
问答
  • 试着答一答这些问题s[i]和(for _,v range)的v的区别是什么var s string = "AB" fmt.Println(reflect.TypeOf(s[0])) for _, v := range s { fmt.Println(reflect.TypeOf(v)) } a.(),和 a(b) 的区别是什么var v ...

    试着答一答这些问题

    s[i]和(for _,v range)的v的区别是什么

    var s string = "AB"
    fmt.Println(reflect.TypeOf(s[0]))
    for _, v := range s {
       fmt.Println(reflect.TypeOf(v))
    }
    

    a.(),和 a(b) 的区别是什么?

    var v interface{} = 1var s uint8 = 1
    
    temp1 := int(s)
    temp2 := v.(int)
    
    fmt.Println(temp1,temp2)
    

    Go的类型系统了解

    Go的类型

    Go语言是一门静态编译型语言,是一门强类型语言,Go语言中类型分为两种:命名类型(已定义类型)和未命名类型(组合类型),我举例说一下

    1. 命名类型(已定义类型)
    uint8(byte) uint16 uint32 uint64 int int8 int16 int32(rune) int64 bool stringfloat32 float64 complex64 complex128

    上面举例类型归为三大类:,数值类型,字符串类型, 布尔值类型,我们使用type定义的任何类型也被称为命名类型,如下

    //也是命名类型type MyBool bool
    1. 未命名类型 (组合类型)
    slice map chan function interface struct pointer

    上面举例的类型有容器类型,函数类型,指针类型,结构体类型,通道类型,接口类型

    自定义类型和底层类型

    Go允许通过type关键字定义一个类型
    Go的每一个类型都一个底层类型,类型的底层类型有如下规律

    1. 每一个命名类型的底层类型都是自己
    2. 每一个组合类型的底层类型都是自己
    3. 在一个类型的声明中,新声明的类型和原类型的底层类型是共享的

    如下代码,请问这段代码能够编译成功吗?为什么?首先这段代码是编译失败的,i的类型是MyInt,j的类型是int,虽说她们的底层类型都是int,但不能相互赋值,也就说明命名类型间是不能相互赋值的,即便是低限制往高限制赋值,比如 int32 赋给 int64也是编译失败的

    type MyInt intfunc CustomType() {
       var i MyInt = 2
       var j int = 1
       j = i
       i = j
       fmt.Println(i == j)
    }

    下面这段代码会打印这两个变量的基本类型和底层类型,

    //输出MyInt int
    fmt.Println(reflect.TypeOf(i), reflect.TypeOf(j))
    //输出int int
    fmt.Println(reflect.TypeOf(i).Kind(), reflect.TypeOf(j).Kind())

    我们再来看一个Demo,下面这段代码编译会报错吗,如果把int32改成int64呢?答案是编译报错,改成int64也会编译报错,只有j和int32同时改成i和int64,才会编译成功。因为这时m和n的底层类型是完全相同的。

    type MyM struct {
       i int64
    }
    type MyN struct {
       j int32
    }
    func TestStruct() {
       n := MyN{j: 10}
       var m MyM
       m = MyM(n)
      fmt.Println(n,m)
    }

    如何追踪朔源一个类型的的底层类型

    如下代码,说说这些类型的底层类型是什么?

    type MyInt inttype I MyInt
    type Ints []inttype MyInts []MyInt
    type M map[string]stringtype CustomM M

    MyInt的底层类型是int
    I的底层类型时int
    Ints的底层类型是[]int
    MyInts的底层类型是slice
    M的底层类是map
    CustomM的底层类是map

    规律就是直到找到的一个内置类型(Go内置的类型)或者未命名类型(组合类型)结束,这个类型就是当前类型的底层类型

    怎么通过代码获取一个类型的底层类型呢?通过下面代码获取

    reflect.TypeOf(variable).Kind()

    类型别名

    什么是类型别名呢?Go中有两个类型别名 byte,对应的真实类型是uint8,rune,对应的真实类型是int32,我们可以源代码中这两个的定义如下

    // byte is an alias for uint8 and is equivalent to uint8 in all ways. It is// used, by convention, to distinguish byte values from 8-bit unsigned// integer values.type byte = uint8
    
    // rune is an alias for int32 and is equivalent to int32 in all ways. It is// used, by convention, to distinguish character values from integer values.type rune = int32

    从这个就能就能解决最开始的第一个问题,s[index]取得是字符串转换成字节后的某一个字节,而range指的是循环字符串s的每一个字符(range会隐式的unicode解码), 但字符区分字母和汉字,一个字母占用一个字节,一个汉字可不是了,看如下代码,你可以获取byte和rune的底层类型

    var r rune = 'c'var b byte = 1
    fmt.Println(reflect.TypeOf(r).Kind()) //int32
    fmt.Println(reflect.TypeOf(b).Kind()) //uint8

    如何定义一个类型别名呢?其实很简单,知道怎么定义一个类型,那么定义一个类型别名就很简单了,参考上面的byte和rune,如下我们为int64定义一个别名(从Go1.9开始支持),类型别名是可以被声明在函数体内的

    //相比定义一个类型多了一个=号type alaisInt64 = int64

    类型转换和断言

    类型转换是用来在类型不同但相互兼容的类型之间的相互转换的方式,如果不兼容,则无法相互转换,编译会报错,通常写法是 a(b),把b转换成a

    类型断言是在接口之间进行,本质也是类型转换,写法是a.(b),含义是把a转换成b

    如下代码,做一些错误的和正确的示范

    //这个转换时类型不同,也不兼容,所以编译报错
    s := "ab"
    i := int(s)
    
    //这个转换类型不同,但兼容,所以OKvar j int8 = 1
    m := int(j)
    
    //这个转换是失败的,系统会检测到类型不匹配,直接panicvar k interface{} = "s"
    l := k.(int)
    //但我们可以通过一个参数来判断,只有f为true时,才会转换成功
    l,f := k.(int)
    //这个转换是成功的
    p,f := k.(string)

    类型转换的实践,勤加练习才能理解

    数字类型之间转换

    从低位转高位没有什么问题,从高位转低位时(会丢失精度),int64转int8,这个转换的过程如下:
    128的二进制:.........00000000_10000000
    因为是从int64转int8,所以截取128的后八位 :10000000
    此时最高位是1,表示这是一个负数,此时结果是就是:-128

    //这个转换没有任何问题,都OKvar i int8 = 123var j int16 = int16(i)
    //这个转换会丢失精度,从高位转低位var m int64 = 128var n int8 = int8(m) //n的结果是-128,因为int8能表达的最大值是127,最小值是-128,

    字符串,字节,数字,字符互相转换

    var s1,s2 string = "AbcD","1234"//转字节
    bs1 := []byte(s1); bs2 := []byte(s2)
    
    //字节数组转字符串
    s11 := string(bs1); s22 := string(bs2)
    //单个字节转字符串
    ss := string(bs1[0])
    fmt.Println(s11, s22, ss)
    
    //s2转数字 ,err 表示是否能转换成功,比如s1就会转换失败
    i, err := strconv.Atoi(s2)
    //数字转字符串
    s := strconv.Itoa(i)
    
    //字符串转字符数组
    runes := []rune(s1)
    
    //字符数组转字符串
    ss1 := string(runes)
    //单个字符转字符串
    ss2 := strconv.QuoteRune(runes[0])
    
    //字符转字节
    bss := make([]byte, 0)
    bss = strconv.AppendQuoteRune(bss, runes[0])
    fmt.Println(err, s, ss1, ss2, runes[0], bss, string(bss))
    //除开rune和byte底层的类型的区别,在使用上,//rune能处理一切的字符,而byte仅仅局限在ascii
    
    //整形转字节
    x := int32(68)
    bytesBuffer := bytes.NewBuffer([]byte{})
    binary.Write(bytesBuffer, binary.BigEndian, x)
    //字节转整形var y int32
    binary.Read(bytesBuffer, binary.BigEndian, &y)

    接口到具体类型的转换

    //由接口类型转换为具体的类型var i interface{} = 1
    t, f := i.(int)
    if f { //转换成功
       fmt.Println(t)
    } else {//转换失败
       fmt.Println(reflect.TypeOf(i).Kind(), reflect.TypeOf(i))
    }

    关注公众号,阅读更多精彩文章

    7ba83821a7eec28adac0812589de5f37.png
    展开全文
  • 相同点 都是对字符串的操作 区别 string类型的修改是修改指针指向的位置 ...[]byte是直接在内存空间上改变值 string转换成[]byte类型 []byte(string) 什么时候用string什么时候用[]byte string可以直接比较,[]byte...

    相同点

    都是对字符串的操作

    区别

    string类型的修改是修改指针指向的位置

    var  s string
    s = "a"
    s = "b"
    

    实际上是新建了两块内存空间,改变string值的时候就是改变指针位置

    []byte是直接在内存空间上改变值

    string转换成[]byte类型

    []byte(string)

    什么时候用string什么时候用[]byte

    • string可以直接比较,[]byte不行,[]byte不能当map的key值
    • 需要操作的粒度为字符串的某个字符时候,用[]byte
    • string不可为nil值
    • []byte的切片特性更加灵活
    • 如果有大量的字符串操作,就用[]byte
    展开全文
  • var c1 byte = ‘a’ var c2 byte = '中' var c3 byte = '9' 2、 Go 中允许使用转译字符 '\' 来将其后的字符转化变为特殊字符型常量. 例如: var c3 char = '\n' 3、Go 语言的字符使用UTF-8 编码 英文字母 1个 ...

    1、字符常量是用单引号‘’括起来的单个字符.
    例如:

    • var c1 byte = ‘a’
    • var c2 byte = '中'
    • var c3 byte = '9'

    2、 Go 中允许使用转译字符 '\' 来将其后的字符转化变为特殊字符型常量.
    例如:

    • var c3 char = '\n'

    3、Go 语言的字符使用UTF-8 编码

    • 英文字母 1个 字节, 汉子 3个 字节

    4、在Go 中,字符的本质是一个整数,直接输时,是该字符对应的UTF-8编码的码值

    func main(){
    	var c1 byte = 'a'
    	var c2 byte = '0'
    	// byte 就是输出了对应的字符的码值
    	fmt.Println(c1)
    	fmt.Println(c2)	
    }
    运行结果:
    97
    48
    

    5、可以直接给某个变量赋一个数字,然后按格式化输出时 %c, 会输出该数字对应的unicode字符

    func main(){
    
    	var c3 int = '北'
    	fmt.Printf("c3 = %c \n", c3)
    
    	var c4 int = 22269
    	fmt.Printf("c4 = %c \n", c4)
    }
    运行结果:
    c3 = 北 
    c4 =

    6、字符类型是可以进行运算的,相当于一个整数,因为它都对应有Unicode码

    package main
    
    import "fmt"
    
    func main(){
    
    	// 字符类型是可以直接运算的,相当于一个整数,运算时是按照码值运算
    	var n1 = 10 + 'a'  // a的 Unicode编码是: 97
    	fmt.Println("n1 = ", n1) 
    }
    
    运行结果:
    n1 =  107
    


    • 周六,天晴☀️ 今日祝福: 希望CSDN 抽奖能给我一个杯子 !
    • 欢迎访问我的个人网站:https://www.wangwanghub.com
    展开全文
  • // 10 + 20 值为int类型,却能赋值给 byte byte var = 10; final byte constant = 10; byte var1 = var + 20; // 存在变量,编译报错 byte var2 = constant+ 20; // 编译通过 int var = 10; final int const...

    问题来源

    byte var = 10 + 20; // 10 + 20 值为int类型,却能赋值给 byte  
    
    byte var = 10;
    final  byte constant = 10;
    byte var1 = var + 20;  // 存在变量,编译报错
    byte var2 = constant+ 20; // 编译通过
    
    int var = 10;
    final int constant = 10;
    byte var1 = var + 20;  // 存在变量,编译报错
    byte var2 = constant+ 20; // 编译通过
    

    问题描述

    某些场景下,取值范围大的数据类型(int)可以直接赋值给取值范围小的(byte、shor、char)。

    问题答案

    • 常量优化机制
      • 先判断值是否是常量, 然后再看值是否在该数据类型的取值范围内.
        final int constant = 126;
        byte var = constant + 2; // 编译出错,128超出byte的取值范围
        
      • 只有byte, short, char 可以使用常量优化机制, 转换成int类型

    拓展

    		short var = 10;
    		var = var + 20; // 编译报错,运算中存在变量
    		var += 20; // 等效于: var = (short) (s + 20); 没有走常量优化机制,而是进行了类型转换
    
    展开全文
  • varchar2(byte)、varchar2(char)、nvarchar2...三种类型到底有什么区别呢? 首先,我们要时刻记清:无论varchar2还是nvarchar2,最多可以存储4000字节。 varchar2(byte): 就是默认的表示方式,比如我们写成:varcha
  • Delphi中set of关键字的含义是什么

    千次阅读 2011-05-23 20:17:00
    集合. 比如:var myset:set of 1..2 就定义了一个集合,它有2个元素 1,2//定义集合类型还可以这样写 var myset:set of byte [1,2]
  • 如题。。。。。。。。求大神指点 下面是我自己编写的几句代码 ... //从数据库获取图片地址 (value是...在赋值的时候报错是什么原因呢?这种问题该如何解决? 哪位大神有解决办法的还望不要吝啬告诉本小白,,,先谢谢啦
  • 转换什么是转换要理解什么是转换,让我们先从声明两个不同类型的变量,然后把一个变量(源)的值赋值给另一个变量(目标)的简单示例开始讲起。在赋值前,源的值必须转换成目标...var2是byte类型的8位有符号整数,初...
  • 2021-02-04

    2021-02-04 19:29:37
    内存操作 内存的使用的小单位一个字节,Byte ...内存中保存的只是一些数字,至于这个数字代表什么意思,我们自己决定的,我们定义了很多的数据类型, 如 Byte;Char;Word;Integer;Array [0..1] of Byte
  • 所以在定义变量时,不需要指定类型,不像java ,javascript在定义变量时不需要区分什么整型,字符型,浮点型等等,javascript在定义变量时就一个var,就是var 去定义任何类型的变量,整数,字符,小数,甚至对象...
  • 11.深入理解切片(slice)

    2021-01-20 06:48:11
    1.什么是数组 Go 语言数组一个固定长度的、容纳同构类型元素的连续序列。因此 Go 数组类型具有两个属性:元素类型和数组长度。但凡这两个属性相同的数组类型是等价的。比如下面变量 a、b、c 对应的数组类型是三个...
  • 在Delphi的早期版本中,Data这个Variant类型的值内部使用的AnsiString来存贮的字节流,但我并不确定Delphi从什么时候开始,将其改为了Byte数组类型,你可以通过VarType函数来检测它的类型。 1、将数据集的Data...
  • 引用数据类型是由引用变量(refvar)和指向的实际对象两部分组成的。 引用变量基本数据类型,存放的引用指向实际对象的内存地址,实际对象存放在堆中。 这也解释了为什么说Java方法的参数传递只有值传递了,因为...
  • http protocol

    2016-04-07 17:23:10
    数据的表示形式 数据的存储形式 数据的传输形式 数据的解析方法 var p = 1 和 var p = "1...这被解析成int类型,但是接收到0x01这个字节时,直接把这个字节放到4byte的内存区解析。 var p = "1":传输的body
  • .net下的span和memory

    2018-06-17 17:54:00
    .net core 2.1的重头戏就是性能,其中最...什么是 Span<T> Span<T> 新一种新值类型。它表示一段连续的区域,它通常和数组关联,表示数组中的一部分内存。 vararr=newbyte[10];Span<byte>byte...
  • https://www.cnblogs.com/iyangyuan/archive/2013/12/25/3491215.html对应该类型,在oracle中...那么这三种类型到底有什么区别呢?首先,我们要时刻记清:无论varchar2还是nvarchar2,最大字节数都4000。varcha...
  • 其实我们会很惊奇的发现,基本数据类型...下面我们看看我们的八种数据类型的默认值是什么样的。package objectandclass;import java.awt.SecondaryLoop;public class VarText { //整形变量 byte b; short s; int i;
  • oracle数据库中varchar2陷阱 oracle数据库相信大家都比较熟悉,数据库中有一种非常常用的数据类型:字符串型。 对应该类型,在oracle中有三种比较常用的类型:varchar2... 首先,我们要时刻记清:无论是varcha...
  • 老王讲二进制 & 0xFF;

    千次阅读 2018-01-05 11:25:10
    $a = 2; $b = ($a) & 0xFF; var_dump($b);die; 代码如上 最后结果 128 。  ...$a 二进制 左移6 位 相当于 $a * 2^6 (2的6次方)。...因为前边的位移运算二进制算法,计算结果一个二进制数据,byte类型
  • 小知识总结

    2020-08-11 18:48:22
    什么是伴生对象(static不符合面向对象原则 那就在底层设计成为单例模式 有伴生类和伴生对象所属类[有$符号的],伴生对象在伴生对象所属类中) var val(默认) ,printf ,保持字符串原样输出 插值变量${} 字符串输出...
  • 主要优点是什么? 特征 统一 图形用户界面 尺寸 8字节(13作为字符串) 16字节(字符串为36) 分区 内建 否,可以添加外部 碰撞 10B ID中的0.00000001% 2.7e18 ID中有50% 投 隐式(字符串,乌龙,长) 明确...
  • 5.11 在程序中加入注释的最好方法是什么? 5.12 #include和#include“file”有什么不同? 5.13 你能指定在编译时包含哪一个头文件吗? 5.14 包含文件可以嵌套吗? 5.15 包含文件最多可以嵌套几层? 5.16...
  • //An 8-byte IEEE real value is stored in dblVal. var.dblVal = -4;//初始值 var2.vt = VT_R8; var2.dblVal = 15;//初始值 HRESULT rtmp; rtmp = pItest->fun(1, &varRes, var, var2); if(!(FAILED(rtmp)))...
  • C语言编程要点

    2017-09-18 00:10:37
    1.14 取模运算符(modulus operator)“%”的作用是什么? 17 第2章 变量和数据存储 18 2.1. 变量存储在内存(memory)中的什么地方? 18 2.2. 变量必须初始化吗? 19 2.3. 什么是页抖动(pagethrashing)? 19 2.4. 什么是...
  • 前面解析Excel好像都没什么问题,类的源码信息存到了classSource里,尝试过输出到txt里面看过,所输出的类结构没有问题。 问题出在后面的编译代码和获取编译后的程序集,unity报错“NullReferenceException: ...

空空如也

空空如也

1 2 3
收藏数 41
精华内容 16
关键字:

varbyte是什么类型