天パのtech備忘録

プログラミング関係の記事を書いていきます!

Go Path Linux<->Windows

Goを初めてばかりでlinuxのファイル操作アプリを作成したときにwindowsで試した時はエラーが出たのでlinuxwindowsで自由にパス変換ができればいいなと思い、関数を作成してみました。

func ToValidPath(path string) (string, error) {
    fullPath, err := filepath.Abs(path)
    if err != nil {
        return "", err
    }
    list := strings.Split(fullPath, "/")
    if runtime.GOOS == "windows" {
        validPath := filepath.Join(list...)
        return validPath, nil
    } else {
        validPath := "/" + filepath.Join(list...)
        return validPath, nil
    }
}

引数で絶対パス相対パスを入れることで使用OSに対応した絶対パスを返します。

Go json<->map

今回はGoでJSONとmapの相互変換をやっていきます。

JSON -> map

func JsonToMap(jsonstr string) (map[string]interface{}, error) {
    mapping := make(map[string]interface{})
    err := json.Unmarshal([]byte(jsonstr), &mapping)
    if err != nil {
        return mapping, err
    }
    return mapping, nil
}

json.Unmarshal([]byte(jsonstr), &mapping)でstringをbyteにし、メソッド内で作成したmapの中に代入しています。

map -> JSON

func MapToJson(m map[string]interface{}) (string, error) {
    bytes, err := json.Marshal(m)
    if err != nil {
        return "", err
    }
    return string(bytes), nil
}

bytes, err := json.Marshal(m)でmapをbyte型に代入しています。

使ってみる

func main() {
    // json文字列を定義
    s := `{
        "Name": "mike",
        "Age": 2
    }`

    m, _ := JsonToMap(s)
    fmt.Println(m)

    json, _ := MapToJson(m)
    fmt.Println(json)

}

結果

map[Age:2 Name:mike]
{"Age":2,"Name":"mike"}

Go int型

今回はint型全般を紹介していきます。 int型には8種類の型が存在します。コメントに代入できる最小、最大を書いてます。

var (
    i8   int8   = 11 // -128 127
    i16  int16  = 22 // -32768 32767
    i32  int32  = 33 // -2147483648  2147483647
    i64  int64  = 44 // -9223372036854775808 9223372036854775807
    ui8  uint8  = 55 //  0 255 別名byte型
    ui16 uint16 = 66 //  0 65535
    ui32 uint32 = 77 //  0 4294967295
    ui64 uint64 = 88 //  0 18446744073709551615
)

fmt.Println("i8: ", i8)
fmt.Println("i16: ", i16)
fmt.Println("i32: ", i32)
fmt.Println("i64: ", i64)
fmt.Println("ui8: ", ui8)
fmt.Println("ui16: ", ui16)
fmt.Println("ui32: ", ui32)
fmt.Println("ui64: ", ui64)

n := 11
fmt.Printf("type=%T value=%v", n, n)

結果

i8:  11
i16:  22
i32:  33
i64:  44
ui8:  55
ui16:  66
ui32:  77
ui64:  88
type=int value=11

:= を使用して定義して場合はint型になります。:=は整数リテラルといいます。 uint8はbyte型ともいい、バイト処理をする場合なんかに使用します。

html 基本パーツ

今回はhtmlを初めて触ったので基本パーツとかを簡単にまとめて行こうかなと思います。 参考資料はudemyのThe Web Developer Bootcampコースです。

簡単パーツ

h タグ

<h1>h1 tag</h1>
<h2>h2 tag</h2>
<h3>h3 tag</h3>
<h4>h4 tag</h4>
<h5>h5 tag</h5>
<h6>h6 tag</h6>

スクリーンショット 2020-07-11 14.11.23.png

p タグ

<p>p tag</p>

スクリーンショット 2020-07-11 14.13.27.png

a タグ

<a href="URL">リンク先へ</a>

スクリーンショット 2020-07-11 14.15.43.png

img タグ

<img src="画像のURLまたはパス">

ol タグ

<ol>
  <li>HTTP Requests</li>
  <li>IP Address</li>
  <li>Servers</li>
</ol>

スクリーンショット 2020-07-11 14.18.04.png

ul タグ

<ul>
  <li>list 1</li>
  <li>list 2</li>
  <li>list 3</li>
</ul>

スクリーンショット 2020-07-11 14.20.06.png

table タグ

<table border="1">
  <thead>
    <th>Name</th>
    <th>Age</th>
    <th>Breed</th>
  </thead>
  <tbody>
    <tr>
      <td>Rusty</td>
      <td>2</td>
      <td>Mutt</td>
    </tr>
    <tr>
      <td>Wyatt</td>
      <td>13</td>
      <td>Golden</td>
    </tr>
  </tbody>
</table>

スクリーンショット 2020-07-11 14.24.32.png

form タグ編

formタグはログイン画面などで入力した文字などをリクエスト先に送信する際に使用する。 タグにはたくさんの属性があり、属性はkeyとvalueで指定することができる。入力したテキストなどをリクエストで送信する際に属性を指定することでリクエストの内容を変更することができる。

textarea タグ

<form>
  <textarea name="paragraph" rows="8" cols="80"></textarea>
  <button type="submit">go!</button>
</form>

スクリーンショット 2020-07-11 14.31.23.png リクエスト内容:paragraph=abc rowsとcolsでテキストエリアの大きさを調整できる

select タグ

<form>
  <select name="color">
    <option value="red">RED</option>
    <option value="yellow">YELLOW</option>
    <option value="BLUE">blue</option>
  </select>
  <button type="submit">go!</button>
</form>

スクリーンショット 2020-07-11 14.33.51.png リクエスト内容:color=red

radio button タグ

<form>
  <label for="dogs">Dogs:</label>
  <input name="petChoice"id="dogs" type="radio"
   value="DOGS">

  <label for="cats">Cats:</label>
  <input name="petChoice"id="cats" type="radio"
   value="CATS">

  <button type="submit">go!</button>
</form>

スクリーンショット 2020-07-11 14.35.43.png リクエスト内容:petChoice=CATS

input タグ

<form>
  <label for="username">Email:</label>
  <input id="username"type="email" name="username" placeholder="email"
  required>

  <label for="password">password:</label>
  <input id="password"type="password" name="password" placeholder="password"
  required>

  <button type="submit">go!</button>
</form>

スクリーンショット 2020-07-11 14.38.59.png

リクエスト内容:username=test%40gmal.com&password=pass required: 入力しないとフォームでリクエストできない type="email": emailの書式じゃないと認識されない placeholder="email": テキストフィールドに薄く文字が出る : 今はあまり関係ないがあとあと使用する。id="password"とfor="password"で結びつけている。

Go interface 変数編

interfaceとは

interfaceとはなんでも入れられる変数の型です。他にも用途はありますが今回はなんでも入れられる変数として使用する時にどんな感じに使うかまとめて行きます!

定義、代入

package main

import "fmt"

func main() {
    var i interface{} // interface型を定義
    i = 1             // int
    fmt.Println("int: ", i)
    i = 1.1 // float64
    fmt.Println("float64: ", i)
    i = "文字" // string
    fmt.Println("string: ", i)
    i = 0x01 // byte
    fmt.Println("byte: ", i)
}

結果

int:  1
float64:  1.1
string:  文字
byte:  1

型変換

interfaceは全ての型と互換性があるため、全ての型に変換することができます。それをアサーションといいます。やってみましょう!

package main

import "fmt"

func main() {
    var i interface{} = "english"

    str, ok := i.(string)
    fmt.Println("str: ", str, ok)

    float, ok := i.(float64)
    fmt.Println("float: ", float, ok)

    intger, ok := i.(int)
    fmt.Println("int: ", intger, ok)
}

結果

str:  english true
float:  0 false
int:  0 false

型判定

interfaceの型判定はswitch文を使用します。

package main

import "fmt"

func main() {
    var i interface{} = "english"

    switch v := i.(type) {
    case string:
        fmt.Println("string: ", v)
    case int:
        fmt.Println("int: ", v)
    case float64:
        fmt.Println("float64: ", v)
    default:
        fmt.Println("default: ", v)
    }
}

結果

string:  english

今日はここまでとします!

Go クラス 基本

最近go言語を使い始めて、なんとなく書けるようになったのでそろそろクラスみたいな書き方をやっていこうと思い、ここに記しておきます!
とりあえず書いてあとで細かく説明していきます。

package main

import "fmt"

type Human struct {
Age int
Name string
}

func (h Human) getName() string {
return h.Name
}

func (h *Human) Birthday(newAge int) {
h.Age = newAge
}

func main() {
v := Human{Age: 3, Name: "mike"}
fmt.Println(v.getName())
v.Birthday(24)
}

 

クラス定義

type Human struct {
Age int
Name string
}
クラス定義はstructという構造体という概念を使用し定義します。構造体はフィールドをプロパティを持つことができます。
 
メソッド定義
func (h Human) getName() string {
return h.Name
}

func (h *Human) Birthday(newAge int) {
h.Age = newAge
}

クラスに紐ずくメソッドは上記のように定義します。
func (変数名 クラス名) 関数名 リターンする値 {
処理
}
となります。goは関数の中でプロパティの値を変更させる場合にはクラス名の横にを付けます。これはインスタンス変数のアドレスを指しています。アドレス変数の中身を変更することで実際の値を変更することができます。対してプロパティの中身を変更しない場合はは使用しなくて良いです。

 

インスタンス作成

func main() {
v := Human{Age: 3, Name: "mike"} // インスタンス作成
fmt.Println(v.getName())
v.Birthday(24)
}

インスタンス作成は
変数名 := クラス名{プロパティ名: 値, .....}
となります。

 

今回はとりあえずここまでにします。