1. 程式人生 > >Solidity語言學習筆記————15、結構體Struct

Solidity語言學習筆記————15、結構體Struct

自定義結構體

pragma solidity ^0.4.4;

contract Students {

    struct Person {
        uint age;
        uint stuID;
        string name;
    }

}
  • Person就是我們自定義的一個新的結構體型別,結構體裡面可以存放任意型別的值。

怎麼理解結構體:如果我們要描述一個人,需要說明他的姓名、年齡、性別、身高等方面,如果每新增一個人就要寫一遍name=“zhangshan”,age=28。。。太過麻煩,可以把這些描述的各個變數整合為一個結構體,呼叫這個結構體就意味著要新增一個人進去

陣列,對映,結構體也支援自定義的結構體。我們來看一個自定義結構體的例子:

pragma solidity ^0.4.0;

contract SimpleStruct{
  //學生
  struct Student{
    string name;
    int num;
  }

  //班級
  struct Class{
    string clsName;
    //學生的列表
    Student[] students;
    mapping(string=>Student)index;
  }
}

在上面的程式碼中,我們定義了一個簡單的結構體Student,它包含一些基本的資料型別。另外我們還定義了一個稍微複雜一點的結構體Class

,它包含了其它結構體Student,以及陣列,對映等型別。Student[ ] students說明結構體可以看成是一個值型別,用法和uint等型別差不多。

陣列型別的students和對映型別的index的宣告中還使用了結構體。

初始化一個結構體

  • 方法一
pragma solidity ^0.4.4;

contract Students {

    struct Person {
        uint age;
        uint stuID;
        string name;
    }
    #括號內的引數和結構體內的變數一一對應,等同於age=18,stuID=101,name="james"
    Person _person = Person(18,101,"james");
    Person jack=Person(28,102,"jack");

}
  • 方法二
pragma solidity ^0.4.4;

contract Students {

    struct Person {
        uint age;
        uint stuID;
        string name;
    }
    #相比方法一,這一個更清晰但需要多輸入三個變數的名字,輸入順序可以改變,自己取捨
    Person _person = Person({age:18,stuID:101,name:"james"});

}

結構體的可見性:

關於可見性,目前只支援internal,所以結構體只能在合約內部和子合約內使用。包含結構體的函式必須顯性宣告為internal

例子:

pragma solidity ^0.4.0;

contract A{
  struct S{
    string para1;
    int para2;
  }
  //這個函式的引數型別是上面定義的結構體S,因此需要顯性宣告為internal
  function f(S s) internal{
      //...
  }

  function f1(){
    //當前類中使用結構體
    S memory s = S("Test", 10);
    f(s);
  }
}

contract B is A{
  function g(){
      //子合約中使用結構體
      S memory s = S("Test", 10);

      //呼叫父類方法
      f(s);
  }
}

在上面的程式碼中,我們聲明瞭f(S s),由於它包含了structS,所以不對外可見,需要標記為internal。你可以在當前類中使用它,如f1()所示,你還可以在子合約中使用函式和結構體,如B合約的g()方法所示。

相關推薦

Solidity語言學習筆記————15結構Struct

自定義結構體pragma solidity ^0.4.4; contract Students { struct Person { uint age; uint stuID; string name; }

Go語言學習筆記(十三)之結構struct

19.面對物件1之struct結構體 Go中面向物件是通過struct來實現,struct是使用者自定義的型別,首先需要定義struct 1: type User struct { 2: Username string 3: Sex string 4: Age int 5: Av

Solidity語言學習筆記————7單位和全域性變數

貨幣單位(Ether Units)wei,finney,szabo或ether可以在Solidity中作為貨幣單位並可以進行相互轉換。沒有單位的數字預設是Wei。單位之間的轉化規則如下:1 ether == 10^3 finney1 ether == 10^6 szabo1

學習筆記1-goland結構(struct)

寫在前面:若有侵權,請發郵件[email protected]告知。 轉載者告知:如果本文被轉載,但凡涉及到侵權相關事宜,轉載者需負責。

C語言(三 字串結構共用輸入輸出)

字串 字串是儲存了一些字元,最後以null(’/0’)結尾的一維字元陣列。 char str[6] = {'h','e','l','l','o','/0'}; char str[ ] = "hello" ; 還有一些字串操作函式: 1、strcpy(s1,s2) 複製s2到s1 2

Go語言學習第八課-結構與包(Go語言的面向物件)

      接下來講解一下Go語言中的面向物件思想程式設計。在Go語言面向物件與其它面嚮物件語言有著很大的差別。首先Go語言的不存在繼承和多型,而且不存在建構函式。並且Go語言不採用class來實現類,而是採用結構體加指標實現。不得不說,這讓類的定義變得很複雜,但是又不失合理

R語言學習筆記(概念公式及R函式)

1、隨機實驗:可在相同2、隨機事件均值u:這個很好理解 R函式:mean中位數:對序列排序後,排在中間的數,需要特別注意的是如果序列為偶數,中位數是中間兩個數平均值.  R函式:median百分位數:也是順序統計量,設百分數為p,n是樣本個數,則p位數指:np為小數,ceil

C語言入門(15)——結構與資料抽象

大多數的計算機運算是對現實世界的模擬,如果想用計算機來模擬現實世界需要用到資料抽象的方法。所謂抽象是從實際的人、物、事和概念中抽取所關心的共同特徵,,忽略非本質的細節,吧這些特徵用各種概念精確的加以描述,從而使這些概念構成某種對現實世界進行描述的模型。下面以數學中的複數為例項

Go語言學習筆記(五)-其他型別(指標結構)

指標 在Go語言中也存在指標,且指標儲存了變數的地址,初始值為nil。定義指標與定義變數相似,不同的是在型別前面指標需要加*例如: var p *int //此處定義了一個int型別的指標 指標也可以通過已有變數獲取,通過&操作符便可,與C

c語言學習筆記.結構.

成員訪問運算符 div 成員 bsp tro truct 年齡 可用 語言學 結構體:   一種用戶自定義的可用的數據類型,它允許您存儲不同類型的數據項。 定義/聲明: struct 類型名{ 成員1; 成員2; ... 成員n; } 變量

C語言學習筆記——結構與共同體

一.資料型別 1.基本資料型別:char、int、short、long、float; 2.指標型別:char*、int*、short*; 3.構造型別:char[ ]、int[ ]、short[ ]; 二.用typedef說明一個新型別 typedef是C語言一

C語言:constkeyword結構

data con post -s 標簽 初始化 weight 什麽 聯系 前幾節內容的解說,主要是內存地址及指針的分析。這一節解說一下easy混淆的keywordconstant及結構體的知識。 一、constkeyword 1. 字符常量的指針 char const

go語言的排序結構排序

sea 封裝 class 讓其 其他 zhang import 過去 blue 原文:https://studygolang.com/articles/1598 晚上準備動手寫點 go 的程序的時候,想起 go 如何排序的問題。排序 sort 是個基本的操作,當然搜索

C語言學習筆記之字符串拼接的2種方法——strcatsprintf

fir str return print 文章 %s rst stdlib.h 字符串拼接 本文為原創文章,轉載請標明出處 1. 使用strcat進行字符串拼接 #include <stdio.h> #include <stdlib.h> #incl

Go語言學習筆記(二) 基本語法變數常量型別

基本語法 Go語言中的標記 Go程式是由各種標記組成的,標記可以是關鍵字,識別符號,常量,字串文字或符號。例如,以下Go語句由六個標記組成: fmt.Println("Hello, World!") 每個標記單獨表示為: fmt . Println ( "Hello, World

Go語言學習筆記(一) 簡介安裝

為什麼選擇Go 程式語言已經非常多,偏效能敏感的編譯型語言有 C、C++、Java、C#、Delphi和Objective-C等,偏快速業務開發的動態解析型語言有PHP、Python、Perl、Ruby、JavaScript和Lua等,面向特定領域的語言有Erlang、R和MATLAB等,

go語言初體驗(流程控制range遍歷函式結構面向物件)

一、流程控制 // main package main import ( "fmt" ) func main() { x := 2 switch x { case 1: fmt.Print("beifeng 1") case 2:

go語言初體驗(流程控制range遍歷函數結構面向對象)

需要 3.3 fmt float compute 捕獲異常 value 地址 異常處理 一、流程控制 // main package main import ( "fmt" ) func main() { x := 2 switch x {

Solidity 語言學習(2)—— Solidity智慧合約檔案結構

版本申明 pragma solidity ^0.4.0; 說明: 1 版本要高於0.4才可以編譯 2 表示高於0.5的版本則不可編譯,第三位的版本號但可以變,留出來用做bug可以修復(如 0.4.1的編譯器有bug,可在0.4.2 修復,現有合約不用該程式碼)。 引用其他

solidity語言學習(8) —— 表示式和控制結構

輸入引數和輸出引數 和JavaScript一樣,solidity的函式也可以使用引數作為輸入;但與JavaScript和C不同的是,函式可能也會返回任意數量的引數作為輸出 輸入引數 輸入引數宣告的方式和變數是一樣的。但是例外的是,不使用的引數可以省略變數名。比如,假設我們想要我們的合